#!/bin/bash """ Локальный тест CI - запускает серверы и тесты как в GitHub Actions """ set -e # Останавливаемся при ошибке echo "🚀 Запуск локального CI теста..." # Проверяем что мы в корневой папке if [ ! -f "pyproject.toml" ]; then echo "❌ Запустите скрипт из корневой папки проекта" exit 1 fi # Очищаем предыдущие процессы echo "🧹 Очищаем предыдущие процессы..." pkill -f "python dev.py" || true pkill -f "npm run dev" || true pkill -f "vite" || true pkill -f "ci-server.py" || true rm -f backend.pid frontend.pid ci-server.pid # Проверяем зависимости echo "📦 Проверяем зависимости..." if ! command -v uv &> /dev/null; then echo "❌ uv не установлен. Установите uv: https://docs.astral.sh/uv/getting-started/installation/" exit 1 fi if ! command -v npm &> /dev/null; then echo "❌ npm не установлен. Установите Node.js: https://nodejs.org/" exit 1 fi # Устанавливаем зависимости echo "📥 Устанавливаем Python зависимости..." uv sync --group dev echo "📥 Устанавливаем Node.js зависимости..." cd panel npm ci cd .. # Создаем тестовую базу echo "🗄️ Инициализируем тестовую базу..." touch database.db uv run python -c " from orm.base import Base from orm.community import Community, CommunityFollower, CommunityAuthor from orm.draft import Draft from orm.invite import Invite from orm.notification import Notification from orm.rating import Rating from orm.reaction import Reaction from orm.shout import Shout from orm.topic import Topic from services.db import get_engine engine = get_engine() Base.metadata.create_all(engine) print('Test database initialized') " # Запускаем серверы echo "🚀 Запускаем серверы..." python scripts/ci-server.py & CI_PID=$! echo "CI Server PID: $CI_PID" # Ждем готовности серверов echo "⏳ Ждем готовности серверов..." timeout 120 bash -c ' while true; do if curl -f http://localhost:8000/ > /dev/null 2>&1 && \ curl -f http://localhost:3000/ > /dev/null 2>&1; then echo "✅ Все серверы готовы!" break fi echo "⏳ Ожидаем серверы..." sleep 2 done ' if [ $? -ne 0 ]; then echo "❌ Таймаут ожидания серверов" kill $CI_PID 2>/dev/null || true exit 1 fi echo "🎯 Серверы запущены! Запускаем тесты..." # Запускаем тесты echo "🧪 Запускаем unit тесты..." uv run pytest tests/ -m "not e2e" -v --tb=short echo "🧪 Запускаем integration тесты..." uv run pytest tests/ -m "integration" -v --tb=short echo "🧪 Запускаем E2E тесты..." uv run pytest tests/ -m "e2e" -v --tb=short echo "🧪 Запускаем browser тесты..." uv run pytest tests/ -m "browser" -v --tb=short || echo "⚠️ Browser тесты завершились с ошибками" # Генерируем отчет о покрытии echo "📊 Генерируем отчет о покрытии..." uv run pytest tests/ --cov=. --cov-report=html echo "🎉 Все тесты завершены!" # Очищаем echo "🧹 Очищаем ресурсы..." kill $CI_PID 2>/dev/null || true pkill -f "python dev.py" || true pkill -f "npm run dev" || true pkill -f "vite" || true rm -f backend.pid frontend.pid ci-server.pid echo "✅ Локальный CI тест завершен!"