Тестирование

Что и чем покрываем тестами, что сознательно не покрываем и почему «зелёный build = type-check». Технические детали отдельных фич — в их technical.md.

Стратегия простая: тестируем чистые функции, не тестируем стекло и сервер. Никаких mock'ов Supabase, никаких рендеров компонентов — только input → output на pure helpers из lib/.


Что покрываем

lib/__tests__/ содержит 23 тест-файла (~410 тестов vitest):

КатегорияФайлы
Транзакцииtransaction-dedup, transaction-format, transaction-resolver, transaction-validation
Старт петлиstarter-setup-resolver, starter-setup-diff, starter-setup-affected, starter-setup-validation
Encounter lootencounter-loot-resolver, encounter-loot-validation
Approvalapproval, approval-policy
Деньгиcoin-split, contribution-split
Инвентарьinventory-aggregation, inventory-slice, stash-aggregation, items-filters, items-grouping, items-validation
Ценыapply-default-prices
Другоеshortfall-resolver, telegram-init-data

Что не тестируем сознательно:

  • UI-компоненты (React) — нет JSDOM, нет react-testing-library
  • Server actions — зависят от Supabase-клиента и auth-контекста
  • Route handlers — интеграционный уровень, не unit

Если хелпер требует Supabase, он не должен быть в lib/ — нужен либо lib/queries/, либо server action.


Локальный запуск

npm run test          # vitest run (однократно)
npm run typecheck     # tsc --noEmit (без сборки)
npm run build         # полный build = авторитетный type-check

Vitest-конфиг (vitest.config.ts): environment: 'node', include: ['lib/**/*.test.ts', 'lib/**/__tests__/**/*.test.ts'], passWithNoTests: true. Алиасы @/… резолвятся через tsconfigPaths: true (Vite 6+ native, без плагина).


SQL-smoke (RLS, триггеры, CHECK)

После применения миграции ручная проверка через Supabase Dashboard SQL Editor. Скрипты в scripts/:

ФайлЧто проверяет
check-rls-013.sqlRLS на encounter_loot_drafts (spec-013)
check-rls-014.sqlRLS на approval-таблицы (spec-014)
check-rls-015.sqlRLS на item/inventory таблицы (spec-015)
check-rls-018.sqlRLS на dnd.su предметы (spec-018)
check-approval-constraints-014.sqlCHECK-ограничения approval flow
check-encounter-mirror-triggers.sqlТриггер автосоздания mirror-ноды энкаунтера

Все скрипты обёрнуты в BEGIN … ROLLBACK — тестовые данные живут только во время выполнения и на прод не оседают. Ожидаемый вывод: строки PASS … и итоговый ✓ All PASS (N tests). Хоть один FAIL — разбираться сразу.


Build как type-check

npm run build — авторитетный type-check. Когда npm install ломается локально (конфликты нативных зависимостей, Node-версия), CI в Dokploy всё равно прогоняет build внутри Docker-образа. Если build зелёный — типы чистые.

npm run typecheck (tsc --noEmit) быстрее, но не ловит некоторые Next.js-специфичные ошибки типов (например, в server actions и layout-пропах), которые вылазят только при полном build.

См. также: stack.md, process/spec-kit.md.