Aller au contenu

PD-284 - Scenarios de tests contractuels

1. References

  • Specification : PD-284-specification.md
  • Epic : EPIC-XX

2. Matrice de couverture

ID Invariant ID Critere ID Test Couverture Commentaire
INV-284-01 CA-284-02 TC-NOM-02 Oui Visibilite du bouton urgent reservee aux comptes eligibles avec quota > 0.
INV-284-01 CA-284-03 TC-NOM-03 Oui Quota epuise => bouton desactive + raison explicite.
INV-284-02 CA-284-01 TC-NOM-01 Oui minor ne voit jamais le bouton urgent.
INV-284-03 CA-284-07 TC-NOM-08 Oui Badge derive uniquement des flags backend, sans seuil local.
INV-284-04 CA-284-05 TC-NOM-05 Oui Transitions UI strictement conformes a la machine PD-80.
INV-284-04 CA-284-05 TC-ERR-02 Oui Etat inconnu / transition illicite => erreur controlee, pas de saut d'etat.
INV-284-05 CA-284-05 TC-NOM-05 Oui Chaque etat teste avec transitions autorisees/interdites explicites.
INV-284-06 CA-284-05 TC-NOM-06 Oui SEALED et FAILED_TIMEOUT testes comme terminaux sans sortie.
INV-284-07 CA-284-06 TC-NOM-07 Oui Perte SSE + 3 echecs => polling 5s + signal hors ligne + reprise auto.
INV-284-07 CA-284-06 TC-NOM-14 Oui Perte reseau conserve dernier etat puis reprend automatiquement.
INV-284-08 CA-284-08 TC-NOM-09 Oui Notification succes contient deep-link valide vers le detail.
INV-284-08 CA-284-09 TC-NOM-10 Oui Notification echec contient deep-link valide vers le detail.
INV-284-09 N/A TC-INV-09 Oui Aucun artefact sensible persiste en clair sans stockage protege.
INV-284-10 N/A TC-INV-10 Oui Aucun contrat inter-module backend supplementaire introduit.
N/A CA-284-04 TC-NOM-04 Oui Demarrage urgent reussi ouvre immediatement la carte de progression.
N/A CA-284-10 TC-NOM-11 Oui Performance rendu event->UI P95 <= 100 ms.
N/A CA-284-11 TC-NOM-12 Oui mode_expert=false masque completement le panneau expert.
N/A CA-284-12 TC-NOM-13 Oui Champs expert affiches uniquement aux jalons contractuels.

3. Scenarios de test - Flux nominaux

TEST-ID: TC-NOM-01
Reference spec: INV-284-02, CA-284-01

GIVEN
  - Utilisateur authentifie avec `account_type=minor`
  - Ecran detail document charge avec payload serveur valide
WHEN
  - L'utilisateur ouvre le detail document
THEN
  - Aucune occurrence du bouton `Scellement urgent` n'est rendue
AND
  - Aucun call-to-action urgent cliquable n'apparait dans l'arbre UI
TEST-ID: TC-NOM-02
Reference spec: INV-284-01, CA-284-02

GIVEN
  - Utilisateur `standard` (ou `premium|enterprise`)
  - Quota urgent restant > 0 fourni par le backend
WHEN
  - L'utilisateur ouvre le detail document
THEN
  - Le bouton `Scellement urgent` est visible et actif
  - Le quota restant est affiche
AND
  - La valeur de quota affichee est strictement egale a celle du payload serveur
TEST-ID: TC-NOM-03
Reference spec: INV-284-01, CA-284-03

GIVEN
  - Utilisateur eligibile non-minor
  - Quota urgent restant = 0
WHEN
  - L'utilisateur ouvre le detail document
THEN
  - Le bouton urgent est desactive (ou absent selon regle d'ecran)
AND
  - Une raison explicite est visible (ex: quota epuise)
TEST-ID: TC-NOM-04
Reference spec: Flux A, CA-284-04

GIVEN
  - Bouton urgent actif pour un `document_id` valide
  - Endpoint de declenchement retourne succes avec `seal_id` valide
WHEN
  - L'utilisateur declenche `Scellement urgent`
THEN
  - Un feedback immediat de chargement est visible
  - La carte de progression active est affichee pour le `seal_id` retourne
AND
  - Une tentative d'abonnement SSE est initiee pour ce `seal_id`
TEST-ID: TC-NOM-05
Reference spec: INV-284-04, INV-284-05, CA-284-05, §5.7

GIVEN
  - Un scellement demarre en `RECEIVED`
  - Un flux d'evenements backend ordonnes et valides
WHEN
  - Les evenements successifs couvrent toutes les transitions autorisees
THEN
  - L'historique UI ne contient que les transitions autorisees de §5.7
  - Aucune transition interdite (retour arriere, saut interdit) n'est acceptee
AND
  - Toute transition non autorisee est rejetee avec erreur controlee observable
TEST-ID: TC-NOM-06
Reference spec: INV-284-06, CA-284-05

GIVEN
  - Un scellement est en etat terminal `SEALED` ou `FAILED_TIMEOUT`
WHEN
  - Un nouvel evenement SSE/polling tente d'imposer une transition sortante
THEN
  - L'etat affiche reste strictement terminal et inchange
AND
  - L'evenement est ignore et journalise comme transition interdite
TEST-ID: TC-NOM-07
Reference spec: INV-284-07, CA-284-06, Flux B

GIVEN
  - Carte active avec abonnement SSE en cours
WHEN
  - Trois echecs consecutifs de reconnexion SSE sont injectes
THEN
  - Le client bascule en fallback polling toutes les 5 secondes
  - L'indicateur `Hors ligne` est affiche tant que SSE est indisponible
AND
  - Des que SSE redevient disponible, le polling s'arrete et SSE reprend
TEST-ID: TC-NOM-08
Reference spec: INV-284-03, CA-284-07, Flux C

GIVEN
  - Un scellement en cours avec UI de progression visible
WHEN
  - Le backend emet successivement les flags `normal`, `retard`, `critique`
THEN
  - Les badges UI correspondants sont `aucun`, `En retard`, `Critique`
AND
  - Aucun calcul local de seuil n'est observe (seule la valeur backend pilote)
TEST-ID: TC-NOM-09
Reference spec: INV-284-08, CA-284-08, Flux E

GIVEN
  - Scellement en `ANCHOR_PENDING`
  - Service de notification disponible
WHEN
  - L'evenement terminal `SEALED` est recu
THEN
  - Une notification succes est emise
  - Le deep-link transporte un identifiant de scellement valide
AND
  - L'ouverture de la notification amene sur l'ecran detail du scellement concerne
TEST-ID: TC-NOM-10
Reference spec: INV-284-08, CA-284-09, Flux E

GIVEN
  - Scellement en cours
  - Service de notification disponible
WHEN
  - L'evenement terminal `FAILED_TIMEOUT` est recu
THEN
  - Une notification echec est emise
  - Le deep-link transporte un identifiant de scellement valide
AND
  - L'ouverture de la notification amene sur l'ecran detail en etat terminal echec
TEST-ID: TC-NOM-11
Reference spec: CA-284-10, §5.8

GIVEN
  - Environnement de reference iPhone 12+ compatible Expo SDK 54
  - Instrumentation du delai `event_reception_timestamp` -> `ui_render_commit_timestamp`
WHEN
  - Un lot representatif d'evenements valides est traite
THEN
  - Le P95 de latence de rendu est <= 100 ms
AND
  - Toute valeur > 500 ms est classee non conforme contractuelle
TEST-ID: TC-NOM-12
Reference spec: CA-284-11, Flux D

GIVEN
  - Preference utilisateur `mode_expert=false`
WHEN
  - L'utilisateur consulte la carte de progression
THEN
  - Le panneau `Mode expert` est absent
AND
  - Aucun champ expert n'est rendu en UI
TEST-ID: TC-NOM-13
Reference spec: CA-284-12, Flux D

GIVEN
  - Preference utilisateur `mode_expert=true`
  - Sequence d'etats complete jusqu'a `SEALED`
WHEN
  - Les evenements progressent de `RECEIVED` vers `SEALED`
THEN
  - `hash_document` apparait des reception valide
  - `tsa_token_ref` apparait a `TSA_SEALED`
  - `merkle_root` apparait des disponibilite backend
  - `blockchain_tx_hash` et `proof_package` apparaissent en etat `SEALED`
AND
  - Un champ invalide est masque sans casser la carte globale
TEST-ID: TC-NOM-14
Reference spec: INV-284-07, Cas d'erreur coupure reseau

GIVEN
  - Un dernier etat connu valide est affiche
WHEN
  - La connectivite reseau est perdue puis retablie
THEN
  - L'UI conserve le dernier etat connu pendant la coupure
  - Le badge `Hors ligne` est visible durant la coupure
AND
  - La reprise automatique actualise l'etat sans reset manuel utilisateur

4. Scenarios de test - Cas d'erreur

TEST-ID: TC-ERR-01
Reference spec: Cas d'erreur POST urgent rejete

GIVEN
  - Bouton urgent actif
  - Endpoint de declenchement retourne 4xx ou 5xx
WHEN
  - L'utilisateur lance le scellement urgent
THEN
  - Message d'echec explicite visible
  - Aucune carte de progression active n'est ouverte
AND
  - Aucun abonnement SSE n'est maintenu pour un scellement non cree
TEST-ID: TC-ERR-02
Reference spec: INV-284-04, Cas d'erreur evenement SSE invalide

GIVEN
  - Carte de progression active pour un `seal_id` donne
WHEN
  - Un evenement SSE invalide est recu (format invalide, etat inconnu, ou `seal_id` incoherent)
THEN
  - L'evenement est ignore
  - L'etat affiche reste coherent avec le dernier evenement valide
AND
  - Une erreur controlee est journalisee sans crash UI
TEST-ID: TC-ERR-03
Reference spec: §5.6 Donnees contractuelles

GIVEN
  - Donnees expert invalides (`hash_document`, `merkle_root`, `blockchain_tx_hash`) selon regex contractuelles
WHEN
  - Le client recoit ces donnees
THEN
  - Les champs concernes sont masques
  - La carte globale reste fonctionnelle
AND
  - Une alerte non bloquante est observable dans les journaux client
TEST-ID: TC-ERR-04
Reference spec: Flux E, Cas d'erreur push impossible

GIVEN
  - Etat terminal atteint (`SEALED` ou `FAILED_TIMEOUT`)
  - Envoi push indisponible simule
WHEN
  - Le moteur de notification tente l'emission
THEN
  - Le fallback email est declenche conformement a PD-80
AND
  - L'echec push est trace sans perte de notification terminale
TEST-ID: TC-ERR-05
Reference spec: §5.6 `account_type` invalide

GIVEN
  - Payload utilisateur avec `account_type` hors enum contractuelle
WHEN
  - Le detail document est rendu
THEN
  - Le compte est traite comme non eligible
  - Le bouton urgent n'est pas activable
AND
  - Aucune tentative de declenchement urgent n'est possible
TEST-ID: TC-ERR-06
Reference spec: §5.8 Parametres numeriques contractuels

GIVEN
  - Parametres clients hors bornes injectes en configuration
WHEN
  - L'app initialise la strategie de reconnexion/polling
THEN
  - Les valeurs sont clamp dans les bornes min/max contractuelles
AND
  - Les valeurs effectives appliquees sont observables dans les diagnostics client
TEST-ID: TC-ERR-07
Reference spec: INV-284-08 Deep-link terminal

GIVEN
  - Une notification terminale contenant un deep-link malforme
WHEN
  - L'utilisateur ouvre la notification
THEN
  - L'application ne crash pas
  - L'ouverture detail est refusee de maniere controlee
AND
  - Une erreur exploitable est journalisee pour correction

5. Tests d'invariants (non negociables)

Invariant Test(s) dedies Observable Commentaire
INV-284-01 TC-NOM-02, TC-NOM-03 Bouton urgent visible/actif uniquement si non-minor et quota > 0 Regle d'eligibilite stricte.
INV-284-02 TC-NOM-01 Aucune occurrence UI du bouton pour minor Fast-track implicite respecte.
INV-284-03 TC-NOM-08 Badge UI strictement aligne aux indicateurs backend Pas de seuil local invente.
INV-284-04 TC-NOM-05, TC-ERR-02 Rejet des transitions inconnues/interdites avec erreur controlee Conformite machine d'etats.
INV-284-05 TC-NOM-05 Table d'autorisation par etat verifiee (autorisations + interdictions) Exigence transitions inverses couverte.
INV-284-06 TC-NOM-06 Etats terminaux sans transition sortante Fermeture irreversible validee.
INV-284-07 TC-NOM-07, TC-NOM-14 Dernier etat conserve + Hors ligne + reprise auto Robustesse reseau.
INV-284-08 TC-NOM-09, TC-NOM-10, TC-ERR-07 Notifications terminales avec deep-link valide et resolvable Tracabilite utilisateur.
INV-284-09 TC-INV-09 Absence de persistence durable en clair d'artefacts sensibles Invariant securite probatoire.
INV-284-10 TC-INV-10 Aucune nouvelle contrainte backend inter-modules detectee Story strictement front-only.
TEST-ID: TC-INV-09
Reference spec: INV-284-09

GIVEN
  - Parcours complet de scellement incluant mode expert
WHEN
  - Les stockages durables client (preferences, cache persistant, fichiers applicatifs) sont inspectes
THEN
  - Aucun artefact cryptographique sensible n'est stocke en clair sans mecanisme de protection plateforme
AND
  - Toute donnee sensible persistante est chiffree/protegee selon les garanties iOS requises
TEST-ID: TC-INV-10
Reference spec: INV-284-10, §5.10

GIVEN
  - Contrat d'API et de flux backend de reference avant story PD-284
WHEN
  - Le diff contractuel apres implementation front est audite
THEN
  - Aucune exigence backend additionnelle inter-module n'est introduite
AND
  - Les appels backend restent dans le cadre PD-80 sans nouvelle dependance structurelle

6. Tests de non-regression

Test ID Objet Observable Commentaire
TC-NR-01 Regles d'eligibilite urgent Meme comportement UI entre build de reference et build cible pour minor, quota 0, quota > 0 Evite regression sur exposition du bouton.
TC-NR-02 Monotonicite des transitions Aucune transition retour ou saut interdit sur rejouage d'evenements historiques Protege la coherence etat->UI.
TC-NR-03 Strategie resilience SSE/polling Seuil 3 echecs + polling 5s + retour SSE restent constants Evite derive des parametres contractuels.
TC-NR-04 Mode expert progressif Ordre d'apparition des champs expert identique a la baseline conforme Empeche fuite prematuree ou disparition de preuves.
TC-NR-05 Notifications terminales Deep-link terminal success/failure toujours resolvable vers detail correct Protege la tracabilite fin de flux.

7. Tests negatifs et adversariaux

Test ID Entree invalide / abus Resultat attendu Observable
TC-NEG-01 document_id non UUID v4 (taille/format invalide) Rejet requete urgent (4xx), pas de progression Reponse API + absence carte active.
TC-NEG-02 Evenement SSE avec seal_id invalide ou mismatch Evenement ignore, erreur controlee Etat UI stable + journal d'erreur structure.
TC-NEG-03 hash_document uppercase ou longueur != 64 Champ masque, non bloquant Panneau expert partiel mais carte intacte.
TC-NEG-04 blockchain_tx_hash sans prefixe 0x Lien explorateur masque Absence CTA explorateur, pas de crash.
TC-NEG-05 Flood d'evenements dupliques/rejoues Aucune regression d'etat (idempotence UI) Historique transitions sans retour arriere.
TC-NEG-06 event_id SSE invalide (>128 ou non printable) Reprise sans Last-Event-ID Trace de reprise degradee mais continue.
TC-NEG-07 Notification avec deep-link externe non autorise Navigation refusee de maniere sure Aucune ouverture hors domaine app, erreur tracee.

8. Observabilite requise pour les tests

  • Etat systeme : snapshot de l'etat UI courant (state, etape, badge degradation, mode expert visible/non visible).
  • Reponse API : traces HTTP pour POST urgent (status, payload, erreur metier), plus endpoint de polling (status/latence).
  • Journal d'audit : logs client structures pour cycle SSE (open/error/retry/failover/recover), transitions d'etat, et erreurs controlees.
  • Evenement signe / horodate : timestamp de reception evenements temps reel + identifiants seal_id/event_id corrables (source serveur).
  • Export probatoire : export de preuves QA contenant traces notifications, deep-links resolus, mesures P95 event->render, et captures d'ecrans horodatees.

9. Regles non testables

Regle Raison Impact
Contrat exact de POST /seals/urgent (champs/codes metier detailles) Le schema complet est explicitement marque a clarifier (Q-284-02) Majeur
Schema SSE complet et regex stricte event_id Contrat versionne incomplet (Q-284-03), tests limites aux contraintes minimales connues Majeur
Validation exhaustive SLA par etape (target/max) Les valeurs et seuils detailles PD-80 manquent (Q-284-04) Majeur
Validation formelle de tsa_token_ref (regex/casse) Format contractuel non fige (Q-284-05) Majeur
Comportement iOS hors foreground (locale vs push distante) Politique non tranchee (Q-284-06) Majeur
Verification quota max par plan (standard/premium/enterprise) Valeurs numeriques non fournies (Q-284-08) Majeur
Epic de reference final Identifiant epic non renseigne (Q-284-01), n'empeche pas la testabilite fonctionnelle Mineur

10. Verdict QA

  • ⚠️ Testable partiellement (avec reserves listees)

Le comportement UX principal est testable de maniere deterministe (eligibilite, progression, transitions, degrades, notifications, non-regression). Le verdict integral reste conditionne a la cloture des clarifications contractuelles Q-284-02 a Q-284-06 et Q-284-08, necessaires pour figer les jeux de donnees et assertions finales.