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).