Aller au contenu

PD-275 — Revue des Tests

Résumé

Critère Statut
Couverture TC-* 18/18 in-scope (20/20 avec 2 hors périmètre documentés: TC-NOM-08, TC-NR-01)
Qualité assertions ⚠️
Isolation
Edge cases

Verdict : ❌ NON_CONFORME

Motif principal: la preuve contractuelle des guards @Roles() n'est pas démontrée selon le triplet exigé (403 + body {} + audit ACCESS_DENIED) sur endpoint protégé.

Matrice de couverture

TC-ID Implémenté Fichier Commentaire
TC-NOM-01 finality-guard.service.spec.ts Persistance confirmation_count testée avec audit.
TC-NOM-02 finality-guard.service.spec.ts Refus explicite sous seuil finalité.
TC-NOM-03 finality-guard.service.spec.ts Succès au seuil et au-dessus.
TC-NOM-04 signer-registry.service.spec.ts Revocation ACTIVE + audit + rôles ADMIN/SIGNER_ADMIN.
TC-NOM-05 signer-registry.service.spec.ts Double revocation refusée, pas de mutation.
TC-NOM-06 signer-registry.service.spec.ts Soumission REVOKED refusée.
TC-NOM-07 signer-registry.service.spec.ts Signer absent refusé.
TC-NOM-08 ✅ (hors périmètre CI) N/A Prolog E2E documenté non-automatisable (à ne pas signaler).
TC-NOM-09 pd275-migration.integration.spec.ts Cycle up/down/up prévu.
TC-NOM-10 pd275-concurrency.integration.spec.ts Concurrence revoke/submit couverte.
TC-NOM-11 pd275-concurrency.integration.spec.ts Double revoke concurrent + unicité succès.
TC-ERR-01 finality-guard.service.spec.ts Bornes invalides rejetées.
TC-ERR-06 signer-registry.service.spec.ts Échec persistance audit bloque transition.
TC-ERR-08 ✅ (partiel contractuel) signer-registry.service.spec.ts, signer.controller.spec.ts Refus non autorisé testé, mais sans preuve HTTP contractuelle complète guard.
TC-ERR-09 signer-registry.service.spec.ts, signer.controller.spec.ts Anti-spoofing revokedBy couvert.
TC-INV-06 signer-registry.service.spec.ts Terminal state REVOKED respecté.
TC-INV-07A signer-registry.service.spec.ts Machine d'état signer validée.
TC-INV-07B finality-guard.service.spec.ts Précondition transition batch couverte.
TC-INV-08 signer-registry.service.spec.ts Invariant vacuously satisfied explicité.
TC-NR-01 ✅ (hors périmètre test) N/A Couverture documentaire, pas un test Jest.

Points à améliorer

ID Description Gravité
T-01 Preuve contractuelle guard @Roles() manquante sur endpoint protégé: absence d'un test e2e/intégration qui asserte ensemble status=403, body={}, et auditService.log avec action: 'ACCESS_DENIED'. MAJEUR
T-02 Quelques tests appellent la même méthode 2 fois dans le même it (ex. assertions successives sur rejects), ce qui fragilise la lisibilité et peut introduire des effets de bord sur mocks. MINEUR
T-03 signer.controller.spec.ts valide surtout le mapping d'exceptions (unit), pas le contrat HTTP réel (payload/réponse filtre/guard). MAJEUR

Tests manquants

  • TC-GUARD-403-CONTRACT (à ajouter, rattachable à INV-275-09 / CA-04b): test e2e sur POST revoke avec rôle non autorisé, assertant simultanément:
  • expect(response.status).toBe(403)
  • expect(response.body).toEqual({})
  • expect(auditService.log).toHaveBeenCalledWith(expect.objectContaining({ action: 'ACCESS_DENIED' }))
  • Variante recommandée: cas JWT absent/invalide avec les mêmes assertions contractuelles d'accès refusé (si endpoint protégé par guard commun).