This commit is contained in:
@@ -33,6 +33,23 @@ jobs:
|
|||||||
uv sync --frozen
|
uv sync --frozen
|
||||||
uv sync --group dev
|
uv sync --group dev
|
||||||
|
|
||||||
|
- name: Install Node.js Dependencies
|
||||||
|
run: |
|
||||||
|
npm ci
|
||||||
|
|
||||||
|
- name: Build Frontend
|
||||||
|
run: |
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
- name: Start Frontend Server
|
||||||
|
run: |
|
||||||
|
# Запускаем фронтенд сервер в фоне
|
||||||
|
npm run dev &
|
||||||
|
# Ждем запуска сервера
|
||||||
|
sleep 10
|
||||||
|
# Проверяем что сервер запустился
|
||||||
|
curl -f http://localhost:3000 || exit 1
|
||||||
|
|
||||||
- name: Setup Playwright (use pre-installed browsers)
|
- name: Setup Playwright (use pre-installed browsers)
|
||||||
env:
|
env:
|
||||||
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
|
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
- **Добавлена установка браузеров Playwright в CI/CD**: Добавлен шаг `Install Playwright Browsers` для установки необходимых браузеров в CI/CD окружении
|
- **Добавлена установка браузеров Playwright в CI/CD**: Добавлен шаг `Install Playwright Browsers` для установки необходимых браузеров в CI/CD окружении
|
||||||
- **Улучшена совместимость тестов**: Тесты теперь корректно работают как в локальной среде разработки, так и в CI/CD pipeline
|
- **Улучшена совместимость тестов**: Тесты теперь корректно работают как в локальной среде разработки, так и в CI/CD pipeline
|
||||||
- **Исправлена ошибка pytest с TestModel**: Убран `__init__` конструктор из тестового класса `TestModel` в `test_db_coverage.py`, что устраняет предупреждение pytest о невозможности сбора тестов
|
- **Исправлена ошибка pytest с TestModel**: Убран `__init__` конструктор из тестового класса `TestModel` в `test_db_coverage.py`, что устраняет предупреждение pytest о невозможности сбора тестов
|
||||||
|
- **Добавлена сборка фронтенда в CI/CD**: Добавлены шаги для установки Node.js зависимостей и сборки фронтенда перед запуском E2E тестов
|
||||||
|
- **Исправлены E2E тесты для CI/CD**: Обновлены все Playwright тесты для корректной работы с админ-панелью на порту 3000, которая запускается в CI/CD workflow
|
||||||
|
- **Запуск фронтенд сервера в CI/CD**: Добавлен шаг для запуска фронтенд сервера в фоне перед тестами, что позволяет E2E тестам работать с админ-панелью
|
||||||
|
- **Условная загрузка статических файлов**: Бэкенд теперь корректно обрабатывает отсутствие директории `dist/assets` в CI/CD окружении
|
||||||
|
|
||||||
## [0.9.5] - 2025-08-12
|
## [0.9.5] - 2025-08-12
|
||||||
|
|
||||||
|
|||||||
@@ -19,9 +19,10 @@ async def check_communities_table():
|
|||||||
page = await browser.new_page()
|
page = await browser.new_page()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Открываем админ-панель
|
# В CI/CD фронтенд обслуживается бэкендом на порту 8000
|
||||||
print("🌐 Открываем админ-панель...")
|
frontend_url = "http://localhost:3000"
|
||||||
await page.goto("http://localhost:3000")
|
print(f"🌐 Открываем админ-панель на {frontend_url}...")
|
||||||
|
await page.goto(frontend_url)
|
||||||
await page.wait_for_load_state("networkidle")
|
await page.wait_for_load_state("networkidle")
|
||||||
await page.wait_for_timeout(3000)
|
await page.wait_for_timeout(3000)
|
||||||
|
|
||||||
@@ -31,7 +32,7 @@ async def check_communities_table():
|
|||||||
await page.fill('input[type="email"]', "test_admin@discours.io")
|
await page.fill('input[type="email"]', "test_admin@discours.io")
|
||||||
await page.fill('input[type="password"]', "password123")
|
await page.fill('input[type="password"]', "password123")
|
||||||
await page.click('button[type="submit"]')
|
await page.click('button[type="submit"]')
|
||||||
await page.wait_for_url("http://localhost:3000/admin/**", timeout=10000)
|
await page.wait_for_url(f"{frontend_url}/admin/**", timeout=10000)
|
||||||
|
|
||||||
# Переходим на страницу сообществ
|
# Переходим на страницу сообществ
|
||||||
print("📋 Переходим на страницу сообществ...")
|
print("📋 Переходим на страницу сообществ...")
|
||||||
|
|||||||
@@ -19,6 +19,14 @@
|
|||||||
cannot collect test class 'TestModel' because it has a __init__ constructor
|
cannot collect test class 'TestModel' because it has a __init__ constructor
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 3. E2E тесты не могли запустить фронтенд
|
||||||
|
В CI/CD окружении отсутствовал собранный фронтенд, что приводило к ошибке:
|
||||||
|
```
|
||||||
|
RuntimeError: Directory '/home/act_runner/.cache/act/.../dist/assets' does not exist
|
||||||
|
```
|
||||||
|
|
||||||
|
**Решение**: Добавлен шаг для запуска фронтенд сервера в CI/CD workflow
|
||||||
|
|
||||||
## 🔧 Решения
|
## 🔧 Решения
|
||||||
|
|
||||||
### 1. Playwright Headless режим
|
### 1. Playwright Headless режим
|
||||||
|
|||||||
@@ -104,7 +104,8 @@ class TestCommunityDeleteE2EBrowser:
|
|||||||
frontend_running = False
|
frontend_running = False
|
||||||
|
|
||||||
if not frontend_running:
|
if not frontend_running:
|
||||||
# Запускаем фронтенд сервер в CI/CD среде
|
# В CI/CD фронтенд сервер запускается в workflow
|
||||||
|
# В локальной разработке запускаем фронтенд сервер
|
||||||
print("🔄 Запускаем фронтенд сервер...")
|
print("🔄 Запускаем фронтенд сервер...")
|
||||||
try:
|
try:
|
||||||
frontend_process = subprocess.Popen(
|
frontend_process = subprocess.Popen(
|
||||||
@@ -143,20 +144,6 @@ class TestCommunityDeleteE2EBrowser:
|
|||||||
print("🔄 Продолжаем тест без фронтенда (только API тесты)")
|
print("🔄 Продолжаем тест без фронтенда (только API тесты)")
|
||||||
frontend_process = None
|
frontend_process = None
|
||||||
|
|
||||||
# Ждем запуска фронтенда
|
|
||||||
print("⏳ Ждем запуска фронтенда...")
|
|
||||||
for i in range(60): # Ждем максимум 60 секунд
|
|
||||||
try:
|
|
||||||
response = requests.get("http://localhost:3000", timeout=2)
|
|
||||||
if response.status_code == 200:
|
|
||||||
print("✅ Фронтенд сервер запущен")
|
|
||||||
break
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
await asyncio.sleep(1)
|
|
||||||
else:
|
|
||||||
raise Exception("Фронтенд сервер не запустился за 60 секунд")
|
|
||||||
|
|
||||||
# Запускаем браузер
|
# Запускаем браузер
|
||||||
print("🔄 Запускаем браузер...")
|
print("🔄 Запускаем браузер...")
|
||||||
playwright = await async_playwright().start()
|
playwright = await async_playwright().start()
|
||||||
@@ -252,9 +239,11 @@ class TestCommunityDeleteE2EBrowser:
|
|||||||
print(f"🔍 Будем тестировать удаление сообщества: {test_community_name}")
|
print(f"🔍 Будем тестировать удаление сообщества: {test_community_name}")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# 1. Открываем админ-панель на порту 3000
|
# 1. Открываем админ-панель
|
||||||
print("🌐 Открываем админ-панель...")
|
# В CI/CD фронтенд обслуживается бэкендом на порту 8000
|
||||||
await page.goto("http://localhost:3000")
|
frontend_url = "http://localhost:3000"
|
||||||
|
print(f"🌐 Открываем админ-панель на {frontend_url}...")
|
||||||
|
await page.goto(frontend_url)
|
||||||
|
|
||||||
# Ждем загрузки страницы и JavaScript
|
# Ждем загрузки страницы и JavaScript
|
||||||
await page.wait_for_load_state("networkidle")
|
await page.wait_for_load_state("networkidle")
|
||||||
@@ -279,7 +268,7 @@ class TestCommunityDeleteE2EBrowser:
|
|||||||
await page.click('button[type="submit"]')
|
await page.click('button[type="submit"]')
|
||||||
|
|
||||||
# Ждем успешной авторизации (редирект на главную страницу админки)
|
# Ждем успешной авторизации (редирект на главную страницу админки)
|
||||||
await page.wait_for_url("http://localhost:3000/admin/**", timeout=10000)
|
await page.wait_for_url(f"{frontend_url}/admin/**", timeout=10000)
|
||||||
print("✅ Авторизация успешна")
|
print("✅ Авторизация успешна")
|
||||||
|
|
||||||
# Проверяем что мы действительно в админ-панели
|
# Проверяем что мы действительно в админ-панели
|
||||||
@@ -303,7 +292,7 @@ class TestCommunityDeleteE2EBrowser:
|
|||||||
|
|
||||||
if "/admin/communities" not in current_url:
|
if "/admin/communities" not in current_url:
|
||||||
print("⚠️ Не на странице управления сообществами, переходим...")
|
print("⚠️ Не на странице управления сообществами, переходим...")
|
||||||
await page.goto("http://localhost:3000/admin/communities")
|
await page.goto(f"{frontend_url}/admin/communities")
|
||||||
await page.wait_for_load_state("networkidle")
|
await page.wait_for_load_state("networkidle")
|
||||||
print("✅ Перешли на страницу управления сообществами")
|
print("✅ Перешли на страницу управления сообществами")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user