headless-tests-ci-fix3
Some checks failed
Deploy on push / deploy (push) Failing after 33s

This commit is contained in:
2025-08-12 14:31:25 +03:00
parent 25c50f38cb
commit 31376b3dac
5 changed files with 43 additions and 24 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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("📋 Переходим на страницу сообществ...")

View File

@@ -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 режим

View File

@@ -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("✅ Перешли на страницу управления сообществами")