PD-81 — Revue des Tests
Résumé
| Critère | Statut |
| Couverture scénarios nominaux (N1-N4) | 4/4 |
| Couverture scénarios erreur (E01-E18) | 11/18 (partielle) |
| Qualité assertions | ✅ |
| Isolation | ✅ |
| Edge cases | ⚠️ |
| Couverture invariants | 8/12 (3 partiels, 1 non couvert) |
Verdict : ⚠️ RÉSERVES
Mapping invariants -> tests
| Invariant | Tests couvrants | Couvert ? |
| INV-81-01 | validateConsultationAccess (deny expired/non-ACTIVE), closeLegalAccess (REVOKE/EXPIRE/END_OF_CONSULTATION), destroyReKey | ✅ |
| INV-81-02 | MandateValidatorService (TSP invalid, chaîne invalide, cert révoqué) | ⚠️ |
| INV-81-03 | submitInternalValidation (DPO puis activation), activateLegalAccess rejet si non ACTIVATED | ⚠️ |
| INV-81-04 | Aucun test explicite sur non-exposition de clés persistantes / artefacts temporaires uniquement | ❌ |
| INV-81-05 | validateConsultationAccess refuse doc hors scope | ✅ |
| INV-81-06 | LegalWriteBlockGuard bloque PUT/PATCH/DELETE | ✅ |
| INV-81-07 | destroyReKey, processDestructionQueue, closeLegalAccess + idempotence destruction/révocation | ✅ |
| INV-81-08 | Vérifs emitProbativeEvent sur étapes clés (mandat, validation, accès, révocation) | ⚠️ |
| INV-81-09 | getLegalAuditProof -> generateProof (mandateId/legalCaseId) | ✅ |
| INV-81-10 | Contrôle contextId, usage storageDomain: LEGAL dans fixtures, séparation flux legal | ⚠️ |
| INV-81-11 | Multiples tests fail-closed (rejects.toThrow, guard bloque même si audit KO) | ✅ |
| INV-81-12 | Rejet contextId invalide dans registerLegalMandate | ✅ |
Points forts
- Bonne couverture du flux nominal complet
N1 -> N4, avec assertions métier précises (pas de toBeTruthy() générique). - Très bon niveau d'isolation (mocks dédiés par suite,
beforeEach + clearAllMocks, pas de dépendance inter-tests). - Bon focus sécurité/fail-closed: scope documentaire, statuts non actifs, expiration temporelle, blocage write HTTP.
- Vérification de comportements critiques: idempotence (destroy/revoke), événements probatoires, chemins d'erreur principaux.
- Les tests controller valident correctement le décodage base64 ->
Buffer et la délégation orchestrateur.
Points à améliorer
| ID | Description | Gravité |
| T-01 | Assertions d'erreur trop larges (toThrow(LegalPreException)), sans contrôle du code d'erreur métier (ERR-81-xx) ni message contractuel | MAJEUR |
| T-02 | Couverture E01-E18 incomplète: manque des cas négatifs avancés (chaîne incomplète détaillée, fenêtre temporelle limite, entrées null/undefined, payloads malformés, doublons de validation, conflits transactionnels) | MAJEUR |
| T-03 | INV-81-04 non prouvé par tests: absence d'assertions explicites garantissant qu'aucune clé persistante document n'est exposée en sortie service/API | MAJEUR |
| T-04 | INV-81-08 seulement partiellement vérifié: on teste l'émission d'événement, pas la présence d'éléments probatoires (hash SHA3-256, signature HSM, horodatage TSA) dans le payload audit | MAJEUR |
| T-05 | Transactions critiques: les specs mentionnent SERIALIZABLE mais les tests n'assertent pas explicitement l'appel SQL/niveau d'isolation (SET TRANSACTION ISOLATION LEVEL SERIALIZABLE) | MINEUR |
| T-06 | Cas limites manquants sur contextId (absent/vide), scopeDocumentIds volumineux/duplicats, TTL à 0 ou très court, horloge borderline (expiresAt === now) | MINEUR |
| T-07 | Incohérence de comptage: la suite guard contient 8 tests (et non 7), total observé 53 (et non 52) | MINEUR |
En l'état, la base est solide pour l'unit testing NestJS/Jest, mais la gate tests est en RÉSERVES tant que les preuves contractuelles fortes (codes d'erreur, invariants crypto/audit, complétion des erreurs E01-E18) ne sont pas renforcées.