"""Integration test fixtures.""" from collections.abc import AsyncGenerator import pytest from sqlalchemy.ext.asyncio import ( AsyncEngine, AsyncSession, async_sessionmaker, create_async_engine, ) from app.infrastructure.database.models import Base # Use in-memory SQLite for tests TEST_DATABASE_URL = "sqlite+aiosqlite:///:memory:" @pytest.fixture(scope="session") def engine() -> AsyncEngine: """Create test engine.""" return create_async_engine( TEST_DATABASE_URL, echo=False, future=True, ) @pytest.fixture(scope="session") def session_factory(engine: AsyncEngine) -> async_sessionmaker[AsyncSession]: """Create test session factory.""" return async_sessionmaker( engine, class_=AsyncSession, expire_on_commit=False, autoflush=False, autocommit=False, ) @pytest.fixture(autouse=True) async def setup_db(engine: AsyncEngine) -> AsyncGenerator[None]: """Setup database tables for each test.""" 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.fixture async def db_session( session_factory: async_sessionmaker[AsyncSession], ) -> AsyncGenerator[AsyncSession]: """Create database session for testing.""" async with session_factory() as session: yield session await session.rollback()