diff --git a/.gitea/workflows/main.yml b/.gitea/workflows/main.yml index 74a2ac24..9b790248 100644 --- a/.gitea/workflows/main.yml +++ b/.gitea/workflows/main.yml @@ -33,6 +33,23 @@ jobs: uv sync --frozen 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) env: PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1 diff --git a/CHANGELOG.md b/CHANGELOG.md index c51f6bc1..f7d7ed73 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,10 @@ - **Добавлена установка браузеров Playwright в CI/CD**: Добавлен шаг `Install Playwright Browsers` для установки необходимых браузеров в CI/CD окружении - **Улучшена совместимость тестов**: Тесты теперь корректно работают как в локальной среде разработки, так и в CI/CD pipeline - **Исправлена ошибка 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 diff --git a/check_communities_table.py b/check_communities_table.py index aa316fa3..c86f5c74 100644 --- a/check_communities_table.py +++ b/check_communities_table.py @@ -19,9 +19,10 @@ async def check_communities_table(): page = await browser.new_page() try: - # Открываем админ-панель - print("🌐 Открываем админ-панель...") - await page.goto("http://localhost:3000") + # В CI/CD фронтенд обслуживается бэкендом на порту 8000 + frontend_url = "http://localhost:3000" + print(f"🌐 Открываем админ-панель на {frontend_url}...") + await page.goto(frontend_url) await page.wait_for_load_state("networkidle") 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="password"]', "password123") 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("📋 Переходим на страницу сообществ...") diff --git a/docs/progress/playwright-headless-fix-2025-08-12.md b/docs/progress/playwright-headless-fix-2025-08-12.md index de52e65a..9f712aa5 100644 --- a/docs/progress/playwright-headless-fix-2025-08-12.md +++ b/docs/progress/playwright-headless-fix-2025-08-12.md @@ -19,6 +19,14 @@ 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 режим diff --git a/tests/test_community_delete_e2e_browser.py b/tests/test_community_delete_e2e_browser.py index c59c39c2..6262361c 100644 --- a/tests/test_community_delete_e2e_browser.py +++ b/tests/test_community_delete_e2e_browser.py @@ -104,7 +104,8 @@ class TestCommunityDeleteE2EBrowser: frontend_running = False if not frontend_running: - # Запускаем фронтенд сервер в CI/CD среде + # В CI/CD фронтенд сервер запускается в workflow + # В локальной разработке запускаем фронтенд сервер print("🔄 Запускаем фронтенд сервер...") try: frontend_process = subprocess.Popen( @@ -143,20 +144,6 @@ class TestCommunityDeleteE2EBrowser: print("🔄 Продолжаем тест без фронтенда (только API тесты)") 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("🔄 Запускаем браузер...") playwright = await async_playwright().start() @@ -252,9 +239,11 @@ class TestCommunityDeleteE2EBrowser: print(f"🔍 Будем тестировать удаление сообщества: {test_community_name}") try: - # 1. Открываем админ-панель на порту 3000 - print("🌐 Открываем админ-панель...") - await page.goto("http://localhost:3000") + # 1. Открываем админ-панель + # В CI/CD фронтенд обслуживается бэкендом на порту 8000 + frontend_url = "http://localhost:3000" + print(f"🌐 Открываем админ-панель на {frontend_url}...") + await page.goto(frontend_url) # Ждем загрузки страницы и JavaScript await page.wait_for_load_state("networkidle") @@ -279,7 +268,7 @@ class TestCommunityDeleteE2EBrowser: 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("✅ Авторизация успешна") # Проверяем что мы действительно в админ-панели @@ -303,7 +292,7 @@ class TestCommunityDeleteE2EBrowser: if "/admin/communities" not in current_url: print("⚠️ Не на странице управления сообществами, переходим...") - await page.goto("http://localhost:3000/admin/communities") + await page.goto(f"{frontend_url}/admin/communities") await page.wait_for_load_state("networkidle") print("✅ Перешли на страницу управления сообществами")