PD-237 - Scenarios de tests contractuels
1. References
- Specification : PD-237-specification.md
- Epic : PD-186 BACKEND CORE
- Dependance normative : PD-54 - Construction d'Arbres de Merkle Periodiques
- Pattern de reference : PD-236 - Recherche backend par tokens deterministes
2. Matrice de couverture
| ID Invariant | ID Critere | ID Test | Couverture | Commentaire |
| INV-BE-01 | CA-03 | TC-INV-01 | Oui | Absence d'evenements en clair (stockage + flux) |
| INV-BE-02 | CA-02 | TC-INV-02 | Oui | Preuve restituee identique a celle persistee |
| INV-BE-03 | - | TC-INV-03 | Oui | Metadonnees immuables par tree_id |
| INV-BE-04 | CA-04 | TC-INV-04 | Oui | Rejet explicite en cas de mismatch metadonnees |
| INV-BE-05 | CA-05 | TC-INV-05 | Oui | Append-only (pas de suppression/modification) |
| - | CA-01 | TC-NOM-01 | Oui | Persistance payload complet et conforme |
| - | CA-02 | TC-NOM-02 | Oui | Recuperation preuve exacte |
| - | CA-03 | TC-NOM-05 | Oui | Inspection stockage (pas de clair) |
| - | CA-04 | TC-INV-04 | Oui | Rejet mismatch metadonnees |
| - | CA-05 | TC-NR-01 | Oui | Non-regression des arbres persistes |
| - | CA-06 | TC-NOM-04 | Oui | Recherche par feuille multi-arbres |
| - | - | TC-ERR-01..08 | Oui | Cas d'erreur contractuels |
3. Scenarios de test - Flux nominaux (TC-NOM-01..XX)
TEST-ID: TC-NOM-01
Reference spec: §5.1, CA-01
GIVEN
- Un arbre clos construit par PD-54
- Un payload complet et conforme contenant:
- merkle_root (format conforme a hash_algorithm_id)
- leaves[] (hashes ordonnes, format conforme)
- inclusion_proofs[] (une preuve par feuille)
- batch_metadata complet (window_start, window_end, window_timezone,
hash_algorithm_id, hash_algorithm_version, canonicalization_id,
leaf_ordering_id)
WHEN
- La persistance est demandee
THEN
- Le backend persiste la racine, les feuilles, les preuves et les metadonnees
AND
- Le backend retourne tree_id et created_at
AND
- Les preuves d'inclusion sont coherentes avec merkle_root (validation deterministe)
AND
- Aucune donnee en clair n'est persistee
TEST-ID: TC-NOM-02
Reference spec: §5.2, CA-02
GIVEN
- Un arbre persiste (tree_id connu)
- Une feuille leaf appartenant a cet arbre
WHEN
- Une requete de recuperation de preuve est effectuee avec (leaf, tree_id)
THEN
- La preuve retournee est strictement identique a la preuve persistee
AND
- merkle_root, batch_metadata et leaf_index correspondent aux donnees persistees
TEST-ID: TC-NOM-03
Reference spec: §5.3
GIVEN
- Un arbre persiste (tree_id connu)
WHEN
- Une requete de recuperation d'arbre complet est effectuee avec tree_id
THEN
- Le backend retourne l'ensemble des donnees persistees
AND
- merkle_root, leaves[], inclusion_proofs[] et batch_metadata sont identiques
TEST-ID: TC-NOM-04
Reference spec: §5.2, CA-06
GIVEN
- Deux arbres T1 et T2 persistes avec une feuille commune leaf_X
- Aucun tree_id fourni dans la requete
WHEN
- Une requete de recuperation par feuille est effectuee avec leaf_X
THEN
- Le backend retourne tous les arbres contenant leaf_X
AND
- L'ensemble des tree_id retournes est exactement {T1, T2}
AND
- L'ordre de retour est deterministe (tree_id croissant)
AND
- Pour chaque arbre retourne, merkle_root, inclusion_proof et batch_metadata
correspondent aux donnees persistees
TEST-ID: TC-NOM-05
Reference spec: CA-03
GIVEN
- Un arbre persiste
WHEN
- Une inspection probatoire des donnees persistees et des flux API est effectuee
THEN
- Aucun evenement en clair n'est observe
AND
- Seuls des hashes, racines et metadonnees sont presents
4. Scenarios de test - Cas d'erreur (TC-ERR-01..08)
TEST-ID: TC-ERR-01
Reference spec: ERR-MK-01
GIVEN
- Un payload de persistance sans merkle_root
WHEN
- La persistance est demandee
THEN
- Le backend rejette explicitement (ERR-MK-01)
AND
- HTTP 400 avec body contenant code ERR-MK-01 et message non vide
AND
- Aucune donnee n'est persistee ni recuperable via l'API
TEST-ID: TC-ERR-02
Reference spec: ERR-MK-02
GIVEN
- Un payload contenant un hash non conforme a hash_algorithm_id
(ex: merkle_root non hexadecimal 64 caracteres pour SHA-256)
WHEN
- La persistance est demandee
THEN
- Le backend rejette explicitement (ERR-MK-02)
AND
- HTTP 400 avec body contenant code ERR-MK-02 et message non vide
AND
- Aucune donnee n'est persistee ni recuperable via l'API
TEST-ID: TC-ERR-08
Reference spec: ERR-MK-02
GIVEN
- Un payload contenant un hash en hex uppercase (ex: merkle_root avec A-F)
WHEN
- La persistance est demandee
THEN
- Le backend rejette explicitement (ERR-MK-02)
AND
- HTTP 400 avec body contenant code ERR-MK-02 et message non vide
AND
- Aucune donnee n'est persistee ni recuperable via l'API
TEST-ID: TC-ERR-03
Reference spec: ERR-MK-03
GIVEN
- Un payload avec batch_metadata absent ou incomplet
WHEN
- La persistance est demandee
THEN
- Le backend rejette explicitement (ERR-MK-03)
AND
- HTTP 400 avec body contenant code ERR-MK-03 et message non vide
AND
- Aucune donnee n'est persistee ni recuperable via l'API
TEST-ID: TC-ERR-04
Reference spec: ERR-MK-04
GIVEN
- Un payload ou inclusion_proofs[].length != leaves[].length
- OU une inclusion_proof invalide ne permettant pas de reconstruire merkle_root
WHEN
- La persistance est demandee
THEN
- Le backend rejette explicitement (ERR-MK-04)
AND
- HTTP 400 avec body contenant code ERR-MK-04 et message non vide
AND
- Aucune donnee n'est persistee ni recuperable via l'API
TEST-ID: TC-ERR-05
Reference spec: ERR-MK-05
GIVEN
- Un tree_id inexistant
WHEN
- Une recuperation d'arbre complet est demandee avec ce tree_id
THEN
- Le backend rejette explicitement (ERR-MK-05 / 404)
AND
- HTTP 404 avec body contenant code ERR-MK-05 et message non vide
AND
- Aucune donnee n'est modifiee
TEST-ID: TC-ERR-06
Reference spec: ERR-MK-06
GIVEN
- Une feuille leaf_inconnue absente des arbres persistes
WHEN
- Une recuperation de preuve est demandee pour leaf_inconnue
THEN
- Le backend rejette explicitement (ERR-MK-06 / 404)
AND
- HTTP 404 avec body contenant code ERR-MK-06 et message non vide
AND
- Aucune donnee n'est modifiee
TEST-ID: TC-ERR-07
Reference spec: ERR-MK-07
GIVEN
- Un arbre T1 deja persiste
- Un payload de persistance contenant tree_id fourni par l'appelant (tree_id de T1)
- Des donnees differentes (merkle_root/proofs/metadata) par rapport a T1
WHEN
- La persistance est demandee avec ce payload
THEN
- Le backend rejette explicitement (ERR-MK-07)
AND
- HTTP 403 avec body contenant code ERR-MK-07 et message non vide
AND
- Un evenement d'audit est emis
AND
- Aucune donnee n'est modifiee ni recuperable via l'API
5. Tests d'invariants (TC-INV-01..05)
| Invariant | Test(s) dedies | Observable | Commentaire |
| INV-BE-01 | TC-INV-01 | Inspection stockage + flux API | Aucun evenement en clair |
| INV-BE-02 | TC-INV-02 | Comparaison byte-to-byte | Preuve identique |
| INV-BE-03 | TC-INV-03 | Metadonnees persistees | Immutabilite batch_metadata |
| INV-BE-04 | TC-INV-04 | Rejet explicite | Mismatch metadonnees |
| INV-BE-05 | TC-INV-05 | Rejet explicite + audit | Append-only |
TEST-ID: TC-INV-01
Reference spec: INV-BE-01
GIVEN
- Un arbre persiste
WHEN
- Les donnees persistees et les payloads API sont inspectes
THEN
- Aucun evenement en clair n'est trouve
AND
- Seuls des hashes, racines et metadonnees sont observes
TEST-ID: TC-INV-02
Reference spec: INV-BE-02
GIVEN
- Un arbre persiste et une feuille leaf
WHEN
- Une recuperation de preuve est effectuee pour leaf
THEN
- La preuve retournee est strictement identique a la preuve persistee
AND
- Aucune normalisation ou transformation n'est observee
TEST-ID: TC-INV-03
Reference spec: INV-BE-03
GIVEN
- Un arbre T1 persiste avec batch_metadata M1
WHEN
- Une tentative est faite de persister T1 avec batch_metadata M2 != M1
THEN
- La requete est rejetee explicitement (ERR-MK-07)
AND
- La recuperation de T1 retourne toujours M1
TEST-ID: TC-INV-04
Reference spec: INV-BE-04
GIVEN
- Un arbre T1 persiste avec batch_metadata M1
- Une requete de persistance pour T1 avec batch_metadata M2 != M1
WHEN
- La requete est soumise
THEN
- Le backend rejette explicitement la requete (ERR-MK-07)
AND
- Aucune donnee n'est modifiee
TEST-ID: TC-INV-05
Reference spec: INV-BE-05
GIVEN
- Un arbre T1 persiste
WHEN
- Une tentative de suppression ou d'ecrasement de T1 est effectuee
THEN
- Le backend rejette explicitement (ERR-MK-07)
AND
- Un evenement d'audit est emis
AND
- T1 reste inchange
6. Tests de non-regression (TC-NR-01..XX)
| Test ID | Objet | Observable | Commentaire |
| TC-NR-01 | Ajout d'un arbre n'altere pas les arbres existants | Recuperation identique avant/apres | Append-only |
| TC-NR-02 | Recherche par feuille stable apres ajout d'autres arbres | Resultats identiques avant/apres | CA-06 |
TEST-ID: TC-NR-01
Reference spec: CA-05
GIVEN
- Un arbre T1 persiste et une preuve P1 connue
WHEN
- Un nouvel arbre T2 est persiste
THEN
- La recuperation de P1 pour T1 retourne toujours les memes donnees
TEST-ID: TC-NR-02
Reference spec: CA-06
GIVEN
- Un arbre T1 persiste contenant leaf_X
WHEN
- Un arbre T2 sans leaf_X est persiste
- Une recherche par leaf_X est effectuee
THEN
- Le resultat retourne correspond toujours a T1 uniquement
7. Tests negatifs et adversariaux (TC-NEG-01..XX)
| Test ID | Entree invalide / abus | Resultat attendu | Observable |
| TC-NEG-01 | Rejeu d'une persistance avec tree_id fourni par l'appelant | Rejet + audit | ERR-MK-07 |
| TC-NEG-02 | Tentative de modification des preuves avec tree_id fourni par l'appelant | Rejet explicite | ERR-MK-07 |
TEST-ID: TC-NEG-01
Reference spec: ERR-MK-07
GIVEN
- Un arbre T1 persiste
WHEN
- Une persistance est rejouee en fournissant le tree_id de T1
- Les donnees soumises different de celles de T1
THEN
- Rejet explicite (ERR-MK-07)
AND
- Evenement d'audit emis
AND
- Aucun effet de bord
TEST-ID: TC-NEG-02
Reference spec: ERR-MK-07
GIVEN
- Un arbre T1 persiste
WHEN
- Une tentative de modification des inclusion_proofs de T1 est soumise avec tree_id fourni par l'appelant
THEN
- Rejet explicite (ERR-MK-07)
AND
- Aucun effet de bord
8. Observabilite requise pour les tests
- Reponses d'API incluant ERR-MK-xx et raison contractuelle.
- Statuts HTTP et body contenant code + message non vide.
- Acces aux donnees persistees (merkle_root, leaves[], inclusion_proofs[], batch_metadata).
- Capacite de recuperer un arbre complet par tree_id.
- Capacite de recuperer une preuve par leaf (+ tree_id optionnel).
- Journal d'audit pour ERR-MK-07.
- Possibilite de comparer byte-to-byte les hashes et preuves retournes.
- Capacite de verifier qu'aucune donnee associee a un payload rejete n'est recuperable via l'API.
- Format de inclusion_proof observable : array ordonne de hashes (hex lowercase) du niveau feuille vers racine.
9. Regles non testables
| Regle / Point | Raison | Impact |
| Neant | Tous les points du present document sont testables | - |
10. Verdict QA
✅ Testable
- Tous les invariants INV-BE-01..05 et criteres CA-01..06 sont testables avec les scenarios definis.
- Aucune regle non testable n'est identifiee dans ce document.