Aller au contenu

PD-253 — Scenarios de tests contractuels

1. References

  • Specification : PD-253-specification.md
  • Epic : EPIC-XX

2. Matrice de couverture

ID Invariant ID Critere ID Test Couverture Commentaire
INV-253-01-exhaustivite CA-253-01 TC-NOM-01 Oui Verifie exhaustivite GLOBAL sans succes partiel silencieux.
INV-253-02-proof-complete CA-253-02 TC-NOM-02, TC-ERR-06 Oui TC-NOM-02: completude nominale; TC-ERR-06: detection asynchrone ProofEnvelope invalide => FAILED.
INV-253-03-dual-hash CA-253-02 TC-NOM-03 Oui Verifie plaintext_hash + ciphertext_hash et reference Merkle sur ciphertext_hash.
INV-253-04-dual-manifest CA-253-03 TC-NOM-04 Oui Verifie presence des deux manifests obligatoires.
INV-253-05-integrite-package CA-253-04 TC-ERR-12 Oui Verifie detection de corruption package via manifests.
INV-253-06-signature-optionnelle CA-253-11 TC-NOM-05 Oui Verifie validite niveau standard sans export.sig.
INV-253-06-signature-optionnelle N/A TC-NOM-06 Partielle Verifie presence export.sig => niveau strong; perimetre exact de signature restant a clarifier.
INV-253-07-quota-concurrence CA-253-05 TC-ERR-04 Oui Verifie rejet second export actif (409).
INV-253-08-pending-anchor CA-253-06 TC-NOM-07 Oui Verifie conservation statut pending dans metadata exportee.
INV-253-09-deleted-destruction CA-253-07 TC-NOM-08 Oui Verifie inclusion soft-deleted + exclusion destroyed + trace destruction-log.json.
INV-253-10-audit-fail-closed CA-253-08 TC-ERR-07 Oui Verifie refus creation export si audit indisponible.
INV-253-11-envelope-encryption N/A TC-INV-11 Oui Verifie chiffrement au repos des artefacts temporaires sensibles.
INV-253-12-no-residuals N/A TC-INV-12 Oui Verifie absence de residus hors fenetre de retention contractuelle.
INV-253-13-transitions CA-253-10 TC-NOM-09, TC-NOM-13, TC-NOM-14 Oui TC-NOM-09: transitions autorisees/interdites + terminaux; TC-NOM-13/14: annulation depuis REQUESTED et ASSEMBLING.
INV-253-14-atomicite-sync-async N/A TC-NOM-10 Oui Verifie separation ACID sync vs post-traitements async retry-safe.
N/A CA-253-09 TC-NOM-11 Oui Verifie expiration package (EXPIRED) et purge staging.
N/A — Acces inter-utilisateur N/A TC-SEC-01 Oui Verifie 403 FORBIDDEN_EXPORT_ACCESS sur GET/download/DELETE d'un export appartenant a un autre utilisateur.
N/A CA-253-12 TC-NOM-12 Partielle Verifie non-degradation P95 <= 20% si environnement de reference instrumente.

3. Scenarios de test - Flux nominaux

TEST-ID: TC-NOM-01
Reference spec: INV-253-01, CA-253-01

GIVEN
  - Dataset fige et versionne contenant documents actifs, soft-deleted, et destroyed legalement
  - Comptage source des documents eligibles etabli avant execution
WHEN
  - Creation d'un export avec `scope=GLOBAL`
  - Attente de l'etat `READY_FOR_DOWNLOAD`
THEN
  - Le nombre de documents exportes eligibles == comptage source
  - Aucun document eligible n'est omis
AND
  - Aucun "succes partiel" n'est observe: si mismatch, l'etat final est `FAILED` et non `READY_FOR_DOWNLOAD`
TEST-ID: TC-NOM-02
Reference spec: INV-253-02, CA-253-02

GIVEN
  - Export `READY_FOR_DOWNLOAD` genere sur dataset nominal
WHEN
  - Inspection de chaque metadata document exporte
THEN
  - Chaque document inclus contient une ProofEnvelope complete (hashes, preuve Merkle, TSA, signature serveur, ancrage blockchain selon contrat amont)
AND
  - Toute enveloppe incomplete rend le test non conforme
TEST-ID: TC-NOM-03
Reference spec: INV-253-03, CA-253-02

GIVEN
  - Export `READY_FOR_DOWNLOAD` nominal
WHEN
  - Validation syntaxique et cryptographique des hashes
THEN
  - `plaintext_hash` et `ciphertext_hash` matchent `^[a-f0-9]{64}$`
  - Recalcul SHA3-256 confirme la valeur attendue sur echantillon deterministe
AND
  - La preuve Merkle reference `ciphertext_hash` (et non `plaintext_hash`)
TEST-ID: TC-NOM-04
Reference spec: INV-253-04, CA-253-03

GIVEN
  - Export package produit
WHEN
  - Inspection du contenu racine BagIt
THEN
  - `manifest-sha256.txt` est present
  - `manifest-sha3.txt` est present
AND
  - Les chemins en manifests sont relatifs, sans `..`, avec separateur `/`
TEST-ID: TC-NOM-05
Reference spec: INV-253-06, CA-253-11

GIVEN
  - Export genere sans `export.sig`
WHEN
  - Verification offline des manifests
THEN
  - Le package est valide au niveau probatoire `standard`
AND
  - L'absence de signature HSM ne bloque pas la reversibilite
TEST-ID: TC-NOM-06
Reference spec: INV-253-06

GIVEN
  - Export genere avec `export.sig`
WHEN
  - Verification de presence et du statut probatoire
THEN
  - Le package est classe `strong` si signature valide
AND
  - Le package reste au minimum `standard` si verification strong indisponible
TEST-ID: TC-NOM-07
Reference spec: INV-253-08, CA-253-06

GIVEN
  - Un document source avec `blockchain_anchor.status=pending`
WHEN
  - Export du perimetre incluant ce document
THEN
  - Le document est inclus
  - Le statut exporte reste exactement `pending`
AND
  - Aucun "upgrade" implicite vers `anchored` n'est observe
TEST-ID: TC-NOM-08
Reference spec: INV-253-09, CA-253-07

GIVEN
  - Dataset contenant au moins un `soft-deleted` et un document detruit legalement
WHEN
  - Export du perimetre complet
THEN
  - Les `soft-deleted` sont presents avec marquage explicite
  - Les documents detruits legalement sont absents du payload principal
AND
  - Chaque document detruit est trace dans `destruction-log.json` avec `destruction_act_hash` valide
TEST-ID: TC-NOM-09
Reference spec: INV-253-13, CA-253-10

GIVEN
  - Un export dans chaque etat contractuel
WHEN
  - Tentative de transitions autorisees puis interdites
THEN
  - Seules les transitions explicites de la specification sont acceptees
  - Toute sortie depuis `DOWNLOADED|EXPIRED|FAILED|FAILED_TIMEOUT|CANCELLED` est rejetee
AND
  - Le rejet est observable via code erreur + etat inchange
TEST-ID: TC-NOM-10
Reference spec: INV-253-14

GIVEN
  - Mecanisme de chaos test deterministe (crash pre-commit, post-commit/pre-async)
WHEN
  - Injection de panne aux points contractuels
THEN
  - Crash pre-commit => rollback complet, aucune trace d'export incoherente
  - Crash post-commit/pre-async => DB coherente, reprise worker possible sans doublon
AND
  - Les post-traitements async sont idempotents et retry-safe
TEST-ID: TC-NOM-11
Reference spec: CA-253-09

GIVEN
  - Export en `READY_FOR_DOWNLOAD` non telecharge
  - TTL package configure a une valeur de test connue
WHEN
  - Attente depassement TTL retention
THEN
  - Etat export passe `EXPIRED`
  - Objet package est purge du staging
AND
  - Une tentative d'acces retourne `410 EXPORT_EXPIRED`
TEST-ID: TC-NOM-12
Reference spec: CA-253-12

GIVEN
  - Environnement de reference prod nominale instrumente P95
  - Charge metier de baseline puis charge metier + exports concurrents conformes quota
WHEN
  - Execution campagne de performance reproductible
THEN
  - Degradation P95 API metier hors export <= 20%
AND
  - Si >20%, verdict non conforme
TEST-ID: TC-NOM-13
Reference spec: §5.5 flux Annulation, INV-253-13

GIVEN
  - Export en etat `REQUESTED`
  - Appel `DELETE /exports/{export_id}` par l'utilisateur proprietaire
WHEN
  - Traitement de la demande d'annulation
THEN
  - Etat final `CANCELLED`
  - Code reponse `200` ou `204`
  - Trace d'audit emise pour l'annulation
AND
  - L'export n'est plus comptabilise dans le quota actif
TEST-ID: TC-NOM-14
Reference spec: §5.5 flux Annulation, INV-253-13

GIVEN
  - Export en etat `ASSEMBLING` (worker en cours)
  - Appel `DELETE /exports/{export_id}` par l'utilisateur proprietaire
WHEN
  - Traitement de la demande d'annulation (checkpoint worker)
THEN
  - Si le worker n'a pas encore produit le package: etat final `CANCELLED`
  - Si le worker a deja produit le package: etat conserve `READY_FOR_DOWNLOAD` (idempotence)
AND
  - Dans les deux cas, la reponse est coherente avec l'etat final observe
TEST-ID: TC-SEC-01
Reference spec: §5.7 controles acces, 403 FORBIDDEN_EXPORT_ACCESS

GIVEN
  - Export appartenant a l'utilisateur A
  - Appel par l'utilisateur B (authentifie, token valide, mais non proprietaire)
WHEN
  - GET /exports/{export_id} (statut)
  - Tentative de telechargement URL signee
  - DELETE /exports/{export_id} (annulation)
THEN
  - Chaque appel retourne `403 FORBIDDEN_EXPORT_ACCESS`
  - Aucune metadata de l'export A n'est exposed a B
AND
  - Aucune fuite inter-utilisateur observable

4. Scenarios de test - Cas d'erreur

TEST-ID: TC-ERR-01
Reference spec: 400 INVALID_SCOPE_OR_FILTER

GIVEN
  - Requete avec enum scope invalide, UUID invalide, ou `from > to`
WHEN
  - Soumission de la creation d'export
THEN
  - Reponse `400 INVALID_SCOPE_OR_FILTER`
  - Aucun export cree
TEST-ID: TC-ERR-02
Reference spec: 401 UNAUTHENTICATED

GIVEN
  - Requete sans authentification valide
WHEN
  - Appel creation export
THEN
  - Reponse `401 UNAUTHENTICATED`
  - Aucun export cree, aucun package genere
TEST-ID: TC-ERR-03
Reference spec: 403 FORBIDDEN_SCOPE

GIVEN
  - Utilisateur authentifie tentant un coffre non proprietaire
WHEN
  - Appel creation export `VAULT/SELECTION`
THEN
  - Reponse `403 FORBIDDEN_SCOPE`
  - Aucune fuite de metadata inter-tenant
TEST-ID: TC-ERR-04
Reference spec: INV-253-07, CA-253-05, 409 EXPORT_ALREADY_ACTIVE

GIVEN
  - Un export actif (`REQUESTED` ou `ASSEMBLING` ou `READY_FOR_DOWNLOAD`) pour l'utilisateur
WHEN
  - Nouvelle demande export par le meme utilisateur
THEN
  - Reponse `409 EXPORT_ALREADY_ACTIVE`
  - Aucun second export actif cree
TEST-ID: TC-ERR-05
Reference spec: 413 EXPORT_SIZE_LIMIT_EXCEEDED

GIVEN
  - Estimation package > limite max contractuelle
WHEN
  - Creation export
THEN
  - Reponse `413 EXPORT_SIZE_LIMIT_EXCEEDED`
  - Aucun passage a `ASSEMBLING`
TEST-ID: TC-ERR-06
Reference spec: 500 PACKAGE_ASSEMBLY_FAILED, INV-253-02

GIVEN
  - Un document eligible avec ProofEnvelope manquante ou invalide (detection asynchrone)
WHEN
  - Assemblage export (worker)
THEN
  - Etat final `FAILED`
  - `failure_reason: PROOF_ENVELOPE_INCOMPLETE` observable dans les metadonnees de l'export
  - Pas de package final valide publie, pas d'URL signee emise
AND
  - La detection est asynchrone (post-commit DB): aucun code 422 n'est emis a la creation
TEST-ID: TC-ERR-07
Reference spec: INV-253-10, CA-253-08, 500 AUDIT_WRITE_FAILED

GIVEN
  - Service audit indisponible
WHEN
  - Creation d'export
THEN
  - Reponse `500 AUDIT_WRITE_FAILED`
  - Aucun `export_id` persiste
  - Aucun job async n'est planifie
TEST-ID: TC-ERR-08
Reference spec: 500 PACKAGE_ASSEMBLY_FAILED

GIVEN
  - Defaut technique injecte pendant assemblage package
WHEN
  - Traitement worker
THEN
  - Etat final `FAILED`
  - Erreur `500 PACKAGE_ASSEMBLY_FAILED` observable cote statut
TEST-ID: TC-ERR-09
Reference spec: 504 EXPORT_TIMEOUT

GIVEN
  - Job depassant `export_job_timeout`
WHEN
  - Controle timeout worker
THEN
  - Etat final `FAILED_TIMEOUT`
  - Code `504 EXPORT_TIMEOUT`
TEST-ID: TC-ERR-10
Reference spec: 410 DOWNLOAD_URL_EXPIRED

GIVEN
  - URL signee depassee (`download_url_ttl`)
WHEN
  - Tentative de telechargement
THEN
  - Reponse `410 DOWNLOAD_URL_EXPIRED`
  - Etat package inchange
TEST-ID: TC-ERR-11
Reference spec: 410 EXPORT_EXPIRED

GIVEN
  - Package purge apres retention TTL
WHEN
  - Tentative de telechargement via statut export
THEN
  - Reponse `410 EXPORT_EXPIRED`
  - Objet staging absent
TEST-ID: TC-ERR-12
Reference spec: INV-253-05, CA-253-04

GIVEN
  - Package export initialement valide
WHEN
  - Alteration d'un fichier payload ou metadata post-generation
THEN
  - Verification de manifeste echoue
  - Le package est declare invalide

5. Tests d'invariants (non negociables)

Invariant Test(s) dedies Observable Commentaire
INV-253-01-exhaustivite TC-NOM-01 Egalite comptage source/exports eligibles; pas de succes partiel Invariant central NF Z42-013.
INV-253-02-proof-complete TC-NOM-02, TC-ERR-06 Presence complete de l'enveloppe probatoire (exception: pending anchor accepte avec tx_id: null) Toute incompletude autre que pending est bloquante.
INV-253-03-dual-hash TC-NOM-03 Deux hashes valides + lien Merkle sur ciphertext_hash Controle de coherence cryptographique.
INV-253-04-dual-manifest TC-NOM-04 Presence des 2 manifests Obligatoire pour conformite package.
INV-253-05-integrite-package TC-ERR-12 Corruption detectee a la verification Detection d'alteration offline.
INV-253-06-signature-optionnelle TC-NOM-05, TC-NOM-06 standard valide sans export.sig; strong avec signature Portabilite sans dependance HSM.
INV-253-07-quota-concurrence TC-ERR-04 Rejet second export actif (409) Anti-abus contractuel strict.
INV-253-08-pending-anchor TC-NOM-07 Statut pending conserve a l'export Aucune transformation implicite.
INV-253-09-deleted-destruction TC-NOM-08 Inclusion soft-deleted, exclusion destroyed, trace destruction Double regle inclusion/exclusion.
INV-253-10-audit-fail-closed TC-ERR-07 Echec audit => creation refusee Fail-closed obligatoire.
INV-253-11-envelope-encryption TC-INV-11 Artefacts temporaires sensibles chiffr es au repos Aucun secret persistant en clair.
INV-253-12-no-residuals TC-INV-12 Aucun residu hors retention autorisee Couvre succes/echec/crash.
INV-253-13-transitions TC-NOM-09 Matrice transitions strictement respectee Etats terminaux fermes.
INV-253-14-atomicite-sync-async TC-NOM-10 ACID sync + async rattrapable/idempotent Separation multi-composant verifiable.
TEST-ID: TC-INV-11
Reference spec: INV-253-11

GIVEN
  - Export en cours avec instrumentation securite activable
WHEN
  - Inspection des artefacts temporaires persistants (stockage local/staging/DB)
THEN
  - Aucun secret (`key`, `fragment`, `DEK`, `ReKey`, package temporaire sensible) n'est stocke en clair
AND
  - Toute persistance sensible est chiffree au repos selon politique contractuelle
TEST-ID: TC-INV-12
Reference spec: INV-253-12

GIVEN
  - Trois executions: succes, echec technique, crash simule
WHEN
  - Verification des emplacements temporaires apres fenetre de retention contractuelle
THEN
  - Aucun fichier temporaire non requis ne subsiste
AND
  - Les artefacts conserves sont uniquement ceux explicitement autorises par retention

6. Tests de non-regression

Test ID Objet Observable Commentaire
TC-NR-01 Non-regression des 4 scopes (GLOBAL,VAULT,PERIOD,SELECTION) Resultats conformes au perimetre sans fuite ni omission Verifie stabilite fonctionnelle transverse.
TC-NR-02 Non-regression des formats contractuels UUID/enum/dates/hashes/manifests conformes regex et regles Evite derives de schema export.
TC-NR-03 Non-regression machine a etats Transitions interdites toujours rejetees Protection contre regressions de workflow.
TC-NR-04 Non-regression integrite offline Verification manifests continue de detecter toute alteration Garantie probatoire durable.
TC-NR-05 Non-regression performance metier P95 hors export reste <= +20% Controle de capacite en charge.

7. Tests negatifs et adversariaux

Test ID Entree invalide / abus Resultat attendu Observable
TC-NEG-01 scope=global (minuscule) au lieu de GLOBAL 400 INVALID_SCOPE_OR_FILTER Rejet enum case-sensitive.
TC-NEG-02 UUID malformed (export_id,vault_id,document_id) 400 INVALID_SCOPE_OR_FILTER Rejet regex UUID v4.
TC-NEG-03 plaintext_hash ou ciphertext_hash en uppercase/longueur != 64 Export FAILED avec failure_reason observable Non-conformite hash detectee a l'assemblage.
TC-NEG-04 Lignes manifeste avec chemin ../ Package invalide Verification manifeste rejette le package.
TC-NEG-05 Injection d'un second export concurrent via requetes simultanees Une seule creation accepte e Un seul export actif persiste, autre 409.
TC-NEG-06 Tentative de transition terminale (FAILED -> ASSEMBLING) Rejet de transition Etat inchange + erreur explicite.
TC-NEG-07 Manipulation metadata anchor (pending force a anchored) Test KO Mismatch metadata source/export detecte.
TC-NEG-08 Requete hors tenant (ID valide mais non proprietaire) 403 FORBIDDEN_SCOPE Aucun document d'autrui visible.

8. Observabilite requise pour les tests

  • Etat systeme : etats export (REQUESTED...CANCELLED), presence/absence package staging, retention/expiration effectives.
  • Reponse API : codes et payloads d'erreur contractuels (400/401/403/409/413/500/504/410) + identifiants d'export. Note: 422 supprime (detection ProofEnvelope incomplete = asynchrone, etat FAILED avec failure_reason).
  • Journal d'audit : evenement de creation obligatoire, trace fail-closed, traces transitions d'etat.
  • Evenement signe / horodate : preuves TSA/sig serveur/ancrage blockchain presentes et horodatees selon contrats amont.
  • Export probatoire : contenu BagIt, dual manifests, metadata documents, destruction-log.json, export.sig si niveau strong.
  • Metriques performance : P95 baseline vs charge export dans environnement de reference stabilise.

9. Regles non testables

Regle Raison Impact
Perimetre cryptographique exact couvert par export.sig (PC-253-01) La spec mentionne une option provisoire non confirmee securite/crypto; criteres exacts de verification strong incomplets Majeur
Politique de purge anticipee apres telechargement (PC-253-02) Le comportement contractuel definitif "retention independante vs suppression immediate" n'est pas tranche Majeur
Canal de notification hors polling (PC-253-03) Le contrat minimal impose polling, mais email/push n'est pas confirme; non testable sans exigence figee Mineur
Validation CA-253-12 si metriques P95 absentes (H-253-04) Sans environnement instrumente de reference, la mesure objective de degradation n'est pas possible Bloquant

10. Verdict QA

  • ⚠️ Testable partiellement (avec reserves listees)

Le contrat est majoritairement testable de facon deterministe (invariants, erreurs, etats, integrite, reversibilite standard). Les reserves portent sur les points ouverts de specification (export.sig, purge post-download) et sur la disponibilite effective des metriques P95 pour CA-253-12.