ci-tests-frontend-e2e-fix
Some checks failed
Deploy on push / deploy (push) Has been cancelled

This commit is contained in:
2025-08-12 14:45:59 +03:00
parent ba2cbe25d2
commit 81b2ec41fa
8 changed files with 88 additions and 66 deletions

View File

@@ -41,15 +41,6 @@ jobs:
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

@@ -1,5 +1,6 @@
import pytest
PORT = 8000
@pytest.fixture
def oauth_settings() -> dict[str, dict[str, str]]:
@@ -14,7 +15,7 @@ def oauth_settings() -> dict[str, dict[str, str]]:
@pytest.fixture
def frontend_url() -> str:
"""URL фронтенда для тестов"""
return "https://localhost:3000"
return f"https://localhost:{PORT}"
@pytest.fixture(autouse=True)

View File

@@ -1,7 +1,5 @@
"""Тестовые настройки для OAuth"""
FRONTEND_URL = "https://localhost:3000"
OAUTH_CLIENTS = {
"GOOGLE": {"id": "test_google_id", "key": "test_google_secret"},
"GITHUB": {"id": "test_github_id", "key": "test_github_secret"},

View File

@@ -20,7 +20,9 @@ async def check_communities_table():
try:
# В CI/CD фронтенд обслуживается бэкендом на порту 8000
frontend_url = "http://localhost:3000"
# В локальной разработке - на порту 3000
is_ci = os.getenv("PLAYWRIGHT_HEADLESS", "false").lower() == "true"
frontend_url = "http://localhost:8000" if is_ci else "http://localhost:3000"
print(f"🌐 Открываем админ-панель на {frontend_url}...")
await page.goto(frontend_url)
await page.wait_for_load_state("networkidle")

View File

@@ -1,4 +1,6 @@
import pytest
import os
from settings import FRONTEND_URL
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.pool import StaticPool
@@ -486,3 +488,14 @@ def cleanup_test_data(db_session, user_ids=None, community_ids=None):
db_session.query(CommunityAuthor).where(CommunityAuthor.community_id.in_(community_ids)).delete(synchronize_session=False)
db_session.commit()
@pytest.fixture
def frontend_url() -> str:
"""URL фронтенда для тестов"""
# В CI/CD используем порт 8000 (бэкенд), в локальной разработке - порт 3000
is_ci = os.getenv("PLAYWRIGHT_HEADLESS", "false").lower() == "true"
if is_ci:
return "http://localhost:8000"
else:
return FRONTEND_URL

View File

@@ -94,7 +94,7 @@ class TestCommunityDeleteE2EBrowser:
# Проверяем фронтенд
try:
response = requests.get("http://localhost:3000", timeout=2)
response = requests.get("http://localhost:8000", timeout=2)
if response.status_code == 200:
print("✅ Фронтенд сервер уже запущен")
frontend_running = True
@@ -104,8 +104,26 @@ class TestCommunityDeleteE2EBrowser:
frontend_running = False
if not frontend_running:
# В CI/CD фронтенд сервер запускается в workflow
# В локальной разработке запускаем фронтенд сервер
# Проверяем, находимся ли мы в CI/CD окружении
is_ci = os.getenv("PLAYWRIGHT_HEADLESS", "false").lower() == "true"
if is_ci:
print("🔧 CI/CD окружение - фронтенд собран и обслуживается бэкендом")
# В CI/CD фронтенд уже собран и обслуживается бэкендом на порту 8000
try:
response = requests.get("http://localhost:8000/", timeout=2)
if response.status_code == 200:
print("✅ Бэкенд готов обслуживать фронтенд")
frontend_running = True
frontend_process = None
else:
print(f"⚠️ Бэкенд вернул статус {response.status_code}")
frontend_process = None
except Exception as e:
print(f"⚠️ Не удалось проверить бэкенд: {e}")
frontend_process = None
else:
# Локальная разработка - запускаем фронтенд сервер
print("🔄 Запускаем фронтенд сервер...")
try:
frontend_process = subprocess.Popen(
@@ -119,6 +137,7 @@ class TestCommunityDeleteE2EBrowser:
print("⏳ Ждем запуска фронтенда...")
for i in range(15): # Ждем максимум 15 секунд
try:
# В локальной разработке фронтенд работает на порту 3000
response = requests.get("http://localhost:3000", timeout=2)
if response.status_code == 200:
print("✅ Фронтенд сервер запущен")
@@ -223,7 +242,7 @@ class TestCommunityDeleteE2EBrowser:
return user
async def test_community_delete_browser_workflow(self, browser_setup, test_users):
async def test_community_delete_browser_workflow(self, browser_setup, test_users, frontend_url):
"""Полный E2E тест удаления сообщества через браузер"""
page = browser_setup["page"]
@@ -240,8 +259,6 @@ class TestCommunityDeleteE2EBrowser:
try:
# 1. Открываем админ-панель
# В CI/CD фронтенд обслуживается бэкендом на порту 8000
frontend_url = "http://localhost:3000"
print(f"🌐 Открываем админ-панель на {frontend_url}...")
await page.goto(frontend_url)
@@ -591,7 +608,7 @@ class TestCommunityDeleteE2EBrowser:
raise
async def test_community_delete_without_permissions_browser(self, browser_setup, test_community_for_browser):
async def test_community_delete_without_permissions_browser(self, browser_setup, test_community_for_browser, frontend_url):
"""Тест попытки удаления без прав через браузер"""
page = browser_setup["page"]
@@ -599,7 +616,7 @@ class TestCommunityDeleteE2EBrowser:
try:
# 1. Открываем админ-панель
print("🔄 Открываем админ-панель...")
await page.goto("http://localhost:3000/admin")
await page.goto(f"{frontend_url}/admin")
await page.wait_for_load_state("networkidle")
# 2. Авторизуемся как обычный пользователь (без прав admin)
@@ -675,7 +692,7 @@ class TestCommunityDeleteE2EBrowser:
print(f"❌ Ошибка в E2E тесте прав доступа: {e}")
raise
async def test_community_delete_ui_validation(self, browser_setup, test_community_for_browser, admin_user_for_browser):
async def test_community_delete_ui_validation(self, browser_setup, test_community_for_browser, admin_user_for_browser, frontend_url):
"""Тест UI валидации при удалении сообщества"""
page = browser_setup["page"]
@@ -683,7 +700,7 @@ class TestCommunityDeleteE2EBrowser:
try:
# 1. Авторизуемся как админ
print("🔐 Авторизуемся как админ...")
await page.goto("http://localhost:3000/admin")
await page.goto(f"{frontend_url}/admin")
await page.wait_for_load_state("networkidle")
import os

View File

@@ -10,7 +10,7 @@ import os
from playwright.async_api import async_playwright
async def test_delete_button():
async def test_delete_button(frontend_url):
async with async_playwright() as p:
# Определяем headless режим из переменной окружения
headless_mode = os.getenv("PLAYWRIGHT_HEADLESS", "false").lower() == "true"
@@ -20,8 +20,8 @@ async def test_delete_button():
page = await browser.new_page()
try:
print("🌐 Открываем админ-панель...")
await page.goto("http://localhost:3000/login")
print(f"🌐 Открываем админ-панель на {frontend_url}...")
await page.goto(f"{frontend_url}/login")
await page.wait_for_load_state("networkidle")
print("🔐 Авторизуемся...")
@@ -30,11 +30,11 @@ async def test_delete_button():
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("📋 Переходим на страницу сообществ...")
await page.goto("http://localhost:3000/admin/communities")
await page.goto(f"{frontend_url}/admin/communities")
await page.wait_for_load_state("networkidle")
print("🔍 Ищем таблицу сообществ...")

View File

@@ -10,7 +10,7 @@ import os
from playwright.async_api import async_playwright
async def test_login():
async def test_login(frontend_url):
async with async_playwright() as p:
# Определяем headless режим из переменной окружения
headless_mode = os.getenv("PLAYWRIGHT_HEADLESS", "false").lower() == "true"
@@ -25,8 +25,8 @@ async def test_login():
page.on("console", lambda msg: print(f"📝 CONSOLE: {msg.text}"))
try:
print("🌐 Открываем страницу входа...")
await page.goto("http://localhost:3000/login")
print(f"🌐 Открываем страницу входа на {frontend_url}...")
await page.goto(f"{frontend_url}/login")
await page.wait_for_load_state("networkidle")
print("📸 Делаем скриншот страницы входа...")