test(backend): généralise la vérification du 403 de rôle à toute route, pas seulement admin
Backend / Lint, typage et tests (push) Successful in 1m6s

test_every_administration_route_documents_the_role_refusal ne couvrait que le tag users : sites
vient de passer inaperçu deux fois (tag et 403 absents) pendant le merge avec dev. Remplacé par
ROUTES_A_ROLE, une liste maintenue à la main sur le modèle de ORIGINE_VERIFIEE, qui couvre toute
route derrière require_role. Ajoute la checklist d'ajout d'une route métier à 20-backend.md.
This commit is contained in:
Johan LEROY
2026-09-16 12:09:53 +02:00
parent 12c5cf87ad
commit 3ad19ed089
2 changed files with 27 additions and 2 deletions
+14
View File
@@ -235,6 +235,20 @@ Les modèles de `app/schemas/errors.py` décrivent ce que les gestionnaires renv
`loc` n'apparaît dans aucune réponse de cette API : `validation_error_handler()` rend `champ` et
`type`. Renommer un champ là-bas sans le faire ici rend la documentation fausse en silence.
**Ajouter une route métier** (`sites` est le gabarit, `reading`/`dataset`/`prediction`/`alert`/
`recommendation` suivront) :
1. Composer ses `responses=` depuis `app/api/openapi.py` : `REPONSES_LECTEUR` ou `REPONSES_ADMIN`
au niveau de l'`include_router` dans `app/api/v1/router.py` (401 et le 403 propre au rôle),
`REPONSE_VALIDATION` et les codes locaux (404, 409, ...) sur l'endpoint lui-même s'il a un
corps, un paramètre ou peut échouer par identifiant.
2. Décrire son tag dans `TAGS` (`app/api/openapi.py`).
3. Si elle passe par `require_role`, l'ajouter à `ROUTES_A_ROLE`
(`tests/api/test_openapi.py`) ; si elle passe par `require_trusted_origin`, l'ajouter à
`ORIGINE_VERIFIEE`. Ces deux listes sont maintenues à la main, pas déduites automatiquement du
code : une route protégée qui n'y figure pas ne sera pas détectée par les tests.
4. `make openapi`, puis `pytest tests/api/test_openapi.py`.
## Sécurité
Voir la vue consolidée dans [00-vue-ensemble.md](00-vue-ensemble.md) et les décisions dans les