Exécution des tests
Tests unitaires
Les tests unitaires se trouvent dans__tests__/ et utilisent Vitest avec happy-dom.
Écrire un test unitaire pour une politique
Tests de bout en bout
Les tests E2E invoquent le binairefailproofai réel en tant que sous-processus, transmettent un payload JSON via stdin et vérifient la sortie stdout ainsi que le code de sortie. Cela teste le chemin d’intégration complet utilisé par Claude Code.
Configuration
Les tests E2E exécutent le binaire directement depuis les sources du dépôt. Avant la première exécution, compilez le bundle CJS utilisé par les fichiers de hooks personnalisés lorsqu’ils importent depuis'failproofai' :
dist/ chaque fois que vous modifiez l’API publique des hooks (src/hooks/custom-hooks-registry.ts, src/hooks/policy-helpers.ts ou src/hooks/policy-types.ts).
Structure des tests E2E
Utilisation des utilitaires E2E
FixtureEnv — environnement isolé par test :
createFixtureEnv() enregistre automatiquement le nettoyage via afterEach.
runHook — invoquer le binaire :
Payloads — factories de payloads prêts à l’emploi :
Écrire un test E2E
Formats de réponse E2E
| Décision | Code de sortie | stdout |
|---|---|---|
PreToolUse deny | 0 | {"hookSpecificOutput":{"permissionDecision":"deny","permissionDecisionReason":"..."}} |
PostToolUse deny | 0 | {"hookSpecificOutput":{"additionalContext":"Blocked ... because: ..."}} |
| Instruct (hors Stop) | 0 | {"hookSpecificOutput":{"additionalContext":"Instruction from failproofai: ..."}} |
| Stop instruct | 2 | stdout vide ; raison dans stderr |
| Allow | 0 | chaîne vide |
Configuration Vitest
Les tests E2E utilisentvitest.config.e2e.mts avec :
environment: "node"— aucune variable globale navigateur requisepool: "forks"— véritable isolation de processus (les tests lancent des sous-processus)testTimeout: 20_000— 20 s par test (démarrage du binaire + évaluation du hook)
forks est essentiel : les workers basés sur des threads partagent globalThis, ce qui peut interférer avec les tests qui lancent des sous-processus. Les forks basés sur des processus évitent ce problème.
Intégration continue
L’exécution CI complète (bun run lint && bunx tsc --noEmit && bun run test:run && bun run build) doit passer avant toute fusion. La suite E2E s’exécute en tant que job CI distinct, en parallèle.
Consultez Contributing pour la liste de contrôle complète avant fusion.
