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
expdu 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