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