Aller au contenu

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