Lancer les tests
Tests unitaires
Les tests unitaires se trouvent dans__tests__/ et utilisent Vitest avec jsdom.
Écrire un test unitaire de politique
Tests de bout en bout
Les tests E2E invoquent le vrai binairefailproofai en tant que sous-processus, lui transmettent un payload JSON via stdin et vérifient la sortie stdout ainsi que le code de sortie. Cette approche 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 que les fichiers de hooks personnalisés utilisent lors de l’import 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
Utiliser les utilitaires E2E
FixtureEnv — environnement isolé par test :
createFixtureEnv() enregistre automatiquement le nettoyage via afterEach.
runHook — invoquer le binaire :
Payloads — fabriques de payloads prêtes à 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"— aucun global de navigateur requispool: "forks"— isolation réelle des processus (les tests lancent des sous-processus)testTimeout: 20_000— 20 secondes 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 complète en CI (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 parallèle dans un job CI distinct.
Consultez Contributing pour la liste de vérification complète avant fusion.
