import asyncio from typing import AsyncGenerator, Generator import pytest from httpx import AsyncClient from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.pool import StaticPool import pytest from sqlalchemy_utils import drop_database, database_exists from starlette.config import environ from starlette.testclient import TestClient # from src.database import Base, get_db # from src.main import app # Test database URL TEST_DATABASE_URL = "sqlite+aiosqlite:///:memory:" engine = create_async_engine( TEST_DATABASE_URL, connect_args={"check_same_thread": False}, poolclass=StaticPool, ) async_session = sessionmaker( engine, class_=AsyncSession, expire_on_commit=False, autocommit=False, autoflush=False, ) async def override_get_db() -> AsyncGenerator[AsyncSession, None]: async with async_session() as session: try: yield session await session.commit() except Exception: await session.rollback() raise finally: await session.close() app.dependency_overrides[get_db] = override_get_db @pytest.fixture(scope="session") def event_loop() -> Generator: loop = asyncio.get_event_loop_policy().new_event_loop() yield loop loop.close() @pytest.fixture(autouse=True) async def setup_db() -> AsyncGenerator[None, None]: 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 client() -> AsyncGenerator[AsyncClient, None]: async with AsyncClient(app=app, base_url="http://test") as client: yield client