import asyncio import uuid from collections.abc import AsyncGenerator import pytest from httpx import ASGITransport, AsyncClient from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine from app.database import Base, get_db from app.main import create_app # Use a unique in-memory-like approach: create a separate test DB schema TEST_DATABASE_URL = "postgresql+asyncpg://ai_assistant:changeme@localhost:5432/ai_assistant_test" @pytest.fixture(scope="session") def event_loop(): loop = asyncio.new_event_loop() yield loop loop.close() @pytest.fixture(scope="session") async def test_engine(): engine = create_async_engine(TEST_DATABASE_URL) async with engine.begin() as conn: await conn.run_sync(Base.metadata.drop_all) await conn.run_sync(Base.metadata.create_all) yield engine async with engine.begin() as conn: await conn.run_sync(Base.metadata.drop_all) await engine.dispose() @pytest.fixture async def db_session(test_engine) -> AsyncGenerator[AsyncSession, None]: session_factory = async_sessionmaker(test_engine, class_=AsyncSession, expire_on_commit=False) async with session_factory() as session: yield session await session.rollback() @pytest.fixture async def client(test_engine) -> AsyncGenerator[AsyncClient, None]: session_factory = async_sessionmaker(test_engine, class_=AsyncSession, expire_on_commit=False) async def override_get_db(): async with session_factory() as session: try: yield session await session.commit() except Exception: await session.rollback() raise app = create_app() app.dependency_overrides[get_db] = override_get_db transport = ASGITransport(app=app) async with AsyncClient(transport=transport, base_url="http://test") as ac: yield ac