Executando os testes
Testes unitários
Os testes unitários ficam em__tests__/ e utilizam o Vitest com happy-dom.
Escrevendo um teste unitário de política
Testes end-to-end
Os testes E2E invocam o binário real dofailproofai como subprocesso, enviam um payload JSON via stdin e verificam a saída no stdout e o código de saída. Isso testa o caminho completo de integração que o Claude Code utiliza.
Configuração
Os testes E2E executam o binário diretamente do código-fonte do repositório. Antes da primeira execução, compile o bundle CJS que os arquivos de hook customizados usam ao importar de'failproofai':
dist/ sempre que alterar a API pública de hooks (src/hooks/custom-hooks-registry.ts, src/hooks/policy-helpers.ts ou src/hooks/policy-types.ts).
Estrutura dos testes E2E
Usando os utilitários E2E
FixtureEnv - ambiente isolado por teste:
createFixtureEnv() registra a limpeza via afterEach automaticamente.
runHook - invoca o binário:
Payloads - fábricas de payload prontas para uso:
Escrevendo um teste E2E
Formatos de resposta E2E
| Decisão | Código de saída | stdout |
|---|---|---|
PreToolUse deny | 0 | {"hookSpecificOutput":{"permissionDecision":"deny","permissionDecisionReason":"..."}} |
PostToolUse deny | 0 | {"hookSpecificOutput":{"additionalContext":"Blocked ... because: ..."}} |
| Instruct (não-Stop) | 0 | {"hookSpecificOutput":{"additionalContext":"Instruction from failproofai: ..."}} |
| Stop instruct | 2 | stdout vazio; motivo no stderr |
| Allow | 0 | string vazia |
Configuração do Vitest
Os testes E2E utilizamvitest.config.e2e.mts com:
environment: "node"- sem necessidade de globals do navegadorpool: "forks"- isolamento real de processos (os testes iniciam subprocessos)testTimeout: 20_000- 20s por teste (inicialização do binário + avaliação do hook)
forks é importante: workers baseados em threads compartilham globalThis, o que pode interferir com testes que iniciam subprocessos. Forks baseados em processos evitam esse problema.
CI
A execução completa de CI (bun run lint && bunx tsc --noEmit && bun run test:run && bun run build) deve passar antes do merge. A suíte E2E é executada como um job de CI separado, em paralelo.
Consulte Contributing para o checklist completo de pré-merge.
