Aller au contenu

PD-238 — Scénarios de tests contractuels

1. Références

  • Spécification : PD-238-specification.md
  • Epic : EPIC-182

2. Matrice de couverture

ID Invariant ID Critère ID Test Couverture Commentaire
INV-238-01 CA-238-01 TC-ERR-01 Oui GET status sans JWT refusé.
INV-238-01 CA-238-02 TC-ERR-02 Oui POST init sans JWT refusé.
INV-238-01 CA-238-03 TC-ERR-03 Oui POST verify sans JWT refusé.
INV-238-02 - TC-ERR-04 Oui Accès croisé MFA refusé.
INV-238-03 CA-238-06 TC-NOM-01 Oui Status retourne enabled/method/configuredAt.
INV-238-04 CA-238-07 TC-NOM-02 Oui Init retourne secret/qrCodeUri/expiresAt.
INV-238-05 CA-238-08 TC-NOM-03 Oui Verify valide active MFA.
INV-238-05 CA-238-08 TC-ERR-06 Oui Verify invalide n'active pas MFA.
INV-238-06 CA-238-04 TC-ERR-05 Oui Disable sans reauth refusé.
INV-238-07 CA-238-05 TC-ERR-07 Oui Regenerate sans reauth refusé.
INV-238-07 CA-238-10 TC-NOM-05 Oui Regeneration invalide anciens codes.
INV-238-08 CA-238-09 TC-NOM-03 Oui Codes retournés seulement après activation.
INV-238-08 CA-238-09 TC-NOM-05 Oui Codes retournés seulement après regeneration.
INV-238-09 CA-238-12 TC-INV-02 Oui Secrets jamais dans logs.
INV-238-10 - TC-INV-03 Oui Pas de stockage local des secrets.
INV-238-11 CA-238-13 TC-ERR-08 Oui Rate limit appliqué.
INV-238-12 CA-238-14 TC-NOM-06 Oui Reauth JWT contient sub/purpose/exp.
INV-238-13 - TC-INV-01 Oui Erreurs explicites sans effet partiel.
INV-238-14 CA-238-15 TC-INV-04 NON TESTABLE Hors périmètre.
INV-238-15 CA-238-16 TC-ERR-14 Oui Reauth sans JWT refusé.

3. Scénarios de test – Flux nominaux

TEST-ID: TC-NOM-01 — État MFA nominal Référence spec: INV-238-03, CA-238-06, F-238-01 GIVEN - Un utilisateur U1 authentifié avec JWT valide. WHEN - U1 appelle GET /user/mfa/status. THEN - La réponse contient enabled, method, configuredAt.

TEST-ID: TC-NOM-02 — Init TOTP nominale Référence spec: INV-238-04, CA-238-07, F-238-02 GIVEN - Un utilisateur U1 authentifié avec JWT valide. WHEN - U1 appelle POST /user/mfa/totp/init. THEN - La réponse contient secret, qrCodeUri, expiresAt. AND - Aucun log applicatif ne contient secret ou qrCodeUri.

TEST-ID: TC-NOM-03 — Verify TOTP valide Référence spec: INV-238-05, INV-238-08, CA-238-08, CA-238-09, F-238-03 GIVEN - U1 authentifié. - Une init TOTP réalisée. WHEN - U1 appelle POST /user/mfa/totp/verify avec un code valide. THEN - La réponse indique enabled: true. AND - recoveryCodes sont retournés une seule fois.

TEST-ID: TC-NOM-04 — Désactivation MFA avec reauth Référence spec: INV-238-06, CA-238-11, F-238-04 GIVEN - U1 authentifié. - MFA actif. - Reauth token valide dans X-Reauth-Token. WHEN - U1 appelle POST /user/mfa/disable. THEN - La réponse indique enabled: false.

TEST-ID: TC-NOM-05 — Regénération codes de récupération Référence spec: INV-238-07, INV-238-08, CA-238-10, CA-238-09, F-238-05 GIVEN - U1 authentifié. - MFA actif. - Reauth token valide. - Un ancien code RC1 connu. WHEN - U1 appelle POST /user/mfa/recovery/regenerate. THEN - Un nouveau jeu de recoveryCodes est retourné. AND - RC1 est invalide après régénération.

TEST-ID: TC-NOM-06 — Reauth nominale Référence spec: INV-238-12, CA-238-14, F-238-06 GIVEN - U1 authentifié. WHEN - U1 appelle POST /auth/reauth avec mot de passe valide. THEN - reauthToken est retourné. AND - Le JWT contient sub, purpose="reauth", exp à 5 minutes.

4. Scénarios de test – Cas d'erreur

TEST-ID: TC-ERR-01 — Status sans JWT Référence spec: ERR-238-UNAUTHENTICATED, CA-238-01 GIVEN - Aucun JWT valide. WHEN - Appel GET /user/mfa/status. THEN - Refus explicite (auth).

TEST-ID: TC-ERR-02 — Init sans JWT Référence spec: ERR-238-UNAUTHENTICATED, CA-238-02 GIVEN - Aucun JWT valide. WHEN - Appel POST /user/mfa/totp/init. THEN - Refus explicite (auth).

TEST-ID: TC-ERR-03 — Verify sans JWT Référence spec: ERR-238-UNAUTHENTICATED, CA-238-03 GIVEN - Aucun JWT valide. WHEN - Appel POST /user/mfa/totp/verify. THEN - Refus explicite (auth).

TEST-ID: TC-ERR-04 — Accès croisé MFA Référence spec: ERR-238-FORBIDDEN-CROSS-ACCESS, INV-238-02 GIVEN - U1 et U2 existent. - U1 authentifié. WHEN - U1 tente une action MFA sur le contexte de U2. THEN - Refus explicite. AND - Aucune donnée MFA de U2 n'est exposée/modifiée.

TEST-ID: TC-ERR-05 — Disable sans reauth Référence spec: ERR-238-UNAUTHORIZED-REAUTH, CA-238-04 GIVEN - U1 authentifié. - MFA actif. WHEN - Appel POST /user/mfa/disable sans X-Reauth-Token. THEN - Refus explicite (reauth).

TEST-ID: TC-ERR-06 — Verify TOTP invalide Référence spec: ERR-238-TOTP-INVALID, CA-238-08 GIVEN - U1 authentifié. - Init TOTP réalisée. WHEN - Appel POST /user/mfa/totp/verify avec code invalide. THEN - MFA reste inactif. AND - Erreur explicite retournée.

TEST-ID: TC-ERR-07 — Regenerate sans reauth Référence spec: ERR-238-UNAUTHORIZED-REAUTH, CA-238-05 GIVEN - U1 authentifié. - MFA actif. WHEN - Appel POST /user/mfa/recovery/regenerate sans X-Reauth-Token. THEN - Refus explicite (reauth).

TEST-ID: TC-ERR-08 — Rate limit Référence spec: ERR-238-RATE-LIMIT, CA-238-13 GIVEN - U1 authentifié. WHEN - Dépassement seuil de requêtes MFA. THEN - Réponse ERR-238-RATE-LIMIT.

TEST-ID: TC-ERR-09 — Init TOTP échoue Référence spec: ERR-238-TOTP-INIT-FAILED GIVEN - U1 authentifié. - Keycloak renvoie une erreur d'init. WHEN - Appel POST /user/mfa/totp/init. THEN - Erreur explicite. AND - Aucun MFA activé.

TEST-ID: TC-ERR-10 — Désactivation échoue Référence spec: ERR-238-MFA-DISABLE-FAILED GIVEN - U1 authentifié. - MFA actif. - Reauth token valide. - Keycloak renvoie une erreur de désactivation. WHEN - Appel POST /user/mfa/disable. THEN - Erreur explicite. AND - MFA reste actif.

TEST-ID: TC-ERR-11 — Regénération échoue Référence spec: ERR-238-RECOVERY-REGEN-FAILED GIVEN - U1 authentifié. - MFA actif. - Reauth token valide. - Keycloak renvoie une erreur de régénération. WHEN - Appel POST /user/mfa/recovery/regenerate. THEN - Erreur explicite. AND - Anciens codes restent valides.

TEST-ID: TC-ERR-12 — Erreur interne Référence spec: ERR-238-INTERNAL, INV-238-13 GIVEN - U1 authentifié. - Erreur interne déterministe injectée. WHEN - Appel d'un endpoint MFA. THEN - Erreur explicite. AND - Aucun effet partiel silencieux.

TEST-ID: TC-ERR-13 — Reauth mot de passe invalide Référence spec: ERR-238-REAUTH-FAILED GIVEN - U1 authentifié avec JWT valide. WHEN - Appel POST /auth/reauth avec mot de passe incorrect. THEN - Erreur explicite (ERR-238-REAUTH-FAILED). AND - Aucun reauthToken n'est retourné.

TEST-ID: TC-ERR-14 — Reauth sans JWT Référence spec: ERR-238-UNAUTHENTICATED, CA-238-16 GIVEN - Aucun JWT valide. WHEN - Appel POST /auth/reauth. THEN - Refus explicite (auth).

5. Tests d'invariants (non négociables)

Invariant Test(s) dédiés Observable Commentaire
INV-238-01 TC-ERR-01/02/03 Refus auth sans JWT Couverture complète
INV-238-02 TC-ERR-04 Refus accès croisé Couverture complète
INV-238-03 TC-NOM-01 Structure status MFA Couverture complète
INV-238-04 TC-NOM-02 secret/qrCodeUri/expiresAt Couverture complète
INV-238-05 TC-NOM-03, TC-ERR-06 Activation conditionnée au code Couverture complète
INV-238-06 TC-ERR-05 Reauth requis disable Couverture complète
INV-238-07 TC-NOM-05, TC-ERR-11 Regen codes + invalidation Couverture complète
INV-238-08 TC-NOM-03, TC-NOM-05 Affichage unique codes Couverture complète
INV-238-09 TC-INV-02 Absence secrets logs Couverture complète
INV-238-10 TC-INV-03 Pas de stockage secrets Couverture complète
INV-238-11 TC-ERR-08 Rate limiting Couverture complète
INV-238-12 TC-NOM-06 Reauth token conforme Couverture complète
INV-238-13 TC-INV-01, TC-ERR-12 Erreurs explicites sans effet partiel Couverture complète
INV-238-14 TC-INV-04 Hors périmètre NON TESTABLE
INV-238-15 TC-ERR-14 Reauth sans JWT refusé Couverture complète

Tests d'invariants dédiés

TEST-ID: TC-INV-01 — Erreurs explicites sans effet partiel Référence spec: INV-238-13 GIVEN - U1 authentifié. - Une erreur métier/validation/auth est provoquée. WHEN - Appel endpoint MFA. THEN - Erreur explicite. AND - Aucun effet partiel observable.

TEST-ID: TC-INV-02 — Secrets non loggés Référence spec: INV-238-09, CA-238-12 GIVEN - U1 authentifié. - Scénario init/verify/regenerate exécuté. WHEN - Audit des logs applicatifs. THEN - Aucun secret ni recoveryCodes en clair dans les logs.

TEST-ID: TC-INV-03 — Pas de stockage local des secrets Référence spec: INV-238-10 GIVEN - U1 authentifié. WHEN - Exécution init/verify/regenerate. THEN - Aucun secret MFA stocké en base ProbatioVault.

TEST-ID: TC-INV-04 — Preuve RGPD/Keycloak admin Référence spec: INV-238-14, CA-238-15 GIVEN - Périmètre limité aux endpoints PD-238. WHEN - L'auditeur demande la preuve RGPD exhaustive et audit Keycloak admin. THEN - NON TESTABLE dans ce périmètre.

6. Tests de non-régression

Test ID Objet Observable Commentaire
TC-NR-01 Auth obligatoire MFA 401 sans JWT sur /user/mfa/* Reutilise TC-ERR-01/02/03
TC-NR-02 Activation conditionnée MFA actif seulement après verify valide Reutilise TC-NOM-03/TC-ERR-06
TC-NR-03 Reauth obligatoire opérations sensibles Refus sans X-Reauth-Token Reutilise TC-ERR-05/07
TC-NR-04 Codes de récupération uniques Codes présents uniquement après activation/regeneration Reutilise TC-NOM-03/05
TC-NR-05 Rate limit actif 429 après dépassement Reutilise TC-ERR-08

7. Tests négatifs et adversariaux

Test ID Entrée invalide / abus Résultat attendu Observable
TC-NEG-01 Reauth token expiré Refus opération sensible ERR-238-UNAUTHORIZED-REAUTH
TC-NEG-02 Reauth token avec purpose != "reauth" Refus opération sensible ERR-238-UNAUTHORIZED-REAUTH
TC-NEG-03 Code TOTP avec longueur invalide Rejet explicite ERR-238-TOTP-INVALID
TC-NEG-04 Rafale de vérifications TOTP Rate limit ERR-238-RATE-LIMIT
TC-NEG-05 Réutilisation d'un ancien code recovery après régénération Refus Ancien code invalide

8. Observabilité requise pour les tests

  • Contrôle des réponses Keycloak (success, erreurs, codes de récupération).
  • Traces des appels sortants vers Keycloak (sans secrets en clair).
  • Inspection des logs applicatifs (exclusion secrets).
  • Inspection stockage persistant ProbatioVault (absence secrets MFA).
  • Jeu d'utilisateurs U1/U2 pour tests d'accès croisé.
  • Horloge de test stable pour validation exp du reauth token.
  • Configuration rate limit connue en environnement de test.
  • Accès aux réponses d'erreur standardisées ERR-238-*.

9. Règles non testables

Règle Raison Impact
INV-238-14 / CA-238-15 Hors périmètre PD-238 ; dépend d'artefacts conformité externes Bloquant pour conformité RGPD globale si artefacts absents

10. Verdict QA

⚠️ Testable partiellement

  • Invariants couverts : 15/15 references, dont 1 NON TESTABLE (INV-238-14)
  • Critères couverts : 16/16 references, dont 1 NON TESTABLE (CA-238-15)
  • Cas d'erreur couverts : 10/10
  • Réserve : preuve RGPD/Keycloak admin hors périmètre