Lancer les tests
Tests unitaires
Les tests unitaires se trouvent dans__tests__/ et utilisent Vitest avec happy-dom.
Écrire un test unitaire de politique
Tests de bout en bout
Les tests E2E invoquent le vrai binairefailproofai en tant que sous-processus, lui envoient une charge utile JSON via stdin et vérifient la sortie stdout ainsi que le code de sortie. Cela permet de tester 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
Utiliser les utilitaires E2E
FixtureEnv - environnement isolé par test :
createFixtureEnv() enregistre automatiquement un nettoyage afterEach.
runHook - invoquer le binaire :
Payloads - factories de charges utiles 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"- aucune variable globale de navigateur requisepool: "forks"- véritable isolation des processus (les tests lancent des sous-processus)testTimeout: 20_000- 20 secondes par test (démarrage du binaire + évaluation des hooks)
forks est important : 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 tant que job CI distinct, en parallèle.
Consultez Contributing pour la liste de vérification complète avant fusion.
