Aller au contenu

PD-250 — Tests & Validation — Job destruction définitive et bordereau (v4)

1. Matrice de couverture

Invariants → Tests

INV-ID Scénario(s) de test Couverture
INV-250-01 TC-250-01, TC-250-02, TC-250-03 Complète
INV-250-02 TC-250-02 Complète
INV-250-03 TC-250-04, TC-250-05, TC-250-06, TC-250-07 Complète
INV-250-04 TC-250-08 Complète
INV-250-05 TC-250-09, TC-250-16 Complète
INV-250-06 TC-250-10 Complète
INV-250-07 TC-250-11 Complète
INV-250-08 TC-250-12, TC-250-13 Complète
INV-250-09 TC-250-05 Complète
INV-250-10 TC-250-06, TC-250-07, TC-250-14 Complète
INV-250-11 TC-250-15 Complète
INV-250-12 TC-250-17 Complète
INV-250-13 TC-250-18 Complète
INV-250-14 TC-250-19 Complète
INV-250-15 TC-250-20 Complète
INV-250-16 TC-250-26, TC-250-27, TC-250-28 Complète

Critères d'acceptation → Tests

CA-ID Scénario(s) de test Couverture
CA-250-01 TC-250-01, TC-250-02, TC-250-03 Complète
CA-250-02 TC-250-08 Complète
CA-250-03 TC-250-04, TC-250-05 Complète
CA-250-04 TC-250-09, TC-250-16 Complète
CA-250-05 TC-250-10 Complète
CA-250-06 TC-250-11 Complète
CA-250-07 TC-250-05 Complète
CA-250-08 TC-250-12, TC-250-13 Complète
CA-250-09 TC-250-03 Complète
CA-250-10 TC-250-21 Complète
CA-250-11 TC-250-22 Complète
CA-250-12 TC-250-15 Complète
CA-250-13 TC-250-18 Complète
CA-250-14 TC-250-19 Complète
CA-250-15 TC-250-20 Complète
CA-250-16 TC-250-26, TC-250-27, TC-250-28 Complète

Cas d'erreur → Tests

ERR-ID Scénario(s) de test Couverture
ERR-250-01 TC-250-05 Complète
ERR-250-02 TC-250-04 Complète
ERR-250-04 TC-250-06, TC-250-07 Complète
ERR-250-05 TC-250-07, TC-250-13 Complète
ERR-250-06 TC-250-08b Complète
ERR-250-07 TC-250-14 Complète
ERR-250-03 TC-250-25 Complète
ERR-250-08 TC-250-23 Complète

2. Scénarios de test

TC-250-01 — Éligibilité stricte WORM (DB+S3+legal_lock)

  • Invariant(s) couverts : INV-250-01
  • Critère(s) couverts : CA-250-01
  • Prérequis : Jeu de données mixte avec combinaisons contrôlées des états (DB expiry, S3 Object Lock expiry, legal_lock absent/actif/expiré).
  • Given : 9 documents couvrant toutes les combinaisons booléennes des 3 conditions d'éligibilité.
  • When : Exécution d'un run de sélection (sans destruction) avec batchSize > 9.
  • Then : Seuls les documents satisfaisant simultanément les 3 conditions sont sélectionnés.
  • Mécanisme de vérification : Comparaison déterministe entre set attendu et set sélectionné via journal d'exécution + audit de filtre.

TC-250-02 — Exclusion des statuts SEALED/PENDING

  • Invariant(s) couverts : INV-250-01, INV-250-02
  • Critère(s) couverts : CA-250-01
  • Prérequis : Documents éligibles temporellement mais statuts SEALED, PENDING, EXPIRED.
  • Given : 3 documents identiques sauf statut.
  • When : Exécution de la sélection.
  • Then : Seul le document EXPIRED peut être candidat; SEALED et PENDING sont exclus.
  • Mécanisme de vérification : Trace de décision par document (raison d'exclusion incluse).
  • Invariant(s) couverts : INV-250-01
  • Critère(s) couverts : CA-250-01, CA-250-09
  • Prérequis : Deux documents identiques, legal_lock actif pour l'un, expiré pour l'autre.
  • Given : Conditions DB/S3 expirées pour les deux.
  • When : Exécution de la sélection.
  • Then : Document legal_lock actif non sélectionné; document legal_lock expiré sélectionné.
  • Mécanisme de vérification : Audit des filtres avec motif explicite LEGAL_LOCK_ACTIVE.

TC-250-04 — Fail-closed si signature invalide

  • Invariant(s) couverts : INV-250-03
  • Critère(s) couverts : CA-250-03
  • Prérequis : Lot de documents éligibles; injecteur de faute signature renvoyant invalide.
  • Given : Prévalidation réussie, signature invalide.
  • When : Exécution du batch.
  • Then : Batch FAILED; aucune suppression S3/DB; aucune transition DESTROYED.
  • Mécanisme de vérification : Compteurs de suppressions = 0, transitions = 0, statut batch + alerte.

TC-250-05 — TSA indisponible : tsaRetryCount tentatives max puis arrêt

  • Invariant(s) couverts : INV-250-03, INV-250-09
  • Critère(s) couverts : CA-250-03, CA-250-07
  • Prérequis : Mock TSA timeout systématique. tsaRetryCount configuré à la valeur par défaut (3).
  • Given : Batch éligible.
  • When : Exécution de la phase horodatage.
  • Then : Exactement tsaRetryCount tentatives (3 par défaut), puis FAILED; destruction non exécutée.
  • Mécanisme de vérification : Logs retry horodatés (compte = tsaRetryCount), statut final FAILED, transitions DESTROYED absentes.

TC-250-06 — S3 injoignable post-validation : échec partiel observable

  • Invariant(s) couverts : INV-250-10
  • Critère(s) couverts : CA-250-08
  • Prérequis : Batch validé probatoirement; panne S3 sur sous-ensemble déterminé.
  • Given : 5 documents dont 2 ciblés en erreur S3.
  • When : Exécution destruction unitaire (S3 asynchrone, cf. §5.5).
  • Then : Batch PARTIAL_FAILED; erreurs unitaires auditées; alerte émise; documents en succès marqués DESTROYED après confirmation S3 + finalisation DB.
  • Mécanisme de vérification : Corrélation des statuts unitaires, présence audit/alerte pour chaque échec.

TC-250-07 — Échec DB après suppression S3 : réconciliation vers état terminal

  • Invariant(s) couverts : INV-250-10
  • Critère(s) couverts : CA-250-08
  • Prérequis : Suppression S3 réussie, suppression DB forcée en erreur sur 1 document.
  • Given : Batch validé avec 1 faute DB injectée.
  • When : Exécution puis réconciliation dans le délai reconciliationSla.
  • Then : État terminal = DESTROYED si DB rattrapée, sinon RECONCILIATION_FAILED après reconciliationDbRetryCount retries + escalade. Anomalie critique tracée.
  • Mécanisme de vérification : Audit d'anomalie + preuve de convergence vers état terminal contractuel (ERR-250-05).

TC-250-08 — Un batch réussi produit exactement un bordereau valide

  • Invariant(s) couverts : INV-250-04
  • Critère(s) couverts : CA-250-02
  • Prérequis : Batch éligible complet sans erreur injectée.
  • Given : N documents sélectionnés.
  • When : Exécution complète du batch en succès.
  • Then : 1 et 1 seul bordereau PDF/A, signature valide (certificat TSP qualifié eIDAS), timestamp RFC 3161 valide (champs obligatoires présents).
  • Mécanisme de vérification : Vérificateur PDF/A + signature + jeton TSA; unicité sur batchId.

TC-250-08b — Échec persistance bordereau : aucune destruction

  • Invariant(s) couverts : INV-250-03
  • Critère(s) couverts : CA-250-03
  • Prérequis : Injecteur de faute sur persistance bordereau.
  • Given : Batch validé mais persistance du bordereau échoue.
  • When : Exécution du batch.
  • Then : Batch FAILED; aucune suppression S3/DB déclenchée; alerte.
  • Mécanisme de vérification : Compteurs de suppressions = 0, statut batch FAILED.

TC-250-09 — Audit unitaire obligatoire lié au bordereau

  • Invariant(s) couverts : INV-250-05
  • Critère(s) couverts : CA-250-04
  • Prérequis : Batch réussi avec plusieurs destructions.
  • Given : Documents détruits dans un même batchId.
  • When : Lecture des traces d'audit.
  • Then : Une entrée par document détruit, contenant documentId, batchId, bordereauId corrélés.
  • Mécanisme de vérification : Requête de complétude et d'unicité des logs sur cardinalité attendue.

TC-250-10 — Conservation indéfinie des bordereaux (observable fini)

  • Invariant(s) couverts : INV-250-06
  • Critère(s) couverts : CA-250-05
  • Prérequis : Bordereaux anciens (au-delà de la fenêtre de rétention des documents métiers) présents.
  • Given : Ensemble de bordereaux historiques.
  • When : (1) Inspection du schéma/données des bordereaux, (2) Exécution du job de destruction automatique + consultation admin.
  • Then : (1) retentionExpiry absent ou null pour tous les bordereaux, (2) Aucun bordereau sélectionné pour destruction; tous restent lisibles via API admin.
  • Mécanisme de vérification : Contrôle schéma retentionExpiry + zéro tentative de suppression sur type bordereau + lecture API réussie.

TC-250-11 — Minimisation RGPD du contenu bordereau

  • Invariant(s) couverts : INV-250-07
  • Critère(s) couverts : CA-250-06
  • Prérequis : Schéma attendu des champs autorisés (cf. §3) + liste fermée des données personnelles directes (cf. §3).
  • Given : Bordereau généré.
  • When : Contrôle de schéma et inspection du contenu.
  • Then : Présence uniquement des champs probatoires autorisés (cf. §3); absence des données personnelles directes (cf. §3 liste fermée : nom, prénom, email, adresse, téléphone, NIR, etc.).
  • Mécanisme de vérification : Validation JSON/schema dérivée + règles de détection PII sur payload extrait.

TC-250-12 — Idempotence sur relance même batch (sans erreur)

  • Invariant(s) couverts : INV-250-08
  • Critère(s) couverts : CA-250-08
  • Prérequis : Batch déjà terminé en succès.
  • Given : Relance du job sur même fenêtre de données.
  • When : Deuxième exécution.
  • Then : Aucun document déjà DESTROYED n'est retraité; pas de doublon d'audit de destruction. Le statut terminal DESTROYED sert de marqueur d'idempotence (pas de TTL de rejeu).
  • Mécanisme de vérification : Delta nul sur transitions et audits unitaires de destruction.

TC-250-13 — Réconciliation post-crash vers état terminal contractuel

  • Invariant(s) couverts : INV-250-08, INV-250-10
  • Critère(s) couverts : CA-250-08
  • Prérequis : Premier run PARTIAL_FAILED avec crash post-suppression S3.
  • Given : Sous-ensemble déjà supprimé S3, DB non finalisée.
  • When : Réconciliation dans le délai reconciliationSla.
  • Then : État terminal contractuel atteint : DESTROYED si DB rattrapée, RECONCILIATION_FAILED si DB échoue après reconciliationDbRetryCount retries (escalade). Seuls les éléments en échec sont repris; absence de double destruction.
  • Mécanisme de vérification : Comparaison des identifiants traités entre runs, unicité des événements de destruction, état terminal conforme à ERR-250-05.

TC-250-14 — Échec silencieux interdit (audit + alerte obligatoires)

  • Invariant(s) couverts : INV-250-10
  • Critère(s) couverts : CA-250-08
  • Prérequis : Injection d'une erreur technique contrôlée.
  • Given : Exécution en présence d'une panne partielle.
  • When : Traitement du document en faute.
  • Then : Événement d'audit d'erreur et alerte opérationnelle présents obligatoirement.
  • Mécanisme de vérification : Assert conjoint sur bus d'alerting + journal d'audit, absence = non conforme.

TC-250-15 — Rejet des transitions inverses (4 transitions)

  • Invariant(s) couverts : INV-250-11
  • Critère(s) couverts : CA-250-12
  • Prérequis : Documents dans états DESTROYED, EXPIRED, SEALED.
  • Given : Tentatives API/service de transitions inverses interdites.
  • When : Soumission des 4 transitions : DESTROYED→EXPIRED, EXPIRED→SEALED, SEALED→PENDING, DESTROYED→SEALED.
  • Then : Chaque tentative est rejetée avec erreur explicite; état inchangé; trace d'audit.
  • Mécanisme de vérification : Codes d'erreur contractuels + contrôle d'intégrité d'état avant/après pour les 4 transitions.

TC-250-16 — Audit log mesurable (non-perte, ordre causal, complétude)

  • Invariant(s) couverts : INV-250-05
  • Critère(s) couverts : CA-250-04
  • Prérequis : Campagne de destructions avec injection d'un crash contrôlé suivi d'une reprise.
  • Given : Batch avec crash injecté après suppression S3 mais avant le commit de la transaction DB (§10.4b). L'audit log et la finalisation DESTROYED étant dans la même transaction ACID, un crash à ce point signifie que ni l'état ni l'audit ne sont persistés. Reprise via réconciliation (ERR-250-05).
  • When : Consolidation des événements après reprise/réconciliation.
  • Then : (1) Non-perte : tout événement émis est persisté (garanti par transaction ACID — pas de fenêtre entre destruction et audit). (2) Ordre causal : monotonie garantie par séquence PostgreSQL audit_seq (cf. INV-250-05). (3) Complétude : exactement une entrée d'audit par document traité (type DESTROYED ou RECONCILIATION_FAILED selon état terminal, cf. §10.5).
  • Mécanisme de vérification : Assertions sur cardinalité, monotonie par audit_seq, et absence de perte post-crash/réconciliation.
  • Invariant(s) couverts : INV-250-12
  • Critère(s) couverts : CA-250-01
  • Prérequis : 3 documents éligibles : (a) avec legal_lock expiré (flux legal_lock), (b) avec legal_lock jamais assigné (hors flux), © avec legal_lock historique assigné puis expiré (flux legal_lock, cf. §3 définition).
  • Given : Batch mixte contenant les 3 documents.
  • When : Exécution destruction.
  • Then : Zeroization exécutée pour documents (a) et © (flux legal_lock); document (b) = suppression physique seule.
  • Mécanisme de vérification : Traces d'orchestration des opérations de destruction par type de flux, assertion sur présence/absence de zeroization par document.

TC-250-18 — Convention BullMQ : nom de queue sans ':'

  • Invariant(s) couverts : INV-250-13
  • Critère(s) couverts : CA-250-13
  • Prérequis : Configuration des queues chargée en environnement de test.
  • Given : Liste effective des noms de queue utilisés par le job.
  • When : Validation de conformité de nommage.
  • Then : Aucun nom ne contient :.
  • Mécanisme de vérification : Test contractuel de configuration (regex négative déterministe).

TC-250-19 — Interdiction des API BullMQ dépréciées

  • Invariant(s) couverts : INV-250-14
  • Critère(s) couverts : CA-250-14
  • Prérequis : Analyse statique du code source du module.
  • Given : Base de code du job.
  • When : Scan des appels API BullMQ.
  • Then : Absence d'occurrences getRepeatableJobs et removeRepeatableByKey. Présence de getJobSchedulers/removeJobScheduler.
  • Mécanisme de vérification : Règle statique bloquante CI (pattern scan + seuil zéro).

TC-250-20 — Endpoint admin : autorisation ADMIN requise

  • Invariant(s) couverts : INV-250-15
  • Critère(s) couverts : CA-250-15
  • Prérequis : Utilisateur avec rôle ADMIN et utilisateur sans rôle ADMIN.
  • Given : Requête API vers l'endpoint de consultation des bordereaux.
  • When : (1) Appel par utilisateur ADMIN, (2) Appel par utilisateur non-ADMIN.
  • Then : (1) Accès autorisé, bordereaux retournés. (2) Accès refusé (403), aucun contenu bordereau, trace d'audit d'accès refusé.
  • Mécanisme de vérification : Assertions HTTP status code + body + audit log.

TC-250-21 — Endpoint admin : filtre date et batch

  • Invariant(s) couverts : INV-250-15
  • Critère(s) couverts : CA-250-10
  • Prérequis : Données de bordereaux sur plusieurs dates et batchId.
  • Given : Requêtes API avec filtres individuels et combinés, par utilisateur ADMIN.
  • When : Appel endpoint consultation bordereaux.
  • Then : Résultats conformes aux filtres, sans éléments hors périmètre demandé.
  • Mécanisme de vérification : Assertions exact-match sur cardinalité et identifiants attendus.

TC-250-22 — Notification de préavis N jours via bus événements

  • Invariant(s) couverts : INV-250-01
  • Critère(s) couverts : CA-250-11
  • Prérequis : preNoticeDays configuré (cas N=30 et N=0), bus d'événements interne opérationnel.
  • Given : Document approchant la date d'éligibilité.
  • When : Passage de la fenêtre temporelle de préavis.
  • Then : Événement de préavis émis sur le bus interne à J-N (N=0 = jour J), contenant uniquement documentId, date d'éligibilité prévue, preNoticeDays. Horodaté et corrélable au document.
  • Mécanisme de vérification : Interception de l'événement sur le bus + validation du payload (champs techniques uniquement, pas de PII) + corrélation temporelle.

TC-250-23 — Rejet configuration hors bornes

  • Invariant(s) couverts : —
  • Critère(s) couverts : —
  • ERR couvert : ERR-250-08
  • Prérequis : Configuration invalide prête à injecter.
  • Given : Configuration avec paramètres hors bornes (ex: destructionBatchSize=10000, tsaRetryCount=-1, clockSkewTolerance=0).
  • When : Le job démarre.
  • Then : Erreur de validation bloquante; aucun traitement document; alerte émise.
  • And : Test des bornes min ET max pour au moins 3 paramètres (destructionBatchSize, tsaRetryCount, clockSkewTolerance).
  • Mécanisme de vérification : Code d'erreur de validation + zéro document sélectionné + alerte présente.

TC-250-25 — Document non éligible détecté en cours de run (ERR-250-03)

  • Invariant(s) couverts : INV-250-10
  • Critère(s) couverts : CA-250-01
  • ERR couvert : ERR-250-03
  • Prérequis : Batch validé avec documents éligibles. Injection de changement d'état concurrent (re-scellement d'urgence → SEALED) sur 1 document entre sélection et destruction unitaire.
  • Given : Batch de 3 documents éligibles. Le document B est re-scellé (→ SEALED) après sélection mais avant sa destruction unitaire.
  • When : Exécution séquentielle du batch.
  • Then : Document B exclu de la destruction avec audit d'anomalie (ERR-250-03). Documents A et C détruits normalement. Batch PARTIAL_FAILED (car au moins un document sélectionné n'a pas été détruit, cf. ERR-250-03). Document B conserve son état SEALED.
  • Mécanisme de vérification : Audit d'anomalie pour document B + état SEALED préservé + documents A/C en DESTROYED + statut batch PARTIAL_FAILED.

TC-250-26 — Dépassement batchFinalizeSla

  • Invariant(s) couverts : INV-250-16
  • Critère(s) couverts : CA-250-16
  • SLA couvert : batchFinalizeSla (§10.3)
  • Prérequis : Mock temporel contrôlable, batchFinalizeSla configuré à valeur courte.
  • Given : Batch en cours de traitement.
  • When : La durée du batch dépasse batchFinalizeSla.
  • Then : Batch marqué FAILED + alerte critique émise.
  • Mécanisme de vérification : Statut batch FAILED + timestamp dépassement + alerte dans le bus d'alerting.

TC-250-27 — Dépassement destructionExecutionSla

  • Invariant(s) couverts : INV-250-16
  • Critère(s) couverts : CA-250-16
  • SLA couvert : destructionExecutionSla (§10.3)
  • Prérequis : Mock temporel contrôlable, destructionExecutionSla configuré à valeur courte.
  • Given : Document unitaire en cours de destruction après bordereau validé.
  • When : La durée de traitement du document dépasse destructionExecutionSla.
  • Then : Batch marqué PARTIAL_FAILED + reprise autorisée.
  • Mécanisme de vérification : Statut batch PARTIAL_FAILED + audit unitaire de timeout + reprise possible.

TC-250-28 — Dépassement reconciliationSla

  • Invariant(s) couverts : INV-250-16
  • Critère(s) couverts : CA-250-16
  • SLA couvert : reconciliationSla (§10.3)
  • ERR couvert : ERR-250-05
  • Prérequis : Mock temporel contrôlable, reconciliationSla configuré à valeur courte. Crash injecté post-suppression S3 / pré-commit DB.
  • Given : Document avec suppression S3 réussie mais finalisation DB échouée. Réconciliation en cours.
  • When : La durée de réconciliation dépasse reconciliationSla après reconciliationDbRetryCount retries échoués.
  • Then : Document marqué RECONCILIATION_FAILED (état terminal de document, cf. §10.5) + escalade critique obligatoire + entrée d'audit de type RECONCILIATION_FAILED.
  • Mécanisme de vérification : État document RECONCILIATION_FAILED + audit type correspondant + alerte d'escalade émise + timestamp dépassement SLA.

3. Scénarios non testables

Règle Raison Alternative
Conservation « indéfinie » Non prouvable par test temporel infini Contrôle contractuel observable : absence de retentionExpiry + exclusion du job de destruction (TC-250-10)
Conformité eIDAS du TSP (ex TC-250-24) La vérification du niveau de qualification eIDAS du TSP est un contrôle de déploiement/exploitation, pas un test automatisé Contrôle documentaire du certificat et du prestataire en production + check-list runbook de conformité avant mise en service + audit opérationnel périodique

4. Verdict de testabilité

Verdict : TESTABLE (GO) avec contrôles contractuels

  • Couverture invariants : 16/16 couverts par au moins un scénario.
  • Couverture critères d'acceptation : 16/16 couverts par au moins un scénario.
  • Couverture cas d'erreur : 8/8 ERR couverts (ERR-250-03 couvert par TC-250-25).
  • Couverture SLA : batchFinalizeSla (TC-250-26), destructionExecutionSla (TC-250-27), reconciliationSla (TC-250-07/13/28), preNoticeDays (TC-250-22).
  • Déterminisme : scénarios formulés avec prérequis contrôlables et observables explicites.
  • Automatisabilité : exécutable en tests d'intégration + tests contractuels + contrôles statiques CI.
  • Contrôles contractuels : conservation « indéfinie » (TC-250-10), conformité eIDAS (contrôle opérationnel, cf. §3 non testable).
  • Risques résiduels : dépendance environnementale TSA/S3/notification à maîtriser par doubles de test et campagnes en environnement représentatif.