Stratégie de tests — CVN-N014-EC-S16 (dev-productivity tooling)¶
Réfs : plan · architecture · runbook. Taxonomie : ADR-83. Tooling Story — "test strategy" = validation du changement outil : la garantie read-only du lecteur XCom (le risque porteur) + le bootstrap worktree (validé par dogfood).
1. Objectifs & périmètre¶
Tester : (a) la garantie read-only de airflow_xcom_pull.py — assert_select_only refuse tout verbe DDL/DML, le _REMOTE_PROBE n'émet que des SELECT et est wrappé par _guard ; (b) le fail-fast (pas de pod / non-JSON) ; (c) la construction de la requête (filtres dag/run/task/map_index, list-runs).
Ne PAS tester (relève d'autre chose) : l'exécution in-pod réelle (= validation système, dogfood cluster) ; new_worktree.sh côté unitaire (bash ; validé par dogfood — il a provisionné ce worktree dev2).
2. Pyramide + tiers ADR-83¶
| Niveau | Marqueur | Tier | Ce qui est testé | Fichier |
|---|---|---|---|---|
| Garde read-only (pur) | unit |
fast (PR-blocking) | assert_select_only accepte SELECT / rejette chaque verbe d'écriture + smuggling ; _REMOTE_PROBE : chaque execute wrappé _guard, set de verbes interdits, que des SELECT |
tests/unit/test_airflow_xcom_pull.py |
Tous portent @pytest.mark.story("CVN-N014-EC-S16") (ADR-87). 23 tests unitaires, tier fast, verts.
3. Cas de tests — la garantie read-only (cœur)¶
| # | Entrée | Attendu |
|---|---|---|
| R1 | SELECT … (varié : ws, paren, lower-case) |
accepté |
| R2 | INSERT/UPDATE/DELETE/DROP/ALTER/TRUNCATE/CREATE/REPLACE/MERGE/GRANT/REVOKE/COPY/CALL | rejeté (ValueError read-only guard) |
| R3 | SELECT 1; DROP TABLE xcom (smuggling) |
rejeté (scan whole-word) |
| R4 | write-verb en tête même si SELECT plus loin | rejeté (ne commence pas par SELECT) |
| R5 | _REMOTE_PROBE : chaque c.execute( est wrappé text(_guard( |
invariant vérifié (whitespace-robuste) |
| R6 | _REMOTE_PROBE : aucun INSERT/UPDATE/DELETE/DROP statement |
vérifié |
4. Validation système (dogfood — déjà fait)¶
new_worktree.sh: ce worktree dev2 a été provisionné par le script (venv/.env/.claude/mémoire résolus) — la session entière y a tourné. Preuve d'usage in-vivo.airflow_xcom_pull.py: le pattern in-podkubectl exec(read-only SELECT) a servi de référence/voisin tout au long de S01 (round-trip probe, pre-flight) contre le scheduler réel.- Foot-gun
git stash: confirmé en vrai (incident venv de cette session) → la mitigation doc/identité est validée par l'usage.
5. Hors-scope test¶
- Exécution in-pod réelle du lecteur (validation système, accès cluster requis) ; bash de
new_worktree.sh(dogfood, pas de framework bash-unit ici).