from collections.abc import Iterator from contextlib import contextmanager from fastapi.testclient import TestClient from sqlalchemy import create_engine from sqlalchemy.orm import Session from sqlalchemy.pool import StaticPool from app.db import Base, get_db_session from app.main import app @contextmanager def make_test_client() -> Iterator[tuple[TestClient, object]]: engine = create_engine( "sqlite:///:memory:", connect_args={"check_same_thread": False}, poolclass=StaticPool, ) Base.metadata.create_all(engine) def override_db_session(): with Session(engine) as session: yield session app.dependency_overrides[get_db_session] = override_db_session try: yield TestClient(app), engine finally: app.dependency_overrides.clear() engine.dispose()