PD-272 — Scénarios de tests contractuels
1. Références
- Spécification :
PD-272-specification.md - JIRA : PD-272
2. Matrice de couverture
| ID Invariant | ID Critère | ID Test | Couverture | Commentaire |
| INV-272-01 | CA-272-04 | TC-NOM-01 | Oui | L'insertion est autorisée puis la ligne devient non modifiable/supprimable. |
| INV-272-02 | CA-272-02 | TC-ERR-01 | Oui | Rejet UPDATE avec message exact contractuel. |
| INV-272-03 | CA-272-03 | TC-ERR-02 | Oui | Rejet DELETE avec message exact contractuel. |
| INV-272-04 | CA-272-04 | TC-NOM-01 | Oui | Vérifie que INSERT n'est pas bloqué. |
| INV-272-05 | CA-272-02, CA-272-03 | TC-NEG-01, TC-NEG-02 | Oui | Vérifie absence d'exception selon acteur/contexte/statut. |
| INV-272-06 | CA-272-02, CA-272-03 | TC-INV-06 | Oui | Toute transition sortante de modification/suppression interdite. |
| INV-272-07 | N/A | TC-NT-01 | Non | Non testable dans ce périmètre. |
| INV-272-08 | CA-272-01, CA-272-05 | TC-NOM-02 | Oui | check_proof_immutable_trigger doit retourner OK. |
| N/A | CA-272-01 | TC-NOM-03 | Oui | Présence du mécanisme vérifiée via métadonnées DB. |
| N/A | CA-272-06 | TC-NR-01 | Oui | Non-régression globale de la suite existante. |
3. Scénarios de test — Flux nominaux
TC-NOM-01 — Insertion autorisée
GIVEN
- Base de test propre, migration PD-272 appliquée
- Table cible accessible: legal_composite_proofs
- Jeu de données valide pour créer une preuve composite
WHEN
- Exécution d'un INSERT valide dans legal_composite_proofs
THEN
- L'INSERT est accepté sans erreur d'immutabilité
- 1 ligne est présente avec l'identifiant inséré
AND
- L'état persistant est vérifiable (lecture de la ligne possible)
GIVEN
- Schéma DB déployé avec migration PD-272
WHEN
- Exécution du contrôle formel check_proof_immutable_trigger
THEN
- Le statut retourné est strictement "OK"
AND
- Aucune anomalie bloquante n'est remontée par le contrôle
TC-NOM-03 — Présence du mécanisme
GIVEN
- Schéma DB déployé
WHEN
- Inspection des métadonnées DB (triggers/fonctions associées à legal_composite_proofs)
THEN
- Un mécanisme actif bloque UPDATE et DELETE sur legal_composite_proofs
AND
- Le mécanisme est attaché à la table cible (pas à une autre table)
4. Scénarios de test — Cas d'erreur
TC-ERR-01 — Update interdit
GIVEN
- Une ligne existante dans legal_composite_proofs (créée via INSERT valide)
WHEN
- Tentative d'UPDATE sur n'importe quelle colonne de cette ligne
THEN
- Exception PostgreSQL levée
- Message exact: "legal_composite_proofs: modification interdite — preuve immutable"
- L'opération SQL est en échec
AND
- Aucune colonne de la ligne n'a été modifiée
TC-ERR-02 — Delete interdit
GIVEN
- Une ligne existante dans legal_composite_proofs
WHEN
- Tentative de DELETE de cette ligne
THEN
- Exception PostgreSQL levée
- Message exact: "legal_composite_proofs: suppression interdite — preuve immutable"
- L'opération SQL est en échec
AND
- La ligne est toujours présente avec le même contenu
GIVEN
- Environnement où le check formel ne retourne pas "OK"
WHEN
- Exécution de check_proof_immutable_trigger
THEN
- Statut différent de "OK" détecté explicitement
- Résultat de conformité = NON CONFORME
5. Tests d'invariants (non négociables)
| Invariant | Test(s) dédiés | Observable | Commentaire |
| INV-272-01 | TC-NOM-01 + TC-ERR-01 + TC-ERR-02 | Insertion possible puis impossibilité de modifier/supprimer | Immutabilité post-insertion démontrée. |
| INV-272-02 | TC-ERR-01 | Exception PostgreSQL + message exact + absence de mutation | Vérification stricte du contrat d'erreur. |
| INV-272-03 | TC-ERR-02 | Exception PostgreSQL + message exact + ligne conservée | Vérification stricte du contrat d'erreur. |
| INV-272-04 | TC-NOM-01 | INSERT accepté | Flux nominal préservé. |
| INV-272-05 | TC-NEG-01 + TC-NEG-02 | Rejet identique quels que soient acteur/contexte/statut | Inconditionnalité testée. |
| INV-272-06 | TC-INV-06 | Toute transition update/delete échoue | Validation état terminal. |
| INV-272-07 | TC-NT-01 | N/A | NON TESTABLE dans ce périmètre. |
| INV-272-08 | TC-NOM-02 | check_proof_immutable_trigger = OK | Critère audit formel. |
6. Tests de non-régression
| Test ID | Objet | Observable |
| TC-NR-01 | Suite backend existante | 0 test en échec supplémentaire |
| TC-NR-02 | Création de preuve composite | Création nominale toujours fonctionnelle après migration |
7. Tests négatifs et adversariaux
| Test ID | Entrée invalide / abus | Résultat attendu |
| TC-NEG-01 | UPDATE sur colonnes différentes (métier, techniques, horodatage) | Rejet systématique avec message contractuel |
| TC-NEG-02 | DELETE via contextes différents (transaction explicite, rôle applicatif) | Rejet systématique avec message contractuel |
| TC-NEG-03 | UPDATE no-op (SET col = col) | Rejet identique — inconditionnalité |
| TC-NEG-04 | DELETE conditionnelle large | Rejet total, 0 ligne supprimée |
| TC-NEG-05 | Check formel sur schéma incomplet | Retour non-OK |
8. Observabilité requise
- État système : contenu de
legal_composite_proofs avant/après chaque opération - Journal d'audit : trace d'échec d'opération DML
- Export probatoire : requête testée, message d'erreur observé, preuve d'absence de mutation
9. Règles non testables
| Règle | Raison | Impact |
| INV-272-07 | Périmètre ne définit ni emplacement ni observables pour artefacts crypto temporaires | Majeur |
10. Verdict QA
- Testable partiellement (avec réserves)
- Réserve unique :
INV-272-07 NON TESTABLE dans ce périmètre - Tous les autres invariants et CA sont testables et automatisables