PD-72 — Scénarios de tests contractuels
1. Références
- Spécification :
PD-72-specification.md - Epic : PD-189 — CRYPTO
2. Matrice de couverture
| ID Invariant | ID Critère | ID Test | Couverture | Commentaire |
| INV-01 | CA-01 | TC-INV-01 | Oui | Vérifie immutabilité K_docEntreprise pendant flux nominal salarié lisible. |
| INV-02 | CA-01 | TC-INV-02 | Oui | Vérifie absence de déchiffrement + résultat fonctionnel salarié. |
| INV-03 | CA-06 | TC-INV-03 | Oui | Vérifie zeroization immédiate des artefacts PRE temporaires. |
| INV-04 | CA-06 | TC-INV-04 | Oui | Vérifie absence de persistance en clair (DB, logs, queue, stockage). |
| INV-05 | CA-04 | TC-INV-05 | Oui | Vérifie append-only + signature HSM + Merkle + ancrage confirmé. |
| INV-06 | CA-02 | TC-NOM-02 | Oui | Vérifie révocation entreprise en policy transfer. |
| INV-07 | CA-03 | TC-ERR-05 | Oui | Vérifie unicité événement/signature/acte sur replay. |
| INV-07 | CA-05 | TC-NR-01 | Oui | Vérifie idempotence sur relance du même job. |
| INV-08 | CA-08 | TC-INV-08 | Oui | Vérifie refus explicite de transitions interdites + log. |
| INV-09 | CA-03 | TC-INV-09 | Oui | Vérifie séparation auteur/validateur sur preuve/gate. |
| — | CA-07 | TC-NR-03 | Oui | Vérifie SLA P95 transfert hors batch ≤ 3000 ms. |
| — | CA-09 | TC-ERR-07 | Oui | Vérifie arrêt auto à retry_count=3 et terminalité FAILED. |
| — | CA-10 | TC-NOM-04 | Oui | Vérifie notification neutre sans contenu sensible. |
| — | CA-04 | TC-ERR-08 | Oui | Vérifie timeout ancrage → FAILED + alerte ops. |
| — | — | TC-ERR-09 | Oui | Vérifie transition BLOCKED_WAITING_CONSENT → READY_FOR_TRANSFER. |
| — | — | TC-ERR-10 | Oui | Vérifie rejet si source_vault_id non autorisé. |
| — | — | TC-ERR-11 | Oui | Vérifie backoff exponentiel sur retry. |
3. Scénarios de test – Flux nominaux
TEST-ID: TC-NOM-01
Référence spec: Flux nominal copy, CA-01, CA-03, CA-04
GIVEN
- Document éligible RH à l’état SEALED
- employee_consent = TRUE
- transfer_policy = copy
- Compte salarié actif et clé publique certifiée
WHEN
- Le job BullMQ pre-transfer est exécuté une seule fois
THEN
- DocumentTransfer atteint ANCHOR_CONFIRMED
- Le salarié peut ouvrir le document depuis son coffre (lecture valide)
AND
- Un seul événement TRANSFER_EMPLOYEE signé est présent pour DocumentTransfer.id
- proof_id est résolu et tx_id est renseigné à confirmation d’ancrage
- L’accès entreprise reste autorisé (policy copy)
TEST-ID: TC-NOM-02
Référence spec: Flux nominal transfer, INV-06, CA-02
GIVEN
- Document SEALED, employee_consent = TRUE, transfer_policy = transfer
- Préconditions métier valides
WHEN
- Le transfert est mené jusqu’à finalisation probatoire
THEN
- État final ANCHOR_CONFIRMED
- L’accès salarié est autorisé
AND
- Toute tentative d’accès entreprise au contenu est refusée après finalisation
- La révocation entreprise est tracée en audit
TEST-ID: TC-NOM-03
Référence spec: PRE-05, Flux nominal étape 7-8
GIVEN
- Événement TRANSFER_EMPLOYEE signé
- Inclusion Merkle effectuée
- Confirmation blockchain indisponible à l’instant t
WHEN
- Le traitement nominal se termine sans confirmation batch
THEN
- État PROOF_PENDING_ANCHOR
AND
- Aucune régression d’accès salarié
- Aucun rollback du transfert n’est effectué
TEST-ID: TC-NOM-04
Référence spec: CA-10
GIVEN
- Un transfert réussi (copy ou transfer)
WHEN
- La notification salarié in-app et email est émise
THEN
- Le message ne contient ni document, ni clé, ni hash sensible, ni payload documentaire
AND
- Le contenu reste strictement informatif (référence de remise non sensible)
4. Scénarios de test – Cas d’erreur
TEST-ID: TC-ERR-01
Référence spec: PRE-01
GIVEN
- Salarié sans compte actif
WHEN
- La vérification des préconditions est exécutée
THEN
- Rejet métier PRE-01
- État cible BLOCKED_WAITING_CONSENT
AND
- Aucun artefact probatoire final (signature, acte, ancrage) n’est créé
TEST-ID: TC-ERR-02
Référence spec: PRE-02
GIVEN
- Clé publique salarié invalide ou non certifiée
WHEN
- Le worker valide les préconditions cryptographiques
THEN
- Rejet PRE-02 explicite
- État FAILED
AND
- Alerte sécurité journalisée
- Aucun passage en TRANSFERRED
TEST-ID: TC-ERR-03
Référence spec: PRE-03, CA-09
GIVEN
- HSM indisponible de manière persistante
- retry_count initial à 0
WHEN
- Le job est relancé automatiquement jusqu’à la limite
THEN
- 3 tentatives max sont observées
- retry_count = 3
AND
- État final FAILED terminal
- Aucune 4e relance automatique
TEST-ID: TC-ERR-04
Référence spec: PRE-04
GIVEN
- TSA indisponible temporairement, puis redevenu disponible avant tentative 3
WHEN
- Le job échoue puis est relancé automatiquement
THEN
- Reprise réussie dans la fenêtre de retry autorisée
AND
- Pas de duplication d’événement TRANSFER_EMPLOYEE
TEST-ID: TC-ERR-05
Référence spec: PRE-06, INV-07, CA-03, CA-05
GIVEN
- DocumentTransfer.id déjà finalisé (ANCHOR_CONFIRMED)
WHEN
- Le même message de traitement est rejoué
THEN
- Rejet idempotent explicite PRE-06
- État inchangé
AND
- Aucun nouvel événement signé, aucun nouvel acte, aucun nouvel ancrage logique
TEST-ID: TC-ERR-06
Référence spec: PRE-07, §5.1 formats
GIVEN
- Payload d’entrée invalide (ex: hash_doc non conforme regex)
WHEN
- La création d’événement probatoire est demandée
THEN
- Rejet strict format invalide
- Journal sécurité émis
AND
- Refus de création d’artefact probatoire associé
TEST-ID: TC-ERR-07
Référence spec: PRE-08, CA-09
GIVEN
- retry_count déjà à 3
WHEN
- Une relance automatique est tentée
THEN
- Refus automatique immédiat
- État reste FAILED terminal
AND
- Escalade manuelle requise et tracée
5. Tests d’invariants (non négociables)
| Invariant | Test(s) dédiés | Observable | Commentaire |
| INV-01 | TC-INV-01 | Empreinte K_docEntreprise identique avant/après job | Aucune mutation autorisée. |
| INV-02 | TC-INV-02 | Absence d’opération de déchiffrement dans traces d’appels modules + absence de payload clair | Vérifie Zero-Knowledge opérationnel. |
| INV-03 | TC-INV-03 | Artefact PRE temporaire non récupérable post re-chiffrement (contrôle immédiat) | Zeroization immédiate obligatoire. |
| INV-04 | TC-INV-04 | Scan stockage/logs/queues sans secret temporaire en clair | Envelope encryption obligatoire. |
| INV-05 | TC-INV-05 | Chaîne append-only + signature HSM + Merkle root + tx_id d’ancrage | Non-répudiation complète. |
| INV-06 | TC-NOM-02 | Accès entreprise refusé après finalisation en policy transfer | Révocation métier RGPD. |
| INV-07 | TC-ERR-05, TC-NR-01 | Compteurs artefacts stables au replay/retry | Pas de doublon logique. |
| INV-08 | TC-INV-08 | Toute transition non listée rejetée + log explicite | Machine d’états fermée. |
| INV-09 | TC-INV-09 | Métadonnées auteur != validateur dans dossier preuve/gate | Validation croisée obligatoire. |
6. Tests de non-régression
| Test ID | Objet | Observable | Commentaire |
| TC-NR-01 | Idempotence relance même job | Aucun artefact supplémentaire, état stable | Garde-fou anti-régression INV-07. |
| TC-NR-02 | Interdictions de retours d’état | Rejets explicites: TRANSFERRED→TRANSFER_IN_PROGRESS, etc. | Protège la finalité probatoire. |
| TC-NR-03 | Performance nominale | P95 latence hors batch ≤ 3000 ms sur jeu de charge contractuel | Couvre CA-07. |
| TC-NR-04 | Verrou policy en cours de transfert | Tentative downgrade transfer→copy rejetée après TRANSFER_IN_PROGRESS | Verrou contractuel. |
| TC-NR-05 | Retry borné | Aucune relance auto au-delà de 3 | Couvre CA-09 durablement. |
7. Tests négatifs et adversariaux
| Test ID | Entrée invalide / abus | Résultat attendu | Observable |
| TC-NEG-01 | UUID non v4 pour DocumentTransfer.id | Rejet strict | Erreur validation format + log sécurité |
| TC-NEG-02 | rk_id hors charset (espace/Unicode) | Rejet + alerte sécurité | Aucun traitement PRE lancé |
| TC-NEG-03 | Forçage transition ANCHOR_CONFIRMED -> PROOF_PENDING_ANCHOR | Rejet explicite | Log transition interdite |
| TC-NEG-04 | Tempête de replay concurrente (N messages identiques) | 1 seul résultat logique | Unicité événement/signature/acte/ancrage |
| TC-NEG-05 | Tentative persistance secret temporaire en clair via payload malveillant | Rejet ou chiffrement obligatoire | Absence de secret clair au repos |
7b. Scénarios ajoutés v2 (corrections spec)
TEST-ID: TC-ERR-08
Référence spec: §10.3 SLA ancrage, ANCHOR_TIMEOUT_HOURS
GIVEN
- Un transfert finalisé en état PROOF_PENDING_ANCHOR
- ANCHOR_TIMEOUT_HOURS configuré à 1h (min)
WHEN
- Le délai de 1h est dépassé sans confirmation batch
THEN
- Transition vers FAILED
AND
- Alerte ops émise
- Escalade manuelle requise
TEST-ID: TC-ERR-09
Référence spec: §5.2 BLOCKED_WAITING_CONSENT → READY_FOR_TRANSFER
GIVEN
- Un DocumentTransfer en état BLOCKED_WAITING_CONSENT (salarié sans compte)
WHEN
- Le salarié crée un compte et employee_consent = TRUE
THEN
- Transition vers READY_FOR_TRANSFER autorisée
AND
- Le flux nominal reprend normalement
- Notification RH de déblocage envoyée (1 seul email, pas de répétition)
TEST-ID: TC-ERR-10
Référence spec: §5.2 Vérification autorisation émetteur
GIVEN
- Un événement DOCUMENT_SEALED reçu
- Le source_vault_id ne correspond PAS au propriétaire du document
WHEN
- Le worker tente de créer un DocumentTransfer
THEN
- Rejet avec erreur d'autorisation
AND
- Alerte sécurité journalisée
- Aucun DocumentTransfer créé
TEST-ID: TC-ERR-11
Référence spec: §5.2 Backoff exponentiel retry
GIVEN
- Un transfert en FAILED avec retry_count = 1 (erreur récupérable PRE-03)
WHEN
- Le retry automatique est déclenché
THEN
- Le délai avant retry est >= base_delay * 2^1 = 60s
AND
- Le retry_count est incrémenté à 2
8. Observabilité requise pour les tests
- État système : snapshots
DocumentTransfer (avant/après), transitions horodatées, retry_count, completed_at. - Réponse API / worker result : code métier (
PRE-xx), motif de rejet, id de corrélation. - Journal d’audit : entrées append-only, événements de transition interdite, événements sécurité format/replay.
- Événement signé / horodaté :
TRANSFER_EMPLOYEE, validation signature HSM, token TSA, lien Merkle. - Export probatoire : résolution
proof_id, présence tx_id, preuve de non-duplication par DocumentTransfer.id. - Mesures perf : distribution latence (P50/P95/P99), périmètre hors batch explicitement isolé.
9. Règles non testables
| Règle | Raison | Impact |
| Opposabilité juridique finale | Explicitement hors périmètre logiciel testable | Mineur |
Note v2 : Les 4 ambiguïtés bloquantes/majeures de v1 (SLA ancrage, format hsm_signature, format tx_id, notification RH) ont été clarifiées dans la spec v2 §10.4 et sont désormais testables (cf. TC-ERR-08, TC-ERR-09, TC-ERR-10).
10. Verdict QA
- ⚠️ Testable partiellement (avec réserves listées)
Les scénarios couvrent tous les invariants INV-01..INV-09 et tous les critères CA-01..CA-10.
La conformité complète reste conditionnée à la levée des 4 ambiguïtés contractuelles bloquantes/majeures de la section 9.