ADR-041 : Infrastructure de test partagée pour les paquets opt-in¶
Statut¶
Acceptée, Forge 1.0.0-beta.17 (ticket GOV-ADR-STATUS-RESOLVE-001).
Proposé en 1.0.0-beta.x (ticket OPTIN-TEST-SUPPORT-001).
La décision est appliquée : le paquet forge-mvc-testing (FakeRequest plus
plugin pytest) est distribué en dev-only ; le conftest.py racine est réduit et
les paquets opt-in portent leurs tests via ce paquet.
Débloque l'ADR-040 (surface de test par paquet) : quatre paquets ont pu migrer
leurs tests unitaires (stats, workflow, audio, mail), mais les huit
autres en sont empêchés par une dépendance à l'infrastructure de test partagée
du tests/ racine.
Date¶
2026-06-21
Contexte¶
Migrer les tests unitaires d'un opt-in vers packages/<paquet>/tests/
(ADR-040) suppose qu'ils soient autonomes. Or tests/conftest.py fournit
une infrastructure partagée dont dépendent 61 fichiers de test, opt-ins
inclus :
- des fixtures autouse qui configurent le noyau Forge pour chaque test :
configure_forge_kernel(vues + SQL entmp_path,UPLOAD_ROOTisolé),
clear_sessions,clear_rate_limits,clear_upload_rate_limits; - la fixture
fake_requestet la classeFakeRequest(tests/fake_request.py)
pour simuler une requête de contrôleur.
Déplacés tels quels dans un paquet, ces tests perdent l'accès à ces fixtures
(conftest.py racine ne s'applique qu'au sous-arbre tests/) et échouent en
masse (« fixture not found »). Tentative mesurée : 100 échecs. Le filtre
« n'importe pas cli/mvc » est donc insuffisant : le vrai couplage est
l'infrastructure de test, pas le code applicatif.
Incident à noter : tests/conftest.py mentionne forge_mvc_workflow et a été
faussement déplacé par un filtre trop large, ce qui casse toute la racine.
Tout futur déplacement doit exclure conftest.py et tracer l'usage de fixtures.
Décision¶
Extraire l'infrastructure de test partagée dans un paquet de test-support
dédié, réservé au développement : packages/forge-mvc-testing/
(module forge_mvc_testing).
Il fournit :
FakeRequest(importable :from forge_mvc_testing import FakeRequest) ;- un plugin pytest (point d'entrée
pytest11) exposant les fixtures
partagées (configure_forge_kernelautouse,clear_*,fake_request).
Quand le paquet est installé dans l'environnement de test, ses fixtures sont
disponibles partout, racine comme paquets, sansconftest.pydupliqué.
Conséquences de câblage :
forge-mvc-testingest une dépendance de développement uniquement
(déclarée dansrequirements-dev.txtet dans l'extra[test]de chaque
opt-in). Il n'est jamais une dépendance runtime, jamais installé par
les utilisateurs : leurs suites de tests ne sont pas polluées par les fixtures
autouse de Forge.tests/conftest.pyracine se réduit à presque rien (le plugin fournit tout) ;
tests/fake_request.pyest supprimé au profit deforge_mvc_testing.- Une fois en place, les huit paquets restants (
mfa,rbac,files,
images,iot,video,pivot,i18n) migrent leurs tests unitaires
propres, qui ne dépendent plus que deforge_mvc_<paquet>+core+
forge_mvc_testing(présent en dev).
Alternatives écartées¶
- Plugin pytest porté par le
core(core.testing+pytest11) : rejeté.
Le core est une dépendance runtime de tous les opt-ins ; un plugin autouse
dans le core s'activerait dans la suite de tests de l'utilisateur, et
configure_forge_kernelreconfigurerait son noyau. Trop intrusif (contraire
au principe 8 : pas d'effet caché côté utilisateur). - Réplication du
conftest.pydans chaque paquet : rejeté. ~90 lignes de
fixtures dupliquées sur huit paquets, avec dérive garantie (contraire au
principe 11 : une seule façon officielle). - Laisser ces tests à la racine : possible, mais les huit paquets restent
alors non autovérifiables, ce que l'ADR-040 visait à corriger.
Plan d'exécution séquencé¶
- Créer
packages/forge-mvc-testing/:FakeRequest+ plugin pytest
(fixtures déplacées depuistests/conftest.py). Pas publié sur PyPI (ou en
dev-only),pyproject.tomlminimal. - Brancher :
requirements-dev.txt+ extra[test]des opt-ins ; réduire
tests/conftest.pyà un repli ; supprimertests/fake_request.py. - Vérifier la racine inchangée (suite complète verte), le plugin remplace le
conftest sans régression. - Migrer les huit paquets, un par un, en ne déplaçant que les tests
réellement propres (exclureconftest.py, vérifier l'absence de
from tests[.]et de fixtures horsforge_mvc_testing), run racine et
autonome verts à chaque paquet.
Conséquences¶
Positives :
- Les douze opt-ins peuvent porter leurs tests unitaires, autovérifiables et
exécutables en autonome. - Une seule source pour
FakeRequestet les fixtures (principe 11). - Les suites de test des utilisateurs ne sont pas affectées (test-support
dev-only).
Négatives / coûts :
- Un paquet de plus à maintenir (mais de test, simple, non publié).
- Migration en deux temps (infra d'abord, puis les huit paquets).
Charte appliquée¶
- Principe 11, une seule façon officielle (infra de test unique).
- Principe 8, noyau minimal (l'infra de test ne va pas dans le core).
- Principe 6, tester avant d'élargir (racine validée avant de migrer les huit).
ADR liés¶
- Débloque l'ADR-040 (surface de test par paquet).
- Cohérent avec l'ADR-005 (packaging hybride monorepo + multi-distributions).