PD-32 - Scenarios de tests contractuels¶
1. References¶
- Specification : PD-32-specification.md
- Epic : PD-182 - Authentification, identite et controle d'acces
- JIRA : PD-32
2. Matrice de couverture¶
| ID Invariant | ID Critere | ID Test | Couverture | Commentaire |
|---|---|---|---|---|
| INV-32-01 | CA-32-01 | TC-ERR-01 | Oui | GET sans JWT refuse. |
| INV-32-01 | CA-32-02 | TC-ERR-02 | Oui | PUT sans JWT refuse. |
| INV-32-02 | CA-32-03 | TC-ERR-03 | Oui | Acces croise lecture refuse. |
| INV-32-02 | CA-32-03 | TC-ERR-04 | Oui | Acces croise ecriture refuse. |
| INV-32-03 | CA-32-04 | TC-NOM-01 | Oui | Reponse profil non sensible. |
| INV-32-04 | CA-32-04 | TC-INV-01 | Oui | Champs sensibles/proteges absents. |
| INV-32-05 | CA-32-06 | TC-NOM-02 | Oui | Mise a jour name autorisee. |
| INV-32-05 | CA-32-07 | TC-NOM-03 | Oui | Mise a jour avatar_url autorisee. |
| INV-32-05 | CA-32-08 | TC-NOM-04 | Oui | Mise a jour preferences conforme autorisee. |
| INV-32-06 | CA-32-10 | TC-ERR-06 | Oui | Rejet modification email/plan. |
| INV-32-06 | CA-32-11 | TC-ERR-07 | Oui | Rejet modification id/status/srpSalt/passwordHash. |
| INV-32-07 | CA-32-09 | TC-ERR-05 | Oui | Rejet cle inconnue dans preferences. |
| INV-32-08 | CA-32-05 | TC-NOM-01 | Oui | Contrat PD-106 respecte (name,email,avatar_url). |
| INV-32-09 | CA-32-12 | TC-ERR-08 | Oui | Rate limit global applique. |
| INV-32-10 | CA-32-13 | TC-INV-02 | Oui | Erreurs explicites et sans mutation partielle. |
| INV-32-10 | CA-32-13 | TC-ERR-09 | Oui | Validation invalide : echec explicite. |
| INV-32-10 | CA-32-13 | TC-ERR-10 | Oui | Erreur interne : echec explicite. |
| INV-32-11 | CA-32-14 | TC-INV-03 | NON TESTABLE | Hors perimetre mobile/API PD-32 ; artefact externe requis. |
3. Scenarios de test - Flux nominaux¶
TEST-ID: TC-NOM-01 - Lecture profil nominale Reference spec: F-32-01, INV-32-03, INV-32-04, INV-32-08, CA-32-04, CA-32-05 GIVEN - Un utilisateur U1 possede un JWT valide. - U1 dispose d'un profil existant. WHEN - U1 appelle GET /user/profile. THEN - La reponse contient name, email, avatar_url (nullable). AND - Aucun champ protege/sensible n'est present dans la reponse.
TEST-ID: TC-NOM-02 - Mise a jour name nominale Reference spec: F-32-02, INV-32-05, CA-32-06 GIVEN - U1 est authentifie avec JWT valide. - Le payload contient uniquement name valide. WHEN - U1 appelle PUT /user/profile. THEN - La requete est acceptee. AND - La reponse retourne name avec la nouvelle valeur.
TEST-ID: TC-NOM-03 - Mise a jour avatar_url nominale Reference spec: F-32-02, INV-32-05, CA-32-07 GIVEN - U1 est authentifie avec JWT valide. - Le payload contient uniquement avatar_url valide. WHEN - U1 appelle PUT /user/profile. THEN - La requete est acceptee. AND - La reponse retourne avatar_url avec la nouvelle valeur.
TEST-ID: TC-NOM-04 - Mise a jour preferences nominale Reference spec: F-32-02, INV-32-05, INV-32-07, CA-32-08 GIVEN - U1 est authentifie avec JWT valide. - Le payload contient preferences conformes au schema contractuel. WHEN - U1 appelle PUT /user/profile. THEN - La requete est acceptee. AND - La reponse retourne preferences mises a jour conformement au payload.
4. Scenarios de test - Cas d'erreur¶
TEST-ID: TC-ERR-01 - GET profil sans JWT Reference spec: ERR-32-UNAUTHENTICATED, INV-32-01, CA-32-01 GIVEN - Aucun JWT valide n'est fourni. WHEN - Un appel GET /user/profile est emis. THEN - La requete est refusee avec erreur d'authentification explicite. AND - Aucune donnee profil n'est retournee.
TEST-ID: TC-ERR-02 - PUT profil sans JWT Reference spec: ERR-32-UNAUTHENTICATED, INV-32-01, CA-32-02 GIVEN - Aucun JWT valide n'est fourni. WHEN - Un appel PUT /user/profile est emis. THEN - La requete est refusee avec erreur d'authentification explicite. AND - Aucune mise a jour n'est appliquee.
TEST-ID: TC-ERR-03 - Acces croise en lecture Reference spec: ERR-32-FORBIDDEN-CROSS-ACCESS, INV-32-02, CA-32-03 GIVEN - U1 et U2 existent. - U1 est authentifie. - Le contexte de donnees cible U2. WHEN - U1 tente de lire un profil hors de son contexte identite. THEN - La requete est refusee explicitement. AND - Aucune donnee de U2 n'est exposee.
TEST-ID: TC-ERR-04 - Acces croise en ecriture Reference spec: ERR-32-FORBIDDEN-CROSS-ACCESS, INV-32-02, CA-32-03 GIVEN - U1 et U2 existent. - U1 est authentifie. - Le contexte de mutation cible U2. WHEN - U1 tente de modifier un profil hors de son contexte identite. THEN - La requete est refusee explicitement. AND - Aucune modification n'est appliquee sur U2.
TEST-ID: TC-ERR-05 - Cle inconnue dans preferences Reference spec: ERR-32-VALIDATION, INV-32-07, CA-32-09 GIVEN - U1 est authentifie. - Le payload contient preferences avec au moins une cle hors schema. WHEN - U1 appelle PUT /user/profile. THEN - La requete est refusee avec erreur validation explicite. AND - Aucune mise a jour n'est appliquee.
TEST-ID: TC-ERR-06 - Tentative modification email/plan Reference spec: ERR-32-PROTECTED-FIELD, INV-32-06, CA-32-10 GIVEN - U1 est authentifie. - Le payload contient email ou plan. WHEN - U1 appelle PUT /user/profile. THEN - La requete est refusee explicitement (champ protege). AND - Les valeurs email/plan restent inchangees.
TEST-ID: TC-ERR-07 - Tentative modification champs proteges critiques Reference spec: ERR-32-PROTECTED-FIELD, INV-32-06, CA-32-11 GIVEN - U1 est authentifie. - Le payload contient au moins un champ parmi id, status, srpSalt, passwordHash. WHEN - U1 appelle PUT /user/profile. THEN - La requete est refusee explicitement (champ protege). AND - Aucune mise a jour n'est appliquee.
TEST-ID: TC-ERR-08 - Depassement rate limit Reference spec: ERR-32-RATE-LIMIT, INV-32-09, CA-32-12 GIVEN - U1 est authentifie. - Le seuil global de rate limiting est depasse pour les routes profil. WHEN - U1 appelle GET /user/profile ou PUT /user/profile apres depassement. THEN - La reponse retourne l'erreur rate limit explicite. AND - Aucune operation metier n'est executee.
TEST-ID: TC-ERR-09 - Payload invalide (types/formats) Reference spec: ERR-32-VALIDATION, INV-32-10, CA-32-13 GIVEN - U1 est authentifie. - Le payload contient une valeur invalide (ex: auto_lock_minutes hors bornes, type incorrect). WHEN - U1 appelle PUT /user/profile. THEN - La requete est refusee explicitement. AND - Aucune mutation partielle n'est observee.
TEST-ID: TC-ERR-10 - Erreur interne Reference spec: ERR-32-INTERNAL, INV-32-10, CA-32-13 GIVEN - U1 est authentifie. - Une erreur interne deterministe est injectee. WHEN - U1 appelle GET /user/profile ou PUT /user/profile. THEN - Le systeme retourne un echec explicite. AND - Aucun succes n'est affiche et aucune mutation partielle n'est appliquee.
5. Tests d'invariants (non negociables)¶
TEST-ID: TC-INV-01 - Non fuite de champs sensibles Reference spec: INV-32-03, INV-32-04, CA-32-04 GIVEN - U1 est authentifie. WHEN - U1 appelle GET /user/profile. THEN - La reponse ne contient pas passwordHash, srpSalt, validationToken, id, status, createdAt, updatedAt. AND - Seuls les champs contractuels non sensibles sont exposes.
TEST-ID: TC-INV-02 - Echecs explicites sans mutation partielle Reference spec: INV-32-10, CA-32-13 GIVEN - U1 est authentifie. - Une erreur est provoquee (validation/champ protege/interne). WHEN - U1 appelle PUT /user/profile. THEN - Une erreur explicite est retournee. AND - La reponse contient un code d'erreur au format error = ERR-32-*. - Un message d'erreur est present. - L'etat profil reste strictement inchange.
TEST-ID: TC-INV-03 - Preuve RGPD exhaustive Reference spec: INV-32-11, CA-32-14 GIVEN - Le perimetre est limite aux endpoints PD-32. WHEN - L'auditeur demande la preuve juridique RGPD exhaustive. THEN - La preuve est NON TESTABLE dans ce perimetre. AND - Un artefact de conformite externe est requis.
6. Tests de non-regression¶
| Test ID | Objet | Observable | Commentaire |
|---|---|---|---|
| TC-NR-01 | Eviter regression auth obligatoire | GET/PUT sans JWT toujours refuses | Reutilise TC-ERR-01, TC-ERR-02 |
| TC-NR-02 | Eviter regression minimisation | Champs sensibles toujours absents du GET | Reutilise TC-NOM-01, TC-INV-01 |
| TC-NR-03 | Eviter regression champs proteges | Tentatives sur email/plan/id/status/srpSalt/passwordHash refusees | Reutilise TC-ERR-06, TC-ERR-07 |
| TC-NR-04 | Eviter regression schema preferences | Cle inconnue ou valeur hors schema refusee | Reutilise TC-ERR-05, TC-ERR-09 |
| TC-NR-05 | Eviter regression compatibilite PD-106 | Reponse GET contient toujours name,email,avatar_url | Reutilise TC-NOM-01 |
| TC-NR-06 | Eviter regression rate limit | Rate limit global toujours applique | Reutilise TC-ERR-08 |
7. Tests negatifs et adversariaux¶
| Test ID | Entree invalide / abus | Resultat attendu | Observable |
|---|---|---|---|
| TC-NEG-01 | Payload PUT contenant champs modifiables + champ protege | Refus global, aucune mutation partielle | Meme attendu que TC-INV-02 |
| TC-NEG-02 | Injection de cles imbriquees inconnues dans preferences | Rejet validation explicite | Meme attendu que TC-ERR-05 |
| TC-NEG-03 | Rafale d'appels GET/PUT profil | Declenchement rate limit | Meme attendu que TC-ERR-08 |
| TC-NEG-04 | JWT revoque utilise sur GET/PUT | Refus auth explicite | Meme attendu que TC-ERR-01/02 |
| TC-NEG-05 | avatar_url vide/invalide selon regles de validation | Refus validation sans ecriture | Meme attendu que TC-ERR-09 |
| TC-NEG-06 | Tentative lecture avec contexte identite incoherent | Refus acces croise, aucune fuite | Meme attendu que TC-ERR-03 |
8. Observabilite requise pour les tests¶
- Possibilite d'executer GET/PUT profil avec et sans JWT.
- Jeux de donnees deterministes pour U1 et U2.
- Inspection complete des reponses JSON (presence/absence champs).
- Verification avant/apres en base (ou equivalent d'etat) pour prouver absence de mutation partielle.
- Capacite a injecter erreurs deterministes (validation, interne, rate limit, auth).
- Traces d'execution permettant d'associer chaque test a un code erreur contractuel.
- Horloge de test stable et seuil de rate limit configurable en environnement de test.
Prerequis bloquants: - Environnement de test avec controle des JWT (valide, invalide, revoque). - Environnement de test avec au moins deux utilisateurs distincts (U1, U2). - Configuration explicite du rate limiting en environnement de test (seuil N requetes, fenetre T secondes) avant execution des tests. - Mecanisme explicite de simulation d'acces croise en environnement de test (contexte identite U1 avec verification de non exposition/non modification des donnees U2 via controle d'etat). - Acces a un artefact conformite externe pour la preuve RGPD exhaustive (hors perimetre PD-32).
9. Regles non testables¶
| Regle | Raison | Impact |
|---|---|---|
| INV-32-11 / CA-32-14 (preuve juridique RGPD exhaustive) | Hors perimetre PD-32 endpoint ; depend d'artefacts compliance externes | Bloquant pour verdict de conformite RGPD globale si artefact absent |
10. Verdict QA¶
⚠️ Testable partiellement
- Invariants couverts : 11/11 references, dont 1 NON TESTABLE par nature de perimetre (INV-32-11)
- Criteres couverts : 14/14 references, dont 1 NON TESTABLE par nature de perimetre (CA-32-14)
- Cas d'erreur couverts : 6/6
- Reserve bloquante hors perimetre : preuve RGPD exhaustive a fournir via artefact externe