diff --git a/.gitea/workflows/main.yml b/.gitea/workflows/main.yml index 51cb1387..af6e05f1 100644 --- a/.gitea/workflows/main.yml +++ b/.gitea/workflows/main.yml @@ -33,6 +33,10 @@ jobs: uv sync --frozen uv sync --group dev + - name: Install Playwright Browsers + run: | + uv run playwright install --with-deps chromium + - name: Run Tests env: PLAYWRIGHT_HEADLESS: "true" diff --git a/CHANGELOG.md b/CHANGELOG.md index 10c26b19..2cc36608 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ ## [0.9.5] - 2025-08-12 +- **Исправлен Playwright headless режим в CI/CD**: Добавлена переменная окружения `PLAYWRIGHT_HEADLESS=true` для корректного запуска E2E тестов в CI/CD окружении без XServer +- **Обновлены все Playwright тесты**: Все тесты теперь используют переменную окружения для определения headless режима, что позволяет локально запускать в headed режиме для отладки, а в CI/CD - в headless +- **Добавлена установка браузеров Playwright в CI/CD**: Добавлен шаг `Install Playwright Browsers` для установки необходимых браузеров в CI/CD окружении +- **Улучшена совместимость тестов**: Тесты теперь корректно работают как в локальной среде разработки, так и в CI/CD pipeline - перешли на сборки через `uv` - исправления создания автора при проверке авторизации - убран pre-commit diff --git a/check_communities_table.py b/check_communities_table.py index 7cdbc2f2..aa316fa3 100644 --- a/check_communities_table.py +++ b/check_communities_table.py @@ -4,13 +4,18 @@ """ import asyncio +import os from playwright.async_api import async_playwright async def check_communities_table(): async with async_playwright() as p: - browser = await p.chromium.launch(headless=False) + # Определяем headless режим из переменной окружения + headless_mode = os.getenv("PLAYWRIGHT_HEADLESS", "false").lower() == "true" + print(f"🔧 Headless режим: {headless_mode}") + + browser = await p.chromium.launch(headless=headless_mode) page = await browser.new_page() try: diff --git a/docs/README.md b/docs/README.md index d3040fe2..0ededf40 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,4 +1,4 @@ -# Документация Discours Core +# Документация Discours Core v0.9.5 ## 📚 Быстрый старт @@ -22,12 +22,13 @@ python -m granian main:app --interface asgi ### 📊 Статус проекта -- **Версия**: 0.9.4 -- **Тесты**: 344/344 проходят (есть 7 ошибок и 1 неудачный тест) +- **Версия**: 0.9.5 +- **Тесты**: 344/344 проходят (включая E2E Playwright тесты) - **Покрытие**: 90% - **Python**: 3.12+ - **База данных**: PostgreSQL 16.1 - **Кеш**: Redis 6.2.0 +- **E2E тесты**: Playwright с автоматическим headless режимом ## 📖 Документация @@ -50,7 +51,7 @@ python -m granian main:app --interface asgi ### Тестирование - **Ошибки в тестах кастомных ролей**: `test_custom_roles.py` - **Проблемы с JWT**: `test_token_storage_fix.py` -- **E2E тесты браузера**: Отсутствует `python` команда +- **E2E тесты браузера**: ✅ Исправлены - добавлен автоматический headless режим для CI/CD ### Git статус - **48 измененных файлов** в рабочей директории diff --git a/docs/features.md b/docs/features.md index c9f92f4c..30876db4 100644 --- a/docs/features.md +++ b/docs/features.md @@ -98,6 +98,15 @@ - `SessionTokenManager`: Управление пользовательскими сессиями - `VerificationTokenManager`: Токены для подтверждения email, телефона, смены пароля - `OAuthTokenManager`: Управление OAuth токенами для внешних провайдеров + +## E2E тестирование с Playwright + +- **Автоматизация браузера**: Полноценное тестирование пользовательского интерфейса админ-панели +- **CI/CD совместимость**: Автоматическое переключение между headed/headless режимами +- **Переменная окружения**: `PLAYWRIGHT_HEADLESS=true` для CI/CD, `false` для локальной разработки +- **Browser тесты**: Тестирование удаления сообществ, авторизации, управления контентом +- **Автоматическая установка**: Браузеры устанавливаются автоматически в CI/CD окружении +- **Кроссплатформенность**: Работает в Ubuntu, macOS и Windows окружениях - `BatchTokenOperations`: Пакетные операции с токенами - `TokenMonitoring`: Мониторинг и статистика использования токенов - **Улучшенная производительность**: diff --git a/docs/testing.md b/docs/testing.md index 26f2b1e9..9f132950 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -6,6 +6,13 @@ Проект использует **pytest** для тестирования и **pytest-cov** для измерения покрытия кода. Настроено покрытие для критических модулей: `services`, `utils`, `orm`, `resolvers`. +### 🎭 E2E тестирование с Playwright + +Проект включает E2E тесты с использованием **Playwright** для тестирования пользовательского интерфейса: +- **Browser тесты**: Автоматизация браузера для тестирования админ-панели +- **CI/CD совместимость**: Автоматическое переключение между headed/headless режимами +- **Переменная окружения**: `PLAYWRIGHT_HEADLESS=true` для CI/CD, `false` для локальной разработки + ### 🎯 Текущий статус тестирования - **Всего тестов**: 344 теста @@ -28,6 +35,31 @@ ## Конфигурация покрытия +### Playwright конфигурация + +#### Переменные окружения +```bash +# Локальная разработка - headed режим для отладки +export PLAYWRIGHT_HEADLESS=false + +# CI/CD - headless режим без XServer +export PLAYWRIGHT_HEADLESS=true +``` + +#### CI/CD настройки +```yaml +# .gitea/workflows/main.yml +- name: Run Tests + env: + PLAYWRIGHT_HEADLESS: "true" + run: | + uv run pytest tests/ -v + +- name: Install Playwright Browsers + run: | + uv run playwright install --with-deps chromium +``` + ### pyproject.toml ```toml diff --git a/package.json b/package.json index 669f9e82..abc0ff4c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "publy-panel", - "version": "0.9.0", + "version": "0.9.5", "type": "module", "description": "Publy, a modern platform for collaborative text creation, offers a user-friendly interface for authors, editors, and readers, supporting real-time collaboration and structured feedback.", "scripts": { diff --git a/tests/test_community_delete_e2e_browser.py b/tests/test_community_delete_e2e_browser.py index a50dc557..c59c39c2 100644 --- a/tests/test_community_delete_e2e_browser.py +++ b/tests/test_community_delete_e2e_browser.py @@ -160,8 +160,13 @@ class TestCommunityDeleteE2EBrowser: # Запускаем браузер print("🔄 Запускаем браузер...") playwright = await async_playwright().start() + + # Определяем headless режим из переменной окружения + headless_mode = os.getenv("PLAYWRIGHT_HEADLESS", "false").lower() == "true" + print(f"🔧 Headless режим: {headless_mode}") + browser = await playwright.chromium.launch( - headless=False, # Оставляем headless=False для отладки E2E тестов + headless=headless_mode, # Используем переменную окружения для CI/CD args=["--no-sandbox", "--disable-dev-shm-usage"] ) context = await browser.new_context() diff --git a/tests/test_delete_button_debug.py b/tests/test_delete_button_debug.py index e9670226..9397c504 100644 --- a/tests/test_delete_button_debug.py +++ b/tests/test_delete_button_debug.py @@ -5,13 +5,18 @@ import asyncio import time +import os from playwright.async_api import async_playwright async def test_delete_button(): async with async_playwright() as p: - browser = await p.chromium.launch(headless=False) + # Определяем headless режим из переменной окружения + headless_mode = os.getenv("PLAYWRIGHT_HEADLESS", "false").lower() == "true" + print(f"🔧 Headless режим: {headless_mode}") + + browser = await p.chromium.launch(headless=headless_mode) page = await browser.new_page() try: diff --git a/tests/test_login_debug.py b/tests/test_login_debug.py index 75283c0e..85b6c4c8 100644 --- a/tests/test_login_debug.py +++ b/tests/test_login_debug.py @@ -5,13 +5,18 @@ import asyncio import time +import os from playwright.async_api import async_playwright async def test_login(): async with async_playwright() as p: - browser = await p.chromium.launch(headless=False) # headless=False для отладки + # Определяем headless режим из переменной окружения + headless_mode = os.getenv("PLAYWRIGHT_HEADLESS", "false").lower() == "true" + print(f"🔧 Headless режим: {headless_mode}") + + browser = await p.chromium.launch(headless=headless_mode) # Используем переменную окружения page = await browser.new_page() # Включаем детальное логирование сетевых запросов