This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"},
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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("🔍 Ищем таблицу сообществ...")
|
||||
|
||||
@@ -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("📸 Делаем скриншот страницы входа...")
|
||||
|
||||
Reference in New Issue
Block a user