PD-236 — Scénarios de tests contractuels
1. Références
- Spécification : PD-236-specification.md
- Epic : EPIC-186 (PD-186 BACKEND CORE)
- Dépendance normative : PD-42 (référencée par PD-236)
2. Matrice de couverture
| ID Invariant | ID Critère | ID Test | Couverture | Commentaire |
| INV-01 | CA-03 | TC-INV-01 | Oui | Absence de keywords en clair (stockage & flux) |
| INV-02 | CA-02 | TC-INV-02 | Oui | Recherche par égalité stricte T_kw |
| INV-03 | CA-01 | TC-INV-03 | Oui | Homogénéité stricte des métadonnées par index |
| INV-04 | CA-04 | TC-INV-04 | Oui | Rejet explicite en cas de mismatch métadonnées |
| INV-05 | — | TC-INV-05 | Partiel | Neutralité sémantique (voir NON TESTABLE) |
| — | CA-01 | TC-NOM-01 | Oui | Indexation avec T_kw valide |
| — | CA-02 | TC-NOM-02 | Oui | Recherche retourne l’ensemble exact |
| — | CA-03 | TC-NOM-03 | Oui | Inspection persistance (pas de clair) |
| — | CA-04 | TC-ERR-03 | Oui | Métadonnées absentes/incomplètes |
| — | CA-05 | TC-NR-01 | Oui | Non-régression index existants |
| — | — | TC-ERR-01..05 | Oui | Cas d’erreur contractuels |
3. Scénarios de test – Flux nominaux
TEST-ID: TC-NOM-01
Référence spec: §5.0, §5.1, CA-01, INV-03
GIVEN
- Un index backend cible I (index_id) dont les métadonnées de référence M_I sont fixées selon §5.0
- Un lot de N entrées { (T_kw_i, resource_id_i) } avec métadonnées PD-42 complètes et identiques à M_I
- Chaque T_kw_i respecte le format défini par PD-42 pour l’algorithm_id déclaré (cf. ERR-BE-02)
WHEN
- Une requête d’indexation est soumise au backend pour I
THEN
- Le backend persiste N associations entre T_kw_i et resource_id_i
AND
- Le backend persiste les métadonnées PD-42 associées à I (si applicable) sans divergence
AND
- Aucun champ de type keyword en clair n’est présent dans les données persistées liées à ces entrées
TEST-ID: TC-NOM-02
Référence spec: §5.2, CA-02, INV-02
GIVEN
- Un index backend I déjà alimenté par un ensemble connu d’associations (T_kw, resource_id) et associé à M_I
- Une requête de recherche contenant (T_kw_q, métadonnées PD-42)
- Les métadonnées PD-42 de la requête sont strictement identiques à M_I
WHEN
- La recherche est exécutée
THEN
- Le backend retourne exactement l’ensemble des resource_id associés à T_kw_q
AND
- Aucun resource_id non associé à T_kw_q n’est retourné
AND
- L’ordre de retour n’est pas contractuel (comparaison ensembliste)
TEST-ID: TC-NOM-03
Référence spec: CA-03, INV-01
GIVEN
- Un index backend I alimenté
WHEN
- Un audit / inspection probatoire des données persistées et des charges utiles d’API est effectué
THEN
- Aucun keyword en clair n’est stocké
AND
- Aucun keyword en clair n’apparaît dans les requêtes/réponses de l’API backend pour les opérations de PD-236
TEST-ID: TC-NOM-04
Référence spec: §5.0, §5.2, INV-03
GIVEN
- Un index backend I avec métadonnées attendues M_I fixées selon §5.0
- Deux requêtes de recherche Q1 et Q2 ayant le même T_kw_q mais des métadonnées différentes
- Q1 avec M_I
- Q2 avec M_≠I (diffère sur au moins un champ parmi algorithm_id/canonicalization_id/k_search_scope)
WHEN
- Q1 est exécutée puis Q2 est exécutée
THEN
- Q1 retourne l’ensemble attendu de resource_id
AND
- Q2 est rejetée explicitement (voir TC-INV-04)
4. Scénarios de test – Cas d’erreur
TEST-ID: TC-ERR-01
Référence spec: ERR-BE-01
GIVEN
- Une requête (indexation ou recherche) sans champ T_kw
WHEN
- La requête est soumise
THEN
- Le backend rejette explicitement la requête
AND
- Aucune donnée n’est persistée ni modifiée
TEST-ID: TC-ERR-02
Référence spec: ERR-BE-02
GIVEN
- Une requête contenant un T_kw ne respectant pas le format défini par PD-42 pour l’algorithm_id déclaré (ex: Base64 URL-safe sans padding, longueur 22 pour DET-HMAC-SHA256-B64T22-V1)
WHEN
- La requête est soumise
THEN
- Le backend rejette explicitement
AND
- Aucune donnée n’est persistée ni modifiée
TEST-ID: TC-ERR-03
Référence spec: ERR-BE-03
GIVEN
- Une requête d’indexation ou de recherche contenant un T_kw mais des métadonnées PD-42 absentes ou incomplètes
WHEN
- La requête est soumise
THEN
- Le backend rejette explicitement
AND
- Aucune donnée n’est persistée ni modifiée
TEST-ID: TC-ERR-04
Référence spec: ERR-BE-04, INV-04, CA-04
GIVEN
- Un index backend I associé à des métadonnées attendues M_I
- Une requête contenant (T_kw, M_req) telle que M_req ≠ M_I
WHEN
- La requête est soumise
THEN
- Le backend rejette explicitement
AND
- La réponse inclut un signalement explicite du mismatch (code/raison contractuelle)
AND
- Aucune donnée n’est persistée ni modifiée
TEST-ID: TC-ERR-05
Référence spec: ERR-BE-05, INV-01
GIVEN
- Une requête d’indexation contenant un champ supplémentaire ou une charge utile contenant un keyword en clair (champ explicitement qualifié de keyword dans le contrat d’API)
WHEN
- La requête est soumise
THEN
- Le backend rejette explicitement
AND
- Un événement d’audit est émis/enregistré (cf. Observabilité)
AND
- Aucune donnée n’est persistée ni modifiée
5. Tests d’invariants (non négociables)
| Invariant | Test(s) dédiés | Observable | Commentaire |
| INV-01 | TC-INV-01 | Inspection stockage + payloads API | Inclut détection d’injection clair |
| INV-02 | TC-INV-02 | Résultat d’ensemble exact | Égalité stricte uniquement |
| INV-03 | TC-INV-03 | Cohérence métadonnées sur index | Index homogène |
| INV-04 | TC-INV-04 | Rejet explicite mismatch | Erreur + absence d’effets |
| INV-05 | TC-INV-05 | NON TESTABLE (voir §9) | Neutralité sémantique |
TEST-ID: TC-INV-01
Référence spec: INV-01
GIVEN
- Un ensemble d’opérations d’indexation et de recherche sur I
WHEN
- Les données persistées et les échanges (requêtes/réponses) sont inspectés
THEN
- Aucun keyword en clair n’est trouvé
AND
- Toute tentative de transmission d’un keyword en clair déclenche ERR-BE-05 (voir TC-ERR-05)
TEST-ID: TC-INV-02
Référence spec: INV-02
GIVEN
- Deux tokens distincts T1 et T2
- Un index I contenant des associations pour T1 et aucune pour T2
WHEN
- Une recherche est exécutée avec T1 puis avec T2
THEN
- Les résultats de T1 correspondent exactement aux associations persistées
AND
- Les résultats de T2 sont vides (ou "aucun résultat")
AND
- Aucun mécanisme de recherche partielle/similarité n’affecte le résultat (absence de résultats non exacts)
TEST-ID: TC-INV-03
Référence spec: INV-03
GIVEN
- Un index I avec métadonnées attendues M_I fixées selon §5.0
- Un lot d’indexation L contenant des métadonnées M_L
WHEN
- L est soumis au backend
THEN
- L est accepté si et seulement si M_L == M_I
AND
- Toute tentative d’introduire une seconde configuration de métadonnées pour I est rejetée (voir TC-INV-04)
TEST-ID: TC-INV-04
Référence spec: INV-04
GIVEN
- Un index I avec métadonnées attendues M_I
- Une requête (indexation ou recherche) utilisant M_req != M_I
WHEN
- La requête est soumise
THEN
- Le backend rejette explicitement la requête
AND
- Aucune modification d’état n’est observée
TEST-ID: TC-INV-05
Référence spec: INV-05
STATUT: NON TESTABLE
Justification:
- "Ne déduire aucune information sémantique" n’a pas d’observable contractuel : l’absence d’inférence ne peut pas être prouvée par des tests boîte noire.
- Seuls des éléments indirects (absence de champs sémantiques, absence de logs contenant du clair) sont vérifiables et couverts par INV-01.
6. Tests de non-régression
| Test ID | Objet | Observable | Commentaire |
| TC-NR-01 | Ajout de ressources n’altère pas l’index existant | Résultats identiques avant/après | CA-05 |
| TC-NR-02 | Ajout de nouveaux tokens n’altère pas les tokens existants | Résultats existants inchangés | Non-interférence |
TEST-ID: TC-NR-01
Référence spec: CA-05
GIVEN
- Un index I avec un état initial S0
- Un ensemble de requêtes de recherche Q couvrant plusieurs T_kw existants
WHEN
- De nouvelles associations (T_kw_new, resource_id_new) sont indexées
THEN
- Pour tout T_kw existant dans Q, les résultats de recherche restent identiques entre S0 et S1
TEST-ID: TC-NR-02
Référence spec: CA-05
GIVEN
- Un index I alimenté avec des tokens existants
- Un ensemble de requêtes Q_exist
WHEN
- Un nouveau token T_kw_new est introduit avec des associations
THEN
- Les résultats des requêtes Q_exist ne changent pas
7. Tests négatifs et adversariaux
| Test ID | Entrée invalide / abus | Résultat attendu | Observable |
| TC-NEG-01 | Requête de recherche sans métadonnées | Rejet | ERR-BE-03 |
| TC-NEG-02 | Tentative de mismatch de scope (k_search_scope) | Rejet | ERR-BE-04 |
| TC-NEG-03 | Tentative d’injection de keyword en clair dans un champ inattendu | Rejet + audit | ERR-BE-05 |
TEST-ID: TC-NEG-01
Référence spec: ERR-BE-03
GIVEN
- Une requête de recherche contenant T_kw mais sans métadonnées PD-42
WHEN
- La requête est soumise
THEN
- Rejet explicite
AND
- Aucun effet de bord
TEST-ID: TC-NEG-02
Référence spec: ERR-BE-04
GIVEN
- Un index I dont k_search_scope attendu est S
- Une requête de recherche utilisant k_search_scope S' ≠ S
WHEN
- La requête est soumise
THEN
- Rejet explicite (mismatch)
AND
- Aucun effet de bord
TEST-ID: TC-NEG-03
Référence spec: ERR-BE-05
GIVEN
- Une requête d’indexation contenant un champ non prévu incluant un keyword en clair
WHEN
- La requête est soumise
THEN
- Rejet explicite
AND
- Trace d’audit enregistrée/émise
8. Observabilité requise pour les tests
- Réponses d’API : statut de succès/échec, codes d’erreur contractuels (ERR-BE-01..05), raison de rejet.
- État système : présence des associations (T_kw, resource_id) et absence de champs "keyword" en clair.
- Journal d’audit : enregistrement/émission d’un événement en cas de tentative d’injection de keyword en clair (ERR-BE-05).
- Capacité d’inspection probatoire : export ou lecture contrôlée des données persistées pertinentes à l’index.
9. Règles non testables
| Règle | Raison | Impact |
| INV-05 « Le backend ne déduit aucune information sémantique à partir de T_kw » | Non démontrable par tests boîte noire ; absence d’inférence interne non observable | Majeur (doit rester un principe, non une preuve) |
10. Verdict QA
✅ Testable partiellement (avec réserves listées)
- Tous les invariants INV-01..INV-04 et critères CA-01..CA-05 sont testables via des scénarios déterministes.
- INV-05 est NON TESTABLE en boîte noire ; seules des garanties indirectes (absence de clair) sont vérifiables via INV-01.