import asyncio import os # Override DATABASE_URL before any app code is imported so the lazy engine # initialises with SQLite (no asyncpg required in the test environment). os.environ["DATABASE_URL"] = "sqlite+aiosqlite:///:memory:" import pytest import pytest_asyncio from httpx import AsyncClient, ASGITransport from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker from app.database import Base, get_db from app.main import app TEST_DATABASE_URL = "sqlite+aiosqlite:///:memory:" @pytest.fixture(scope="session") def event_loop(): loop = asyncio.new_event_loop() yield loop loop.close() @pytest_asyncio.fixture(scope="session") async def db_engine(): engine = create_async_engine(TEST_DATABASE_URL, echo=False) async with engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) yield engine await engine.dispose() @pytest_asyncio.fixture async def db_session(db_engine): factory = async_sessionmaker(db_engine, expire_on_commit=False) async with factory() as session: yield session await session.rollback() @pytest_asyncio.fixture async def client(db_session): 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()