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.