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
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).