Тестирование
Simmetric Chat использует Jest 30 с трансформацией @swc/jest (unit + integration) и Playwright (E2E), оркестрируемые Turborepo. Корневой jest.config.cjs агрегирует 5 проектов (shared, server, frontend, collector, widget).
Simmetric Chat использует Jest 30 с трансформацией @swc/jest (unit + integration) и Playwright (E2E), оркестрируемые Turborepo. Корневой jest.config.cjs агрегирует 5 проектов (shared, server, frontend, collector, widget).
Уровни
| Уровень | Runner | DB | Scope |
|---|---|---|---|
| Unit | Jest 30 + @swc/jest | mock Prisma (без DB) | сервисы, утилиты, валидация |
| Integration | Jest 30 + supertest 7 | реальный PostgreSQL worker | route, middleware, DB-потоки |
| E2E | Playwright | полное приложение | 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).
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- известный долг).
pnpm --filter server test:integration # --forceExit включён
pnpm --filter collector test:integrationE2E (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.
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). Локальные отчёты:
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 тестов
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 -- --headedCI
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).
Cross-link
- Конвенции: 10 - Development
- Тестируемые внутренности: 05 - Feature Guide