Aller au contenu

Matrice de couverture de bout en bout

Cette page cartographie la couverture de bout en bout (end-to-end, ci-après E2E : un parcours complet exercé contre ses vraies dépendances) des chaînes fonctionnelles d’Atlas, décidée par l’ADR 0071, volet (c). Elle complète la pyramide de tests — qui décrit les niveaux — d’une vue par chaîne : pour chacune, quels niveaux existent, et surtout « a-t-elle déjà tourné en vrai ? ». La mémoire des écarts E2E ne se limite plus au registre de drifts (réactif, post-mortem, dont la capture est désormais assistée au point d’échec, ADR 0080) : les trous connus sont nommés ici, d’un coup d’œil.

Atlas déploie sur un cluster (ADR 0043) mais ne possède ni matériel ni topologie : cette matrice cartographie ses chaînes de test, pas une infrastructure.

  • Niveaux : unitaire (logique pure, mocks), intégration (modules combinés, parfois une vraie dépendance locale via Docker), E2E (parcours complet contre la pile réelle).
  • « A tourné ? » distingue trois états :
    • CI — exécuté automatiquement en intégration continue, donc tourné à chaque déclenchement concerné ;
    • banc — joué à la main sur un banc local (preuve d’intégration, ADR 0057), pas en CI ;
    • self-skip — câblé mais se saute silencieusement quand sa dépendance est absente (ADR 0057, ADR 0034) : un skip n’est pas un échec, mais un état que cette page rend visible.
Chaîne fonctionnelleUnitaireIntégrationE2EA tourné ?Trous connus
App amarre (auth magic link → demande CRF)✅ Appwrite + REDCap (self-skip)smoke Playwright (self-skip)CI nocturne e2e.yml si REDCap présent, sinon self-skipSmoke E2E skippé si REDCap absent (cf. e2e.yml) ; sur runner public sans ZIP REDCap, job vert sans tester
App sillage (auth magic link → accueil membre)✅ endpoint projets (mock service)smoke Playwright (self-skip)CI nocturne e2e.yml si REDCap présent, sinon self-skipSmoke E2E skippé si REDCap absent ; câblage REDCap du parcours sillage encore partiel (pré-REDCap)
Contrat REDCap (client CRF ↔ instance REDCap)surveys.test.ts (self-skip REDCap)— (porté par le smoke app)Self-skip sans REDCap local ; banc via les sandboxesPas de job CI dédié hors e2e.yml ; couverture E2E réelle conditionnée à la présence du ZIP REDCap
Contrat Appwrite (flux d’auth magic link)signup.test.ts (self-skip Appwrite)— (porté par le smoke app)Self-skip sans Appwrite + Mailpit locaux ; banc via les sandboxesPas de job CI dédié hors e2e.yml
Service crf (Hono : routes → service → dépôt)✅ routes contre dépôt en mémoire— (exercé via amarre)CI ci.yml (vitest)Pas de smoke HTTP du service déployé en propre ; validé indirectement par le smoke amarre
DataOps citation (ingestion → Dagster → dbt → lignage → dérive)smoke MinIO (Docker, self-skip)✅ chaîne GitOps complète sur bancCI ci.yml : purs + intégration MinIO si Docker ; chaîne complète au bancChaîne complète (ingestion réelle → run K8s → Marquez → MLflow) non câblée en CI, jouée au banc
DataOps mediawatch (GKG GDELT → Dagster → dbt → lignage)smoke MinIO (Docker, self-skip)⏳ chaîne GitOps (en cours)CI ci.yml : purs + intégration MinIO si DockerBout-en-bout GitOps moins mûr que citation ; lignage vérifié par convention de nommage, pas via Marquez réel en CI

Légende — ✅ couvert · ⏳ partiel / en cours · — sans objet (couvert par une autre ligne). « A tourné ? » : CI (intégration continue), banc (joué à la main, ADR 0057), self-skip (se saute si la dépendance manque).

Le trou nommé : smoke E2E skippable si REDCap absent

Section intitulée « Le trou nommé : smoke E2E skippable si REDCap absent »

Le smoke E2E des applications (sandbox/amarre-sandbox/tests/e2e/smoke.spec.ts et sandbox/sillage-sandbox/tests/e2e/smoke.spec.ts) ne tourne en CI (e2e.yml) que si la source REDCap est présente. REDCap est un logiciel propriétaire dont le ZIP n’est pas committé : sur un runner public sans ce ZIP, le workflow détecte l’absence et se termine en succès avec un avis explicite plutôt que d’échouer — le step Detect REDCap source availability de e2e.yml pose available=false et conditionne tous les steps suivants.

C’est un état assumé, pas un défaut masqué. Forcer ce smoke à échouer quand REDCap manque rouvrirait le piège que l’ADR 0034 écarte (une CI rouge pour une dépendance absente, sans rapport avec le code poussé) et contredirait le self-skip assumé par l’ADR 0057. La matrice rend l’état lisible ; elle n’arme aucune porte qui frictionnerait au mauvais moment. Côté test, la suite se saute elle aussi (test.skip sur isStackReachable()) quand Mailpit ou Appwrite n’est pas joignable, pour qu’un pnpm test:smoke local reste sûr sans la pile Docker.

La chaîne citation enchaîne ingestion (raw_snapshot, sync incrémental rclone) → orchestration Dagstertransformations dbt (staging → curated → marts) → traçabilité de lignage (OpenLineage) → suivi de dérive (ADR 0062, ADR 0068). Sa couverture est à deux étages :

  • En CI (ci.yml, job DataOps (Python) via pnpm dataops:check) : l’essentiel des tests sont purs et hermétiques (loaders DuckDB ou S3 monkeypatchés, aucune I/O réelle). Les tests d’intégration lancent un vrai dbt build contre un MinIO éphémère (épinglé par digest) — test_dbt_models.py, test_index_load.py, test_researcher_embeddings.py, test_lakehouse.py, test_minio_fixture.py — et se sautent si Docker est absent (conftest.py appelle pytest.skip).
  • Au banc : le bout-en-bout réel (ingestion d’un échantillon borné, run dans des pods Kubernetes, lignage visible dans Marquez, métriques dans MLflow) est une preuve d’intégration jouée à la main (ADR 0057), non câblée en CI. Les tests de lignage et de dérive vérifient en CI la convention (graphe de datasets connecté, no-op sans OPENLINEAGE_URL / MLFLOW_TRACKING_URI) ; la visibilité réelle dans Marquez reste une preuve de banc.

La chaîne mediawatch (GKG GDELT, ADR 0064 et ADR 0065) suit le même modèle de tests mais son bout-en-bout GitOps est moins mûr que celui de citation.

Cette matrice ne peut pas dériver des tests réels sans qu’un contrôle bronche : un miroir testé doc ↔ specs (ADR 0071, dans l’esprit de l’ADR 0028) vérifie que les chaînes listées correspondent aux fichiers de test réels du dépôt — *.spec.ts côté Node, test_*.py côté DataOps. Concrètement, les ancres de cette page doivent rester alignées avec :

  • sandbox/amarre-sandbox/tests/e2e/smoke.spec.ts, sandbox/sillage-sandbox/tests/e2e/smoke.spec.ts (smoke Playwright) ;
  • apps/amarre/tests/integration/crf/surveys.test.ts (contrat REDCap), apps/amarre/tests/integration/auth/signup.test.ts (contrat Appwrite) ;
  • dataops/citation-dagster/tests/test_*.py, dataops/mediawatch-dagster/tests/test_*.py (chaîne DataOps).

Si une chaîne de test apparaît, disparaît ou change de niveau, la matrice est rédigée à la main : le miroir signale la dérive, à charge de mettre cette page à jour dans la même trace — comme un drift ouvert lie une issue (ADR 0033).