Aller au contenu

PD-280 — Scenarios de tests contractuels (v3 corriges)

0. Traceabilite des corrections (ecarts -> corrections)

Ecart Correction appliquee Localisation
ECT-03 Ajout des scenarios detailles TC-INV-05 et TC-INV-06; retrait de TC-INV-08. §3, §5, §7
ECT-04 TC-NEG-05 aligne sur le clamp obligatoire de nextCheckAfterSeconds (pas 500). §7
DIV-02 Matrice de couverture sans "Partielle". §2
DIV-03 CA-09 teste par verification textuelle RFC (test complet). §2, §6 (TC-NR-03)
SEC-01 Suppression des exigences de journal d'audit hors CA explicite. TC-NOM-01, §8
DIV-05 Epic parent aligne: PD-217 — LEGAL & COMPLIANCE. §1
MIN-01 Ajout test bornes min/max pendingResolutionTtl. §7 (TC-NEG-09)
ECT-02 Retrait des tests relies a l invariant crypto hors perimetre (TC-INV-08, TC-NEG-08). §2, §5, §7
AMB-V2-01 Tests relies a verificationRequestId ajoute (presence/format + usage pour "meme verification"). §2, §3 (TC-NOM-01, TC-NOM-09), §5 (TC-INV-06)
AMB-V2-02 Tests SLA corriges en mode reevaluation lazy sur appel API; pas de worker background. §3 (TC-NOM-05), §7 (TC-NEG-11)
AMB-V2-03 Test de concurrence idempotente ajoute (appels concurrents meme proofId, resultat identique). §3 (TC-NOM-10), §5 (INV-280-09)
ECT-V2-01 Oracle TC-INV-06 tranche: tentative DONE->PENDING retourne la reponse DONE existante, identique au premier appel. §5 (TC-INV-06), §7 (TC-NEG-07)

1. References

  • Specification : PD-280-specification.md (version corrigee v3)
  • Epic parent : PD-217 — LEGAL & COMPLIANCE

2. Matrice de couverture

ID Invariant ID Critere ID Test Couverture Commentaire
INV-280-01-checkresult-domain CA-01 TC-NOM-08 Totale Domaine CheckResult a 4 valeurs strictes.
INV-280-02-status-coherence CA-02 TC-NOM-01 Totale PENDING observable avec au moins un maillon null en API.
INV-280-02-status-coherence CA-04 TC-NOM-02 Totale DONE <=> tous maillons resolus {OK,KO,INDETERMINATE}.
INV-280-02-status-coherence CA-04 TC-ERR-03 Totale Detection explicite de reponse incoherente (DONE + null).
INV-280-03-pending-fields CA-05 TC-NOM-01 Totale Champs pending* obligatoires en PENDING.
INV-280-03-pending-fields CA-05 TC-NOM-02 Totale Champs pending* absents en DONE.
INV-280-03-pending-fields CA-05 TC-ERR-04 Totale Contrat casse (DONE + champs pending*) rejete en 500.
INV-280-04-finalization CA-07 TC-NOM-06 Totale proof_finalized=TRUE interdit PENDING interne et null API.
INV-280-05-link-transitions CA-03 TC-NOM-03 Totale PENDING_FINALITY mene a PENDING interne (pas INDETERMINATE).
INV-280-05-link-transitions CA-10 TC-NOM-05 Totale Expiration TTL : PENDING -> INDETERMINATE uniquement (lazy).
INV-280-05-link-transitions CA-03/CA-10 TC-INV-05 Totale Aucune transition retour maillon terminal vers PENDING.
INV-280-06-job-transitions CA-04/CA-12 TC-INV-06 Totale DONE terminal pour un verificationRequestId; rappel idempotent identique.
INV-280-07-tla-bijection CA-06 TC-NOM-07 Totale RealStates = CheckResults verifie formellement.
INV-280-07-tla-bijection CA-06 TC-ERR-06 Totale Desalignement TLA+ bloque le pipeline.
INV-280-09-concurrent-idempotence CA-12 TC-NOM-10 Totale Deux appels concurrents meme proofId => resultat observable identique.
N/A (API format) CA-02/CA-11 TC-NOM-09 Totale verificationRequestId present et UUID v4 valide.
N/A (documentaire) CA-09 TC-NR-03 Totale Verification textuelle RFC sur distinction PENDING vs INDETERMINATE.
N/A (API format) CA-11 TC-ERR-01 Totale Validation format proofId invalide.
N/A (API format) CA-11 TC-NEG-02 Totale Validation cle linkResults hors contrat.
N/A (SLA/polling) CA-10 TC-NEG-05 Totale Clamp nextCheckAfterSeconds en sortie dans [1..86400].
N/A (SLA config) CA-10 TC-NEG-09 Totale Bornes min/max pendingResolutionTtl couvertes.

3. Scenarios de test – Flux nominaux

TEST-ID: TC-NOM-01
Reference spec: INV-280-02, INV-280-03, CA-02, CA-05, CA-10, CA-11

GIVEN
  - Preuve existante (proofId UUID v4 valide) avec maillon BLOCKCHAIN_ANCHOR en cours (etat interne PENDING).
  - Horloge de test controlee.
WHEN
  - Appel de l'endpoint de verification avec ce proofId.
THEN
  - HTTP 200.
  - verificationRequestId present et UUID v4.
  - verificationStatus = "PENDING".
  - linkResults contient exactement 4 cles contractuelles.
  - linkResults.BLOCKCHAIN_ANCHOR = null (representation publique "en cours").
  - pendingReason present et dans l'enum autorisee du perimetre.
  - nextCheckAfterSeconds present et dans [1..86400].
TEST-ID: TC-NOM-02
Reference spec: INV-280-02, INV-280-03, CA-02, CA-04, CA-05

GIVEN
  - Preuve existante avec 4 maillons resolus dans {OK, KO, INDETERMINATE}.
WHEN
  - Appel de l'endpoint de verification.
THEN
  - HTTP 200.
  - verificationStatus = "DONE".
  - Aucun linkResults[*] = null.
  - Aucun linkResults[*] = "PENDING".
  - pendingReason absent.
  - nextCheckAfterSeconds absent.
AND
  - Un rappel ulterieur ne reouvre pas l'etat (retour idempotent DONE).
TEST-ID: TC-NOM-03
Reference spec: INV-280-05, CA-03

GIVEN
  - Contexte metier "PENDING_FINALITY" actif pour le maillon blockchain.
WHEN
  - Evaluation du maillon blockchain.
THEN
  - Resultat interne maillon = "PENDING".
  - Resultat API du maillon = null.
  - Resultat maillon != "INDETERMINATE".
AND
  - Le job global reste "PENDING" tant qu'au moins un maillon n'est pas resolu.
TEST-ID: TC-NOM-05
Reference spec: INV-280-05, CA-10, ERR-280-05, AMB-V2-02

GIVEN
  - Maillon en etat "PENDING" depuis une duree > pendingResolutionTtl.
  - pendingResolutionTtl configure a une valeur connue (ex: 3600 s) en environnement de test.
WHEN
  - Un appel API de verification est effectue (declencheur lazy de reevaluation SLA).
THEN
  - Le maillon devient "INDETERMINATE" pendant le traitement de cet appel.
  - Aucune erreur transport n'est renvoyee.
AND
  - Si tous les maillons sont resolus apres reclassification, verificationStatus = "DONE".
TEST-ID: TC-NOM-06
Reference spec: INV-280-04, CA-07

GIVEN
  - proof_finalized = TRUE.
WHEN
  - Lecture de la verification (API + etat persistant observable).
THEN
  - Aucun maillon interne n'est "PENDING".
  - Aucun maillon API n'est null.
  - Tous les maillons appartiennent a {OK, KO, INDETERMINATE}.
AND
  - Toute violation est tracee comme rupture d'invariant.
TEST-ID: TC-NOM-07
Reference spec: INV-280-07, CA-06

GIVEN
  - Artefacts formels TLA+ et norm.yaml alignes sur 4 etats.
WHEN
  - Pipeline de verification formelle est execute.
THEN
  - ASSUME est satisfait.
  - Verification formelle passe.
AND
  - Le rapport de build contient la preuve explicite de l'egalite des ensembles.
TEST-ID: TC-NOM-08
Reference spec: INV-280-01, CA-01

GIVEN
  - Build applicatif + tests de domaine actives.
WHEN
  - Validation du domaine CheckResult est executee.
THEN
  - L'ensemble autorise est exactement {OK, KO, INDETERMINATE, PENDING}.
  - Aucune valeur supplementaire n'est acceptee.
AND
  - Les consommateurs pattern-match couvrent explicitement 4 cas.
TEST-ID: TC-NOM-09
Reference spec: AMB-V2-01, CA-02, CA-11

GIVEN
  - Appel nominal de verification.
WHEN
  - Reponse 200 recue.
THEN
  - verificationRequestId est present.
  - verificationRequestId respecte le format UUID v4.
  - verificationRequestId est stable lors d'un rappel idempotent d'une verification deja DONE.
TEST-ID: TC-NOM-10
Reference spec: INV-280-09, CA-12, AMB-V2-03

GIVEN
  - Deux clients envoient simultanement une requete de verification sur le meme proofId.
WHEN
  - Les deux appels sont traites en concurrence.
THEN
  - Les deux reponses sont identiques sur le resultat metier observable (verificationStatus, linkResults, pending* selon etat).
  - Aucune mutation d'etat n'est induite par l'appel de verification.
AND
  - Aucun mecanisme de lock applicatif n'est requis pour satisfaire ce test.

4. Scenarios de test – Cas d’erreur

TEST-ID: TC-ERR-01
Reference spec: ERR-280-01, CA-11

GIVEN
  - proofId invalide (non UUID v4).
WHEN
  - Appel endpoint de verification.
THEN
  - HTTP 400 Bad Request.
  - Code metier = INVALID_PROOF_ID.
  - Message d'erreur deterministe.
AND
  - Aucun effet de bord (pas de mutation d'etat, pas d'evenement metier).
TEST-ID: TC-ERR-02
Reference spec: ERR-280-02

GIVEN
  - proofId valide syntaxiquement mais inexistant.
WHEN
  - Appel endpoint de verification.
THEN
  - HTTP 404 Not Found.
  - Code metier = PROOF_NOT_FOUND.
AND
  - Absence de creation implicite de ressource.
TEST-ID: TC-ERR-03
Reference spec: ERR-280-03, INV-280-02, CA-04

GIVEN
  - Reponse candidate incoherente (verificationStatus="DONE" avec au moins un linkResults[*]=null).
WHEN
  - Controle de coherence de sortie est applique.
THEN
  - HTTP 500 Internal Server Error.
  - Code metier = VERIFICATION_CONTRACT_BROKEN.
AND
  - Trace technique correlable (requestId/proofId).
TEST-ID: TC-ERR-04
Reference spec: ERR-280-04, INV-280-03, CA-05

GIVEN
  - Reponse candidate en DONE avec pendingReason ou nextCheckAfterSeconds presents.
WHEN
  - Controle de coherence de sortie est applique.
THEN
  - HTTP 500 Internal Server Error.
  - Code metier = VERIFICATION_CONTRACT_BROKEN.
AND
  - Aucune reponse incoherente n'est exposee au client.
TEST-ID: TC-ERR-06
Reference spec: ERR-280-06, INV-280-07, CA-06

GIVEN
  - Desalignement introduit entre RealStates et CheckResults.
WHEN
  - Verification formelle est executee en CI.
THEN
  - Build refuse (echec formel explicite).
AND
  - Aucune promotion d'artefact n'est autorisee.

5. Tests d’invariants (non negociables)

Invariant Test(s) dedies Observable Commentaire
INV-280-01-checkresult-domain TC-NOM-08 Domaine exact a 4 valeurs Verifie exclusion de toute 5e valeur.
INV-280-02-status-coherence TC-NOM-01, TC-NOM-02, TC-ERR-03 Coherence verificationStatus/linkResults Couvre sens direct et reciproque.
INV-280-03-pending-fields TC-NOM-01, TC-NOM-02, TC-ERR-04 Presence conditionnelle champs pending* Contrat JSON non ambigu.
INV-280-04-finalization TC-NOM-06 Aucun PENDING interne / null API si finalise Invariant metier post-finalisation.
INV-280-05-link-transitions TC-NOM-03, TC-NOM-05, TC-INV-05 Transition monotone des maillons Interdit toute transition retour.
INV-280-06-job-transitions TC-INV-06 DONE terminal pour un verificationRequestId Oracle idempotent deterministe sur rappel.
INV-280-07-tla-bijection TC-NOM-07, TC-ERR-06 Egalite d'ensembles TLA+ + CI Evite regression formelle silencieuse.
INV-280-09-concurrent-idempotence TC-NOM-10 Resultat identique en concurrence sur meme proofId Endpoint lecture seule sans lock applicatif.

Scenarios detailles d invariants manquants (ajoutes)

TEST-ID: TC-INV-05
Reference spec: INV-280-05, CA-03, CA-10

GIVEN
  - Un maillon a atteint un etat terminal (OK ou KO ou INDETERMINATE).
WHEN
  - Une tentative de reevaluation forcee cherche a remettre ce maillon en PENDING.
THEN
  - La transition est refusee de maniere deterministe.
  - L'etat du maillon reste inchange.
AND
  - Aucun payload API valide n'expose une transition retour terminal -> PENDING.
TEST-ID: TC-INV-06
Reference spec: INV-280-06, CA-04, CA-12, ECT-V2-01

GIVEN
  - Une verification identifiee par verificationRequestId=X est deja en etat DONE (tous maillons resolus).
WHEN
  - Un nouvel appel de verification est effectue pour le meme proofId, sans creation explicite d'un nouveau contexte.
THEN
  - verificationStatus reste DONE.
  - La reponse retournee est identique a la premiere reponse DONE (meme contenu metier, y compris verificationRequestId=X).
AND
  - Aucune transition DONE -> PENDING n'est autorisee.
  - Aucun rejet/erreur n'est attendu: comportement strictement idempotent.

6. Tests de non-regression

Test ID Objet Observable Commentaire
TC-NR-01 Regression endpoint verification historique (hors PENDING) Tests existants verts, payload inchange pour cas resolus Couvre CA-08.
TC-NR-02 Compatibilite schema linkResults (4 cles exactes) Memes cles contractuelles, semantique enrichie (null pour en cours) Evite rupture consommateurs stricts.
TC-NR-03 Verification documentaire RFC PV-PROOF (PENDING vs INDETERMINATE) Presence textuelle explicite de la distinction et de la semantique de la spec Couvre CA-09.
TC-NR-04 Non-regression formalisme TLA+/norm Build formel vert sur baseline + story Couvre CA-06/CA-08.

7. Tests negatifs et adversariaux

Test ID Entree invalide / abus Resultat attendu Observable
TC-NEG-01 proofId UUID non v4 mais format proche 400 INVALID_PROOF_ID Code + corps d'erreur stable.
TC-NEG-02 linkResults avec cle non contractuelle (BLOCKCHAIN_anchor) 500 VERIFICATION_CONTRACT_BROKEN Rejet de sortie hors contrat.
TC-NEG-03 Valeur enum minuscule (pending) en sortie 500 VERIFICATION_CONTRACT_BROKEN Case-sensitivity respectee.
TC-NEG-04 verificationStatus=DONE avec linkResults[*]="PENDING" 500 VERIFICATION_CONTRACT_BROKEN Valeur API interdite + coherence respectee.
TC-NEG-05 nextCheckAfterSeconds=0 ou 86401 avant serialisation de sortie Reponse exposee avec valeur clamp dans [1..86400] Clamp effectif verifie en payload final.
TC-NEG-06 Tentative de transition maillon terminal (OK->PENDING) Rejet metier deterministe Historique de transition refusee.
TC-NEG-07 Tentative de reouverture job (DONE->PENDING) meme proofId Reponse DONE existante retournee a l'identique (pas erreur) Oracle idempotent verifie (absence de rejet).
TC-NEG-09 Configuration pendingResolutionTtl hors bornes (<1h ou >30j) Rejet de configuration ou normalisation selon mecanisme contractuel de config Min/max contractuels verifies.
TC-NEG-11 Absence de worker/cron SLA dans ce perimetre Aucun traitement SLA hors appel API Verification architecture + logs d'execution.

8. Observabilite requise pour les tests

  • Etat systeme: instantanes des etats maillons/job (avant/apres), marqueur proof_finalized, historique de transitions horodate.
  • Reponse API: verificationRequestId, statut HTTP, code metier, schema JSON, presence/absence conditionnelle des champs, conformite enums/casse/regex.
  • Traces techniques: correlation (requestId, proofId) pour erreurs de contrat (VERIFICATION_CONTRACT_BROKEN).
  • Evenement de reclassification: preuve horodatee de PENDING -> INDETERMINATE pendant un appel API de verification.
  • Export probatoire CI: rapport TLA+ (ASSUME), rapport de non-regression, preuves de couverture.

9. Regles non testables

Regle Raison Impact
Politique de versionnement API pour ajout d'enum Regle absente du contrat d'entree; test de conformite de version impossible Majeur
Comportement exige des clients legacy face a PENDING Exigence manquante; non observable cote serveur seul Majeur

10. Verdict QA

  • ✅ Testable totalement sur le perimetre contractuel PD-280 (avec exclusions explicites hors perimetre).