Aller au contenu

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.