import pytest from fastapi.testclient import TestClient from sqlmodel import Session, SQLModel, create_engine from app import models # noqa: F401 (enregistre les tables sur SQLModel.metadata) from app.config import get_settings from app.db import get_session from app.main import app @pytest.fixture(scope="session") def engine(): """Vraie base PostgreSQL de test (voir docker/postgres-init).""" eng = create_engine(get_settings().test_database_url, pool_pre_ping=True) SQLModel.metadata.drop_all(eng) SQLModel.metadata.create_all(eng) yield eng SQLModel.metadata.drop_all(eng) @pytest.fixture def session(engine): """Session isolée : chaque test s'exécute dans une transaction annulée à la fin, y compris ses `commit()` (savepoints).""" connection = engine.connect() transaction = connection.begin() s = Session(bind=connection, join_transaction_mode="create_savepoint") try: yield s finally: s.close() transaction.rollback() connection.close() @pytest.fixture def client(session): app.dependency_overrides[get_session] = lambda: session with TestClient(app) as c: yield c app.dependency_overrides.clear()