"""Конфигурация тестов.""" import asyncio from typing import AsyncGenerator import pytest import pytest_asyncio from httpx import ASGITransport, AsyncClient from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker from app.core.database import Base # Создаём тестовую БД в памяти (SQLite) TEST_DATABASE_URL = "sqlite+aiosqlite:///:memory:" engine = create_async_engine(TEST_DATABASE_URL, echo=False) async_session_factory = async_sessionmaker(engine, class_=AsyncSession, expire_on_commit=False) @pytest.fixture(scope="session") def event_loop(): """Создаём event loop для тестов.""" loop = asyncio.new_event_loop() yield loop loop.close() @pytest_asyncio.fixture(autouse=True) async def setup_db(): """Создаём таблицы перед каждым тестом и удаляем после.""" async with engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) yield async with engine.begin() as conn: await conn.run_sync(Base.metadata.drop_all) @pytest_asyncio.fixture async def db_session() -> AsyncGenerator[AsyncSession, None]: """Тестовая сессия БД.""" async with async_session_factory() as session: yield session @pytest_asyncio.fixture async def client(db_session) -> AsyncGenerator[AsyncClient, None]: """HTTP клиент для тестирования API.""" from app.main import app transport = ASGITransport(app=app) async with AsyncClient(transport=transport, base_url="http://test") as ac: yield ac @pytest_asyncio.fixture async def test_user(db_session): """Создаём тестового пользователя.""" from app.models.user import User user = User(email="test@example.com", password_hash="$2b$12$LJ3m4ys6LJ3m4ys6LJ3m4e", role="freelancer") db_session.add(user) await db_session.commit() return user @pytest_asyncio.fixture async def test_project(db_session, test_user): """Создаём тестовый проект.""" from app.models.project import Project project = Project( client_id=test_user.id, title="Тестовый проект", description="Описание проекта для тестирования", category="web-development", required_skills=["python", "fastapi"], budget_min=1000.0, budget_max=5000.0, ) db_session.add(project) await db_session.commit() return project