"""Le service n'est jamais public : sans le jeton de service, 401 partout (la santé exceptée — sonde d'infra qui ne révèle rien).""" from fastapi.testclient import TestClient from siop_ai.app import app def test_sante_publique_interne(): reponse = _client_sans_db().get("/healthz") assert reponse.status_code == 200 assert reponse.json()["service"] == "siop2-ai" def test_endpoints_internes_refuses_sans_jeton(): client = _client_sans_db() assert client.post("/internal/reindex").status_code == 401 assert client.post("/internal/search", json={"question": "couple de serrage ?"}).status_code == 401 def test_question_trop_courte_rejetee_avant_tout(): reponse = _client_sans_db().post( "/internal/search", json={"question": "ab"}, headers={"X-Service-Token": "dev-only-ai-token"}, ) assert reponse.status_code == 422 def _client_sans_db() -> TestClient: """TestClient HORS gestionnaire de contexte : le lifespan (pool DB, modèle d'embeddings) ne tourne pas — on pose l'état minimal. Les tests d'intégration DB se font en local (recette), pas en CI (convention R5.1).""" from siop_ai.config import charger_reglages app.state.reglages = charger_reglages() return TestClient(app, raise_server_exceptions=False)