import asyncio from typing import AsyncGenerator import pytest import pytest_asyncio from httpx import ASGITransport, AsyncClient from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine from app.api.deps import get_db from app.database import Base from app.main import app TEST_DB_URL = "sqlite+aiosqlite:///:memory:" test_engine = create_async_engine(TEST_DB_URL, echo=False) TestSession = async_sessionmaker(test_engine, class_=AsyncSession, expire_on_commit=False) @pytest.fixture(scope="session") def event_loop(): loop = asyncio.new_event_loop() yield loop loop.close() @pytest_asyncio.fixture(scope="function") async def setup_db(): async with test_engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) yield async with test_engine.begin() as conn: await conn.run_sync(Base.metadata.drop_all) async def override_get_db() -> AsyncGenerator[AsyncSession, None]: async with TestSession() as session: yield session @pytest_asyncio.fixture async def client(setup_db) -> AsyncGenerator[AsyncClient, None]: app.dependency_overrides[get_db] = override_get_db transport = ASGITransport(app=app) async with AsyncClient(transport=transport, base_url="http://test") as c: yield c app.dependency_overrides.clear() @pytest_asyncio.fixture async def async_client(client: AsyncClient) -> AsyncGenerator[AsyncClient, None]: """Alias for client fixture for compatibility.""" yield client