К документации
Руководство 11

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

Simmetric Chat использует Jest 30 с трансформацией @swc/jest (unit + integration) и Playwright (E2E), оркестрируемые Turborepo. Корневой jest.config.cjs агрегирует 5 проектов (shared, server, frontend, collector, widget).

3 мин чтения

Simmetric Chat использует Jest 30 с трансформацией @swc/jest (unit + integration) и Playwright (E2E), оркестрируемые Turborepo. Корневой jest.config.cjs агрегирует 5 проектов (shared, server, frontend, collector, widget).

Уровни

УровеньRunnerDBScope
UnitJest 30 + @swc/jestmock Prisma (без DB)сервисы, утилиты, валидация
IntegrationJest 30 + supertest 7реальный PostgreSQL workerroute, middleware, DB-потоки
E2EPlaywrightполное приложениеUI user-facing (13 spec)

Unit-тесты

Mock Prisma через jest.mock (без реальной DB). Тесты: сервисов (RAG, backup, encryption, DLP, agent budget), утилит (RBAC, license, chunker), Zod-схем, webhook dispatch. Server unit: mock moduleNameMapper для тяжёлых зависимостей (uuid, jsdom, pdfjs-dist, pg-boss...) и маппинг @simmetric-chat/shared → shared/dist (rebuild shared после правок - gotcha turbo ^build; frontend/widget маппят source).

bash
pnpm test               # все 5 package через turbo (Postgres-free)
pnpm test:all           # те же suite через jest.config.cjs (чистый Jest)
pnpm --filter server test
pnpm --filter shared test

Конвенции: файлы *.test.ts в __tests__/ рядом с source (frontend *.test.tsx в jsdom-окружении). Snapshot только для детерминированных output'ов (не для LLM). Используй jest.mock('../prisma') для изоляции DB; server unit файл начинается с import "./helpers/setupEnv".

Integration-тесты

Реальный PostgreSQL worker DB на localhost:5434 (для .env.test). Шаблон simmetricchat_test_template клонируется per-test-file (SHA-256 от path) для изоляции. Тесты Express route (supertest 7), middleware (auth, RBAC, license, rate limit), полных DB-потоков (workspace, chat, документы, backup restore). У collector есть выделенный integration suite на pgvector_test порт 5433 (jest.config.integration.cjs).

Setup:

  • Тестовые env-переменные (тестовая DB, JWT_SECRET теста, shared secrets - отслеживаются в packages/server/.env.test).
  • Миграции применяются к шаблону (jest.globalSetup.js: migrate deploy + seed); каждый test-файл клонирует свежую DB; teardown удаляет шаблон.
  • Последовательные run'ы (suite могут читать кэшированный DATABASE_URL - известный долг).
bash
pnpm --filter server test:integration          # --forceExit включён
pnpm --filter collector test:integration

E2E (Playwright)

13 spec в e2e/. Покрывают user-facing потоки: auth/admin, chat streaming, chat edit/regenerate, document upload → RAG, unified upload destinations, widget embed, MCP install (marketplace lifecycle), MCP pin/use, admin settings nav, synthesis run, RBAC UI (project sidebar), theme switch.

bash
pnpm test:e2e
# с UI: pnpm exec playwright test --ui

Предусловия: app up (pnpm dev или compose), DB migrated, @simmetric-chat/shared + frontend build, браузеры установлены (pnpm exec playwright install). Playwright сам запускает 3 web server (backend tsx, frontend vite preview, widget - все reuseExistingServer); globalSetup идемпотентен (setup wizard → admin/admin123, widget E2E + E2E_WIDGET_ID, reset mustChangePassword). Config в playwright.config.ts (30s timeout, retries 2). Enterprise-gated spec self-skip'аются без LICENSE_KEY.

Coverage

Порог coverage не настроен в Jest-конфигах, и coverage не является CI gate; ближайший quality gate - test-count guard (cap 3900 деклараций для community suite). Локальные отчёты:

bash
pnpm test:all -- --coverage
pnpm --filter server test -- --coverage

Фокус написания на критичных сервисах: agent orchestrator, hybridSearch, backup, encryption, license, RBAC.

Тесты критичных потоков (checklist)

  • Гибридный RAG: vector + FTS + RRF fusion + fallback archive (D-07) + guard embedding mismatch (D-01) + metadata filtering (pre-filter + SQL predicate + server-side backstop).
  • Agent ReAct: loop detection, circuit breaker unknown-tool (BOT-03), budget wallclock/token/context, per-user concurrency, fallback provider.
  • Widget: анонимная сессия + истечение, rate limit двойной слой (burst per-widget + daily per-widget+IP), lead capture, IDOR prevention (whitelist WidgetWorkspace), прозрачный SSE proxy.
  • Backup: dump → archive → checksum → upload retry → restore atomicity (psql single-transaction) + retention.
  • MCP: transport fallback (D-09), install/uninstall, pin resolution (union strict), health check (pg-boss cron, staleness на 3 уровнях).
  • License: graceful degradation Enterprise→Community, gating 402, числовые лимиты.

Debug тестов

bash
pnpm --filter server test -- src/__tests__/auth.test.ts      # по файлу (позиционно)
pnpm --filter server test -- -t "имя теста"                  # по имени
pnpm --filter server test:integration -- --runInBand         # последовательно для DB
DEBUG=1 pnpm test:e2e -- --headed

CI

Turborepo кэширует тесты; типичный pipeline: lint → typecheck → test → test:integration → build → test:e2e. Worker DB для integration требует service PostgreSQL в CI (pgvector/pgvector:pg16). Test-relevant job'ы: test-unit (+ air-gap grep gate + FTS locale gate + test-count guard), test-airgap (NETWORK_EGRESS_BLOCKED=1), test-e2e, build (+ freshness check).