title: Тестирование description: “Модульные тесты, сквозные тесты и вспомогательные инструменты тестирования” icon: flask-vial
failproofai содержит два набора тестов: модульные тесты (быстрые, с мокированием) и сквозные тесты (реальные вызовы подпроцесса).Запуск тестов
Модульные тесты
Модульные тесты находятся в__tests__/ и используют Vitest с jsdom.
Написание модульного теста политики
Сквозные тесты
Сквозные тесты вызывают реальный бинарный файлfailproofai как подпроцесс, передают JSON-полезную нагрузку в stdin и проверяют выходные данные stdout и код выхода. Это тестирует полный путь интеграции, который использует Claude Code.
Настройка
Сквозные тесты запускают бинарный файл прямо из исходного кода репозитория. Перед первым запуском соберите CJS-пакет, который файлы пользовательских хуков используют при импорте из'failproofai':
dist/ всякий раз, когда вы изменяете публичный API хука (src/hooks/custom-hooks-registry.ts, src/hooks/policy-helpers.ts или src/hooks/policy-types.ts).
Структура сквозного теста
Использование вспомогательных инструментов E2E
FixtureEnv - изолированная среда для каждого теста:
createFixtureEnv() автоматически регистрирует очистку afterEach.
runHook - вызвать бинарный файл:
Payloads - готовые заводы полезных нагрузок:
Написание сквозного теста
Форматы ответов E2E
| Решение | Код выхода | stdout |
|---|---|---|
PreToolUse deny | 0 | {"hookSpecificOutput":{"permissionDecision":"deny","permissionDecisionReason":"..."}} |
PostToolUse deny | 0 | {"hookSpecificOutput":{"additionalContext":"Blocked ... because: ..."}} |
| Instruct (не-Stop) | 0 | {"hookSpecificOutput":{"additionalContext":"Instruction from failproofai: ..."}} |
| Stop instruct | 2 | пусто stdout; причина в stderr |
| Allow | 0 | пустая строка |
Конфигурация Vitest
Сквозные тесты используютvitest.config.e2e.mts с:
environment: "node"- браузерные глобальные переменные не требуютсяpool: "forks"- истинная изоляция процессов (тесты запускают подпроцессы)testTimeout: 20_000- 20s на тест (запуск бинарного файла + оценка хука)
forks важен: рабочие процессы на основе потоков делят globalThis, что может мешать тестам, запускающим подпроцессы. Форки на основе процессов избегают этого.
CI
Полный запуск CI (bun run lint && bunx tsc --noEmit && bun run test:run && bun run build) должен пройти успешно перед объединением. Набор E2E тестов работает как отдельная задача CI параллельно.
См. Contributing для полного списка проверок перед объединением.
