"""Fixtures de test : client FastAPI + curseur SQL simulé (aucune vraie BDD).""" import os from contextlib import contextmanager os.environ.setdefault("JWT_SECRET", "test-secret") import pytest from fastapi.testclient import TestClient import main from auth import create_access_token from rate_limit import limiter from routers import ( admin, authentification, dashboard, evolution, historique, monitorings, referentiels, rgpd, ) # Modules qui ont fait `from config import get_cursor` : l'import lie le nom # dans leur propre espace de noms, il faut donc le remplacer dans chacun. MODULES_AVEC_CURSEUR = ( main, admin, authentification, dashboard, evolution, historique, monitorings, referentiels, rgpd, ) class FakeCursor: """Curseur pyodbc simulé : on règle description / rows / one par test.""" def __init__(self): self.description = [] self._rows = [] self._one = None self.rowcount = 1 self.executed = [] def execute(self, query, *args): self.executed.append((query, args)) return self def fetchall(self): return self._rows def fetchone(self): return self._one @pytest.fixture def cur(monkeypatch): c = FakeCursor() @contextmanager def fake_get_cursor(): yield c for module in MODULES_AVEC_CURSEUR: if hasattr(module, "get_cursor"): monkeypatch.setattr(module, "get_cursor", fake_get_cursor) return c @pytest.fixture(autouse=True) def limiteur_vierge(): """ Remet le compteur anti brute-force à zéro entre les tests. Le limiteur est un état global partagé par toute l'application : sans remise à zéro, les tests de connexion se comptabilisent entre eux et finissent par recevoir un 429, avec des échecs qui dépendent de l'ordre d'exécution et ne se reproduisent pas fichier par fichier. """ limiter.reset() yield limiter.reset() @pytest.fixture def client(): return TestClient(main.app) @pytest.fixture def auth_headers(): token = create_access_token({"sub": "admin", "role": "Admin", "uid": 1}) return {"Authorization": f"Bearer {token}"}