Skip to content

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.pyassert_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-pod kubectl 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).