Aller au contenu

PD-283 — Scénarios de tests contractuels

1. Références

  • Spécification : PD-283-specification.md
  • Epic : EPIC-XX

2. Matrice de couverture

ID Invariant ID Critère ID Test Couverture Commentaire
INV-283-01 CA-13 TC-INV-01 Oui Audit sandbox post-export + post-échec, aucun clair résiduel hors .pvproof.
INV-283-02 CA-05 TC-INV-02 Oui Streaming disque vérifié via profil mémoire et absence de ZIP RAM complet.
INV-283-03 CA-08 TC-INV-03 Oui Hash SHA3-256 calculé sur conteneur final complet en flux.
INV-283-04 CA-12 TC-INV-04 Oui Notification locale planifiée à T0+24h ±5min.
INV-283-05 CA-13 TC-INV-05 Oui Suppression immédiate des temporaires après usage.
INV-283-06 CA-02 TC-INV-06 Oui Retry borné 3 max, backoff strict 1s/2s/4s.
INV-283-07 CA-07 TC-INV-07 Oui Passthrough strict : égalité binaire des artefacts injectés.
INV-283-08 CA-06 TC-INV-08 Oui pvproof.json première entrée archive, mode STORED.
INV-283-09 CA-09 TC-INV-09 Oui Nom final regex + extension .pvproof exclusivement.
INV-283-10 CA-14 TC-INV-10 Oui Neutralisation zip-slip/path traversal + collision contrôlée.
INV-283-11 CA-04 TC-INV-11 Oui Aucune opération payload avec kmaster direct, usage K_doc uniquement.
INV-283-12 TC-INV-12 Oui Transitions autorisées/interdites respectées sur cycle complet (INV propre, pas rattaché à CA-10 progression).
INV-283-13 CA-13 TC-INV-13 Oui Secrets temporaires protégés au repos, pas de persistance clair durable.
CA-01 TC-NOM-01 Oui Requête export avec proofIds[] valides et traitement réponse.
CA-03 TC-NOM-04 Oui URL expirée => refresh API automatique puis reprise.
CA-10 TC-NOM-05 Oui Progression multi-étapes + compteurs n/N, spinner seul absent.
CA-11 TC-NOM-02 Oui rejectedProofs[] affiché avec décision explicite continuer/annuler.
CA-15 TC-NR-05 Oui Benchmark ref 12 preuves/50MB, P95 < 30s.
CA-16 TC-NR-06 Oui Benchmark ref 50 preuves/200MB, P95 < 60s.

3. Scénarios de test – Flux nominaux

TEST-ID: TC-NOM-01
Référence spec: F-01, CA-01, CA-07, CA-08, CA-09

GIVEN
  - 5 proofIds UUID v4 valides (lowercase normalisé)
  - API POST /exports/complaint-file disponible et répond 200 avec artefacts conformes
  - Stockage local suffisant (> taille export + marge temporaire)
WHEN
  - L’utilisateur lance l’export
THEN
  - L’appel API est émis avec proofIds[] valides
  - Un fichier final est généré avec nom conforme regex contractuelle et extension .pvproof
  - L’archive contient racine attendue + dossiers preuves/ et enveloppes/
  - Le hash final affiché est 64 hex lowercase copiable
AND
  - L’état final atteint READY
  - Les actions Partager/Sauvegarder/Supprimer sont disponibles
TEST-ID: TC-NOM-02
Référence spec: F-02, CA-11

GIVEN
  - 10 preuves demandées, backend retourne 8 valides + rejectedProofs[2] avec motifs
WHEN
  - L’utilisateur choisit "Continuer"
THEN
  - L’app affiche la liste des rejets et motifs avant continuation
  - L’archive finale contient exactement 8 preuves valides et 8 enveloppes associées
AND
  - Aucune tentative de traitement des 2 preuves rejetées
TEST-ID: TC-NOM-03
Référence spec: F-02, ERR-02

GIVEN
  - Toutes les preuves sont rejetées, backend retourne 422
WHEN
  - L’utilisateur lance l’export
THEN
  - Aucun assemblage n’est démarré
  - Aucun fichier .pvproof n’est créé
AND
  - Message explicite de rejet total affiché
  - État revient à IDLE
TEST-ID: TC-NOM-04
Référence spec: F-03, CA-03

GIVEN
  - Export en cours, une signedUrl expire pendant DOWNLOADING
WHEN
  - Le téléchargement échoue pour cause d’expiration
THEN
  - Une nouvelle requête de refresh est émise automatiquement
  - Le flux reprend au prochain artefact non finalisé
AND
  - Aucune entrée archive déjà validée n’est dupliquée
  - Pas de crash ni reset implicite complet
TEST-ID: TC-NOM-05
Référence spec: F-04, machine à états, CA-10

GIVEN
  - Export de N preuves (N>=3)
WHEN
  - L’utilisateur observe la progression durant un cycle complet
THEN
  - Les étapes Téléchargement n/N, Déchiffrement n/N, Assemblage, Finalisation sont visibles
  - Spinner seul sans compteurs/étapes n’est jamais l’unique feedback
AND
  - Les transitions d’état visibles suivent uniquement la table contractuelle
TEST-ID: TC-NOM-06
Référence spec: F-01 étape 8, transitions READY/DELETED

GIVEN
  - Un export est en état READY
WHEN
  - L’utilisateur exécute successivement Partager, Sauvegarder, puis Supprimer
THEN
  - Partager/Sauvegarder opèrent sur le même fichier final inchangé
  - Supprimer supprime irréversiblement le fichier local
AND
  - Transition READY -> DELETED validée, puis transition explicite DELETED -> IDLE

4. Scénarios de test – Cas d’erreur

TEST-ID: TC-ERR-01
Référence spec: ERR-01

GIVEN
  - Compte utilisateur plan FREE
WHEN
  - L’utilisateur lance l’export
THEN
  - Réponse 403 traitée avec message bloquant + CTA Premium
  - Aucun cycle PREPARING/DOWNLOADING ne démarre
AND
  - Aucun artefact local n’est créé
TEST-ID: TC-ERR-02
Référence spec: ERR-03

GIVEN
  - Une signedUrl invalide/non rafraîchie pendant export
WHEN
  - Le téléchargement échoue pour expiration
THEN
  - Refresh API déclenché automatiquement
  - Échec si refresh impossible après politique de retry réseau
AND
  - Absence de corruption d’archive partielle
TEST-ID: TC-ERR-03
Référence spec: ERR-04

GIVEN
  - Backend stockage renvoie 404 ou 410 sur un artefact
WHEN
  - L’app tente le téléchargement de cet artefact
THEN
  - Export abort en FAILED avec message cause + preuve concernée
AND
  - Aucune finalisation/hash final n’est exécutée
TEST-ID: TC-ERR-04
Référence spec: ERR-05, CA-02

GIVEN
  - Réseau intermittent (timeouts transitoires)
WHEN
  - Un téléchargement échoue
THEN
  - Retries appliqués strictement avec backoff 1s puis 2s puis 4s
  - Après 3 tentatives, arrêt et prompt explicite "Réessayer ?"
AND
  - Aucune tentative #4 n’est effectuée
TEST-ID: TC-ERR-05
Référence spec: ERR-06

GIVEN
  - manifest.json invalide OU integrityHash non conforme regex
WHEN
  - La validation contractuelle est exécutée
THEN
  - Export abort avec motif artefact corrompu/non conforme
AND
  - Aucun .pvproof final n’est produit
TEST-ID: TC-ERR-06
Référence spec: ERR-07

GIVEN
  - Espace disque libre insuffisant pour l’export
WHEN
  - L’assemblage démarre
THEN
  - Export abort avec message capacité requise
AND
  - Nettoyage des temporaires tenté immédiatement
TEST-ID: TC-ERR-07
Référence spec: ERR-08

GIVEN
  - Suppression de temporaire échoue (erreur système simulée)
WHEN
  - Fin d’usage du fichier temporaire
THEN
  - Export marqué FAILED sécurité
  - Nouvelle tentative d’export bloquée tant que purge forcée non réussie
AND
  - Journal d’audit indique l’échec de purge
TEST-ID: TC-ERR-08
Référence spec: §3.3 exportId

GIVEN
  - API répond avec exportId hors regex (ex: taille 5 ou caractère interdit)
WHEN
  - Le client valide la réponse
THEN
  - Export abort avec message "identifiant export invalide"
AND
  - Aucun nom de fichier final n’est généré
TEST-ID: TC-ERR-09
Référence spec: §3.3 signedUrl

GIVEN
  - API fournit signedUrl en schéma non-https
WHEN
  - Le client valide l’URL
THEN
  - URL rejetée
  - Refresh API obligatoire déclenché
AND
  - Aucun téléchargement sur schéma non conforme n’est lancé
TEST-ID: TC-ERR-10
Référence spec: §3.4 taille export, warning 500-1024 MB

GIVEN
  - Export estimé à 800 MB (entre 500 et 1024 MB)
WHEN
  - L’assemblage démarre
THEN
  - Un warning est affiché à l’utilisateur avant de continuer
  - L’export peut se poursuivre après confirmation utilisateur
AND
  - Export > 1024 MB est refusé (TC-NEG-06)
TEST-ID: TC-NOM-07
Référence spec: §5.5 transitions annulation, §3.2 machine à états

GIVEN
  - Export en cours (état DOWNLOADING, DECRYPTING ou ASSEMBLING)
WHEN
  - L’utilisateur annule l’export
THEN
  - Transition vers IDLE effectuée
  - Tous les fichiers temporaires sont purgés
AND
  - Aucun fichier .pvproof partiel ne subsiste
TEST-ID: TC-NOM-08
Référence spec: F-01 étape 5, RFC PV-PACK-001

GIVEN
  - Export nominal complet
WHEN
  - L’archive .pvproof est inspectée
THEN
  - `guide_plainte_france.pdf` est présent à la racine de l’archive
  - `README_VERIFICATION.txt` est présent à la racine de l’archive
AND
  - Contenu en passthrough strict (binaire identique à la source)

5. Tests d’invariants (non négociables)

Invariant Test(s) dédiés Observable Commentaire
INV-283-01 TC-INV-01 Scan sandbox post-run Zéro persistance clair hors .pvproof.
INV-283-02 TC-INV-02 Profil mémoire + traces I/O Pic mémoire <50MB, un clair en mémoire max.
INV-283-03 TC-INV-03 Journal hash streaming + checksum externe Hash final calculé en flux sur conteneur complet.
INV-283-04 TC-INV-04 Scheduler notif iOS OU bandeau in-app Planification 24h ±5min si permission OK ; bandeau persistant si permission refusée.
INV-283-05 TC-INV-05 Audit temporaires horodaté Suppression immédiate après usage.
INV-283-06 TC-INV-06 Chronologie retries 3 tentatives max, ½/4s strict.
INV-283-07 TC-INV-07 Comparaison binaire source vs archive Passthrough strict sans altération.
INV-283-08 TC-INV-08 Inspection ZIP central directory pvproof.json 1ère entrée, méthode STORED.
INV-283-09 TC-INV-09 Nom fichier final Regex + extension .pvproof seulement.
INV-283-10 TC-INV-10 Noms archivés neutralisés Aucun .. / \ ni écrasement racine.
INV-283-11 TC-INV-11 Traces crypto instrumentées Aucune décryption payload via kmaster direct.
INV-283-12 TC-INV-12 Journal transitions état Toute transition hors table explicitement rejetée.
INV-283-13 TC-INV-13 Audit stockage secret temporaire Secrets temporaires chiffrés au repos, non persistés en clair.

6. Tests de non-régression

Test ID Objet Observable Commentaire
TC-NR-01 Format nom final Nom conforme regex contractuelle Empêche dérive .zip/suffixe non conforme.
TC-NR-02 Structure archive RFC Arborescence et ordre des entrées inchangés Référence binaire/golden file.
TC-NR-03 Politique retry réseau ½/4s et max 3 stables Détecte boucle infinie/régression UX.
TC-NR-04 Machine à états Aucune transition interdite observée Valide règles retour/downgrade.
TC-NR-05 Performance 12 preuves/50MB P95 < 30s (iPhone12/iOS16+/Wi-Fi stable) CA-15.
TC-NR-06 Performance 50 preuves/200MB P95 < 60s (iPhone12/iOS16+/Wi-Fi stable) CA-16.
TC-NR-07 Pic mémoire assemblage Pic < 50MB Garde-fou anti OOM mobile.
TC-NR-08 Purge temporaires Aucun résiduel post-run Sécurité continue.

7. Tests négatifs et adversariaux

Test ID Entrée invalide / abus Résultat attendu Observable
TC-NEG-01 proofId non UUID v4 Blocage côté app avant appel API Aucun trafic sortant, message utilisateur.
TC-NEG-02 Nom preuve ../../manifest.json Sanitization obligatoire, pas d’écrasement Entrée archive neutralisée.
TC-NEG-03 Nom preuve avec caractères contrôle ASCII Remplacement ou rejet si vide final Motif de rejet explicite.
TC-NEG-04 Deux noms convergeant après sanitization Suffixe collision appliqué sans overwrite Deux entrées distinctes présentes.
TC-NEG-05 integrityHash uppercase/longueur ≠64 Export invalidé et abort Message "artefact non conforme".
TC-NEG-06 .pvproof > 1024MB Refus export Message de limite dépassée.
TC-NEG-07 Tentative transition READY -> DOWNLOADING Transition refusée Journal d’état + UI stable.
TC-NEG-08 Persistance secret temporaire en clair simulée Échec sécurité bloquant Export FAILED + purge exigée.

8. Observabilité requise pour les tests

  • État système : machine à états horodatée (IDLE → …), transitions refusées journalisées.
  • Réponse API : traces requête/réponse (proofIds[], exportId, codes 200/403/422/404/410).
  • Journal d’audit : retries horodatés (½/4s), refresh URL, abort causes, purge temporaires.
  • Événement signé / horodaté : horodatage fiable des événements critiques (début export, finalisation, suppression, planification notification).
  • Export probatoire : inspection ZIP (ordre entrées, méthode STORED, arborescence), hash SHA3-256 recalculable indépendamment.
  • Télémétrie perf : durée end-to-end, P95, pic mémoire, taille export.

9. Règles non testables

Règle Raison Impact
Dérivation exacte exportId8 RÉSOLU — 8 premiers alphanumériques de exportId (§3.3) Majeur
Politique exacte suffixe collision RÉSOLU — suffixe incrémental _2, _3 (ERR-09 §6) Majeur
Fallback notifications refusées RÉSOLU — bandeau in-app persistant (INV-283-04 §4, CA-12) Majeur
Validation structurelle détaillée manifest/chronology Schémas JSON PD-85 non fournis ici — validation limitée à JSON valide + champs 1er niveau Majeur
Critère légal “représentant légal” côté app Exigence citée mais non contractualisée en champ/contrôle testable Mineur

10. Verdict QA

  • ⚠️ Testable partiellement (avec réserves listées)

Les invariants, flux, erreurs et critères d’acceptation sont globalement testables de manière déterministe, sous réserve de clarification des 5 règles non testables ci-dessus (priorité majeure sur exportId8, collisions de noms, fallback notifications, schémas PD-85).