Aller au contenu

PD-298 — Scénarios de tests contractuels

1. Références

  • Spécification : PD-298-specification.md
  • Epic : EPIC-XX

2. Matrice de couverture

ID Invariant ID Critère ID Test Couverture Commentaire
INV-298-01 CA-298-02 TC-NOM-02 Oui Email invalide bloqué avant toute requête réseau.
INV-298-02 CA-298-04 TC-NOM-09 Oui ARB-7 exact affiché avant tout appel revoke.
INV-298-03 CA-298-10 TC-NOM-03 Oui Affichage 1ère ouverture + persistance drmWarningSeen par compte.
INV-298-04 CA-298-01 TC-NOM-01 Oui Création nominale avec TTL par défaut 10080.
INV-298-04 CA-298-03 TC-ERR-08 Oui TTL hors bornes rejeté côté client.
INV-298-05 CA-298-07 TC-NOM-13 Oui Données partages toujours rafraîchies via réseau.
INV-298-06 CA-287-27 TC-NOM-04 Oui Information RGPD visible avant création.
INV-298-06 CA-298-11 TC-NOM-04 Oui Encart RGPD visible avant CTA.
INV-298-07 CA-298-14 TC-NOM-15 Oui Aucune fuite d’email destinataire dans les logs.
INV-298-08 CA-298-01 TC-NOM-01 Oui Badge initial PENDING_ACTIVATION conforme backend.
INV-298-08 CA-298-06 TC-NOM-06 Oui Filtrage strict sur les 5 états contractuels.
INV-298-09 CA-298-08 TC-NOM-11 Oui Journal affiche colonnes contractuelles.
INV-298-09 CA-298-09 TC-NOM-12 Oui IP toujours masquée, jamais brute.
INV-298-10 CA-298-13 TC-NOM-14 Oui Audit i18n sans chaînes hardcodées.
INV-298-11 CA-298-15 TC-NOM-08 Oui Actions UI alignées sur matrice d’état.
INV-298-12 CA-298-12 TC-NOM-07 Oui CTA “Partager” absent hors propriété.
INV-298-13 CA-298-05 TC-NOM-05 Oui offset/limit, limit=20, tri created_at desc.
INV-298-14 CA-298-15 TC-NOM-16 Oui Toute transition non listée est refusée.
INV-298-15 CA-298-15 TC-NOM-16 Oui REVOKED/EXPIRED terminaux, sans sortie.
INV-298-16 N/A TC-NEG-01 Oui Aucune exploration d’ID non autorisés.
INV-298-17 N/A TC-NOM-17 Oui Aucun fonctionnement offline autorisé.

3. Scénarios de test – Flux nominaux

TEST-ID: TC-NOM-01
Référence spec: INV-298-04, INV-298-08, CA-298-01

GIVEN
  - Utilisateur A authentifié
  - Preuve P possédée par A (UUID v4 valide)
  - Réseau disponible
  - Stub backend: POST /shares => 201 {state=PENDING_ACTIVATION, expiresAt}
WHEN
  - A soumet recipientEmail valide + TTL par défaut (10080) + options valides
THEN
  - 1 requête POST /shares est observée avec payload valide
  - Le badge affiché est PENDING_ACTIVATION
AND
  - Le lien apparaît dans la liste après rafraîchissement réseau
TEST-ID: TC-NOM-02
Référence spec: INV-298-01, CA-298-02

GIVEN
  - Formulaire de création ouvert
  - Sonde réseau active
WHEN
  - L’utilisateur saisit un email invalide et appuie sur soumettre
THEN
  - La soumission est bloquée localement
  - Un message de validation est visible
AND
  - Aucune requête POST /shares n’est émise
TEST-ID: TC-NOM-03
Référence spec: INV-298-03, CA-298-10

GIVEN
  - Compte A avec drmWarningSeen absent/false
WHEN
  - A ouvre le formulaire, acquitte l’avertissement DRM, ferme puis rouvre le formulaire
THEN
  - L’avertissement DRM est affiché à la première ouverture uniquement
  - drmWarningSeen(A)=true est persisté
AND
  - La 2e ouverture n’affiche pas automatiquement l’avertissement
TEST-ID: TC-NOM-04
Référence spec: INV-298-06, CA-287-27, CA-298-11

GIVEN
  - Formulaire de création ouvert
  - Données de saisie valides
WHEN
  - L’utilisateur atteint le CTA de soumission
THEN
  - L’encart RGPD est visible avant le bouton de soumission
AND
  - La visibilité est vérifiable au moment exact de l’action de soumission
TEST-ID: TC-NOM-05
Référence spec: INV-298-13, CA-298-05

GIVEN
  - 45 partages appartenant au propriétaire, avec created_at distincts
WHEN
  - L’utilisateur ouvre “Mes partages”, puis déclenche un chargement page suivante
THEN
  - Appel 1: GET /shares?offset=0&limit=20
  - Appel 2: GET /shares?offset=20&limit=20
AND
  - L’ordre affiché est strictement created_at desc
TEST-ID: TC-NOM-06
Référence spec: INV-298-08, CA-298-06

GIVEN
  - Dataset contenant des partages dans les 5 états contractuels
WHEN
  - L’utilisateur applique successivement chaque filtre d’état
THEN
  - Les résultats affichés correspondent uniquement à l’état sélectionné
AND
  - Les badges affichés reflètent strictement la valeur backend
TEST-ID: TC-NOM-07
Référence spec: INV-298-12, CA-298-12

GIVEN
  - Utilisateur connecté A
  - Détail d’une preuve possédée par B (B != A)
WHEN
  - A ouvre l’écran détail de la preuve
THEN
  - Le CTA “Partager” est absent
AND
  - Aucun flux de création partage n’est déclenchable depuis cet écran
TEST-ID: TC-NOM-08
Référence spec: INV-298-11, CA-298-15

GIVEN
  - Un partage de test pour chaque état: PENDING_ACTIVATION, ACTIVE, OTP_BLOCKED, REVOKED, EXPIRED
WHEN
  - L’utilisateur ouvre le détail de chaque partage
THEN
  - Les actions disponibles sont conformes à la matrice §5.5
AND
  - Aucun bouton d’action interdit n’est visible
TEST-ID: TC-NOM-09
Référence spec: INV-298-02, CA-298-04

GIVEN
  - Partage en état ACTIVE
  - Référence textuelle ARB-7 officielle disponible
WHEN
  - L’utilisateur clique “Révoquer” puis confirme explicitement
THEN
  - La modale affiche le texte ARB-7 exact avant confirmation
  - L’appel POST /shares/:id/revoke n’est émis qu’après confirmation
AND
  - L’état devient REVOKED après réponse backend de succès
TEST-ID: TC-NOM-10
Référence spec: ERR-298-02

GIVEN
  - Partage en état ACTIVE
  - Modale de révocation affichée
WHEN
  - L’utilisateur annule/ferme la modale sans confirmer
THEN
  - Aucun appel POST /shares/:id/revoke n’est émis
AND
  - L’état du partage reste inchangé
TEST-ID: TC-NOM-11
Référence spec: CA-298-08, INV-298-09

GIVEN
  - GET /shares/:id/events retourne au moins 1 événement valide
WHEN
  - L’utilisateur ouvre le journal d’accès
THEN
  - Chaque ligne affiche date/heure, type, email, IP masquée, device
AND
  - Le journal n’est pas vide silencieusement
TEST-ID: TC-NOM-12
Référence spec: INV-298-09, CA-298-09

GIVEN
  - Journal contenant événements IPv4 et IPv6 valides
WHEN
  - L’écran journal est rendu
THEN
  - L’IP affichée suit un format masqué (v4 et v6)
AND
  - Aucune IP brute n’apparaît à l’écran
TEST-ID: TC-NOM-13
Référence spec: INV-298-05, CA-298-07

GIVEN
  - Données de partage déjà consultées une première fois
  - État backend modifié entre deux consultations
WHEN
  - L’utilisateur rouvre successivement: liste globale, détail, journal
THEN
  - Chaque ouverture déclenche un appel réseau frais
AND
  - L’affichage reflète l’état backend à jour
TEST-ID: TC-NOM-14
Référence spec: INV-298-10, CA-298-13

GIVEN
  - Scope code UI de la feature partage (FR)
WHEN
  - Audit statique des chaînes visibles + exécution UI en locale FR
THEN
  - 0 chaîne visible hardcodée dans le code de feature
AND
  - 100% des libellés proviennent des ressources i18n
TEST-ID: TC-NOM-15
Référence spec: INV-298-07, CA-298-14

GIVEN
  - Exécution des flux création/liste/détail/journal avec emails de test connus
WHEN
  - Inspection des logs applicatifs et traces fonctionnelles
THEN
  - Aucun email destinataire brut n’est présent
AND
  - Le shareId reste disponible pour corrélation technique
TEST-ID: TC-NOM-16
Référence spec: INV-298-14, INV-298-15, CA-298-15

GIVEN
  - Jeux d’états couvrant transitions autorisées et interdites de §5.5
WHEN
  - Des transitions interdites sont proposées par jeu de test (ex: ACTIVE->PENDING_ACTIVATION, REVOKED->ACTIVE)
THEN
  - Les transitions non listées sont refusées
AND
  - Les états REVOKED et EXPIRED restent strictement terminaux
TEST-ID: TC-NOM-17
Référence spec: INV-298-17

GIVEN
  - Appareil offline avant entrée dans la feature partage
WHEN
  - L’utilisateur tente d’ouvrir création, liste, détail, journal
THEN
  - Une erreur réseau explicite est affichée
AND
  - Aucun faux succès local ni mutation d’état locale n’est produit

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

TEST-ID: TC-ERR-01
Référence spec: ERR-298-01

GIVEN
  - Formulaire ouvert
WHEN
  - Email invalide soumis
THEN
  - Rejet local explicite
  - Aucune requête backend
TEST-ID: TC-ERR-02
Référence spec: ERR-298-02

GIVEN
  - Partage révoquable
WHEN
  - Révocation initiée sans confirmation finale
THEN
  - Aucune requête POST /revoke
  - Aucun changement d’état
TEST-ID: TC-ERR-03
Référence spec: ERR-298-03

GIVEN
  - UI locale avec état obsolète
WHEN
  - Le backend retourne un état différent lors d’un refresh
THEN
  - Rechargement réseau immédiat
  - Priorité absolue à l’état backend
TEST-ID: TC-ERR-04
Référence spec: ERR-298-04

GIVEN
  - Flux avec email destinataire connu
WHEN
  - Inspection de logs révèle un email brut
THEN
  - Verdict non-conforme sécurité
  - Test échoue sans tolérance
TEST-ID: TC-ERR-05
Référence spec: ERR-298-05

GIVEN
  - drmWarningSeen=false
WHEN
  - L’utilisateur tente de soumettre sans affichage préalable DRM
THEN
  - Soumission bloquée
  - Aucune requête POST /shares
TEST-ID: TC-ERR-06
Référence spec: ERR-298-06

GIVEN
  - GET /events retourne liste vide
WHEN
  - Écran journal affiché
THEN
  - Message contextuel explicite affiché
  - Aucun écran vide silencieux
TEST-ID: TC-ERR-07
Référence spec: ERR-298-07

GIVEN
  - Preuve non possédée
WHEN
  - Tentative de contournement via navigation directe
THEN
  - CTA partage absent côté UI
  - Si backend répond 403, message géré sans fuite d’information
TEST-ID: TC-ERR-08
Référence spec: ERR-298-08, CA-298-03

GIVEN
  - Formulaire avec TTL custom
WHEN
  - TTL <15 ou >43200
THEN
  - Rejet client bloquant + message de borne
  - Aucune requête POST /shares
TEST-ID: TC-ERR-09
Référence spec: ERR-298-09

GIVEN
  - Partage en OTP_BLOCKED
WHEN
  - Détail affiché
THEN
  - Explication explicite de l’état bloqué visible
  - Action recommandée “Révoquer” visible
TEST-ID: TC-ERR-10
Référence spec: ERR-298-10

GIVEN
  - Formulaire prêt à soumission
WHEN
  - Encart RGPD non visible au-dessus du CTA
THEN
  - Soumission interdite
  - Non-conformité contractuelle enregistrée
TEST-ID: TC-ERR-11
Référence spec: ERR-298-11

GIVEN
  - Session expirée
WHEN
  - Appel endpoint share retourne 401
THEN
  - Erreur d’auth affichée
  - Redirection vers flux auth existant
TEST-ID: TC-ERR-12
Référence spec: ERR-298-12

GIVEN
  - Timeout réseau ou perte connectivité pendant action partage
WHEN
  - Requête échoue
THEN
  - Erreur réseau explicite affichée
  - Aucun faux succès local

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

Invariant Test(s) dédiés Observable Commentaire
INV-298-01 TC-NOM-02, TC-ERR-01 0 appel API avec email invalide Validation locale obligatoire.
INV-298-02 TC-NOM-09, TC-ERR-02 ARB-7 affiché avant revoke Révocation explicitement consentie.
INV-298-03 TC-NOM-03, TC-ERR-05 Affichage 1ère ouverture + mémorisation locale Comportement par compte utilisateur.
INV-298-04 TC-NOM-01, TC-ERR-08 TTL défaut=10080 et bornes [15..43200] Hors borne bloquant.
INV-298-05 TC-NOM-13, TC-NR-01 Appels frais à chaque affichage Pas de cache persistant share.
INV-298-06 TC-NOM-04, TC-ERR-10 Encart RGPD visible avant CTA Conformité CA-287-27.
INV-298-07 TC-NOM-15, TC-ERR-04 Absence d’email dans logs PII protégée.
INV-298-08 TC-NOM-06, TC-NEG-05 Badge = état backend contractuel État inconnu bloquant.
INV-298-09 TC-NOM-12, TC-NEG-07 IP masquée uniquement Fallback si masquage impossible.
INV-298-10 TC-NOM-14, TC-NR-02 0 chaîne hardcodée visible i18n complet exigé.
INV-298-11 TC-NOM-08, TC-NR-03 Actions selon état Aucun bouton hors matrice.
INV-298-12 TC-NOM-07, TC-ERR-07 CTA partage absent hors propriété Guard de propriété effectif.
INV-298-13 TC-NOM-05, TC-NEG-02 limit=20, offset cohérent, tri desc Contrat pagination MVP figé.
INV-298-14 TC-NOM-16 Transitions non listées rejetées Machine à états fermée.
INV-298-15 TC-NOM-16, TC-NEG-04 REVOKED/EXPIRED sans sortie États terminaux stricts.
INV-298-16 TC-NEG-01, TC-NEG-08 Pas d’appels exploratoires Anti-énumération.
INV-298-17 TC-NOM-17, TC-ERR-12 Offline interdit, erreur explicite Réseau requis.

6. Tests de non-régression

Test ID Objet Observable Commentaire
TC-NR-01 Fraîcheur réseau liste/détail/events 1 appel réseau par entrée écran Empêche régression cache local.
TC-NR-02 Externalisation i18n complète Audit statique + runtime FR sans chaîne brute Empêche réintroduction de hardcode.
TC-NR-03 Matrice d’actions par état Snapshot visibilité actions sur 5 états Empêche dérive de droits UI.
TC-NR-04 Redaction logs PII Aucun email brut sur tous flux Empêche fuite RGPD.
TC-NR-05 Pagination contractuelle limit toujours 20, tri desc maintenu Empêche dérive API client.
TC-NR-06 DRM warning first-open Affiché 1 fois par compte, reconsultation possible Empêche régression UX contractuelle.
TC-NR-07 Position RGPD avant CTA Vérification hiérarchie visuelle stable Empêche contournement informationnel.
TC-NR-08 Terminaux immuables REVOKED/EXPIRED restent sans action sortante Empêche rollback métier interdit.

7. Tests négatifs et adversariaux

Test ID Entrée invalide / abus Résultat attendu Observable
TC-NEG-01 Fuzz shareId invalide (non UUID v4) en navigation détail Rejet UI local, aucun appel détail, message bloquant générique 0 requête réseau pour IDs invalides
TC-NEG-02 Tentative de forcer limit != 20 Contrat MVP conservé (limit=20) Capture requête GET /shares
TC-NEG-03 recipientEmail malformé (espaces finaux, format invalide) Soumission bloquée Message validation + 0 POST
TC-NEG-04 Forçage de révocation sur état terminal Action non disponible ou refusée, état inchangé 0 transition sortante terminale
TC-NEG-05 Backend renvoie shareState inconnu Erreur bloquante, élément non actionnable Affichage erreur + actions désactivées
TC-NEG-06 Backend renvoie eventType inconnu Journal conservé avec libellé UNKNOWN_EVENT Ligne affichée sans crash
TC-NEG-07 eventIpRaw non interprétable Afficher “IP masquée indisponible” Fallback visible
TC-NEG-08 Navigation répétée visant inférence de partages non autorisés Aucun appel exploratoire hors scope utilisateur/preuve Traces réseau sans pattern d’énumération

8. Observabilité requise pour les tests

  • État système : auth.user.id, proof.owner_user_id, proof.id, drmWarningSeen(userId), statut connectivité.
  • Réponse API : méthode, URL, query (offset,limit,state), code HTTP, payload complet de shares et events.
  • Journal d’audit : logs applicatifs horodatés avec corrélation par shareId, sans recipientEmail brut.
  • Événement signé / horodaté : horodatage UTC de chaque action test + corrélation requête/réponse (request-id).
  • Export probatoire : HAR réseau, captures écran datées, rapport d’assertions (JUnit/équivalent), hash d’intégrité des artefacts.

9. Règles non testables

Règle Raison Impact
NON TESTABLE — Validité juridique de la base légale RGPD Qualification juridique hors périmètre d’un test fonctionnel UI Majeur
NON TESTABLE — Conformité exacte à la regex D-287-03 Motif regex normatif non fourni dans les entrées accessibles Bloquant
NON TESTABLE — Borne maximale maxViews backend Valeur contractuelle backend absente Majeur
NON TESTABLE — Mapping exhaustif eventType backend->UI Liste finale non figée dans les artefacts fournis Majeur
NON TESTABLE — Règle normative précise de masquage IPv6 Format cible partiellement défini, sans norme de rendu canonique jointe Majeur
NON TESTABLE — Texte RGPD exact “durée de rétention” Copy juridique non fourni Majeur
NON TESTABLE (conditionnel) — Comparaison stricte ARB-7/ARB-8 Textes de référence non présents dans le périmètre documentaire accessible ici Bloquant

10. Verdict QA

  • Testable intégralement
  • Testable partiellement (avec réserves listées)
  • Non testable (refus contractuel)

Réserves bloquantes à lever avant validation finale : D-287-03 (regex exacte), ARB-7/ARB-8 exacts, bornes/valeurs contractuelles manquantes (maxViews, mapping eventType, RGPD rétention).