import asyncio import os import pytest import pytest_asyncio from httpx import ASGITransport, AsyncClient from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker, AsyncSession # Set test database before importing app os.environ["DATABASE_URL"] = "sqlite+aiosqlite:///:memory:" from app.main import app from app.database import Base, get_db, async_engine @pytest.fixture(scope="session") def event_loop(): loop = asyncio.get_event_loop_policy().new_event_loop() yield loop loop.close() @pytest_asyncio.fixture(scope="function") async def db_session(): """Create a fresh in-memory database for each test.""" # Create tables async with async_engine.begin() as conn: # Import and run schema creation from app.database import _create_schema await conn.run_sync(_create_schema) async_session = async_sessionmaker(async_engine, class_=AsyncSession, expire_on_commit=False) async with async_session() as session: yield session await session.rollback() # Drop all tables after test async with async_engine.begin() as conn: for table in reversed(Base.metadata.sorted_tables): await conn.execute(table.delete()) @pytest_asyncio.fixture(scope="function") async def client(db_session): """Async HTTP client for testing.""" async def override_get_db(): yield db_session app.dependency_overrides[get_db] = override_get_db async with AsyncClient(transport=ASGITransport(app=app), base_url="http://test") as ac: yield ac app.dependency_overrides.clear()