Testing
Simmetric Chat usa Jest 30 com transformação @swc/jest (unit + integration) e Playwright (E2E), orquestrados pelo Turborepo. O jest.config.cjs raiz agrega os 5 projetos (shared, server, frontend, collector, widget).
Simmetric Chat usa Jest 30 com transformação @swc/jest (unit + integration) e Playwright (E2E), orquestrados pelo Turborepo. O jest.config.cjs raiz agrega os 5 projetos (shared, server, frontend, collector, widget).
Níveis
| Nível | Runner | DB | Scope |
|---|---|---|---|
| Unit | Jest 30 + @swc/jest | mock Prisma (sem DB) | serviços, utilities, validação |
| Integration | Jest 30 + supertest 7 | PostgreSQL worker real | routes, middleware, fluxos DB |
| E2E | Playwright | app completa | UI user-facing (13 spec) |
Unit test
Mock de Prisma via jest.mock (sem DB real). Testes de: serviços (RAG, backup, encryption, DLP, agent budget), utilities (RBAC, license, chunker), schema Zod, webhook dispatch. Server unit: mock moduleNameMapper para as dependências pesadas (uuid, jsdom, pdfjs-dist, pg-boss...) e mapping @simmetric-chat/shared → shared/dist (rebuild shared após editar - gotcha turbo ^build; frontend/widget mapeiam a source).
pnpm test # os 5 package via turbo (Postgres-free)
pnpm test:all # mesmas suites via jest.config.cjs (Jest puro)
pnpm --filter server test
pnpm --filter shared testConvenções: ficheiros *.test.ts em __tests__/ junto ao source (frontend *.test.tsx em ambiente jsdom). Snapshot apenas para outputs determinísticos (não para LLM). Usa jest.mock('../prisma') para isolar a DB; um ficheiro server unit começa com import "./helpers/setupEnv".
Integration test
Worker DB PostgreSQL real em localhost:5434 (para .env.test). Template simmetricchat_test_template clonado por-test-file (SHA-256 do path) para isolamento. Testes de routes Express (supertest 7), middleware (auth, RBAC, license, rate limit), fluxos DB completos (workspace, chat, documentos, backup restore). O collector tem uma suite integration dedicada em pgvector_test porta 5433 (jest.config.integration.cjs).
Setup:
- Variáveis env de teste (DB test,
JWT_SECRETtest, secrets partilhados - traçados empackages/server/.env.test). - Migrações aplicadas ao template (
jest.globalSetup.js: migrate deploy + seed); cada ficheiro de teste clona uma DB fresh; o teardown droppa o template. - Runs sequenciais (as suites podem ler o
DATABASE_URLcacheado - dívida conhecida).
pnpm --filter server test:integration # --forceExit incluído
pnpm --filter collector test:integrationE2E (Playwright)
13 spec em e2e/. Cobrem fluxos 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
# com UI: pnpm exec playwright test --uiPré-requisitos: app up (pnpm dev ou compose), DB migrated, @simmetric-chat/shared + frontend build, browsers instalados (pnpm exec playwright install). O Playwright arranca por si os 3 web server (backend tsx, frontend vite preview, widget - todos reuseExistingServer); o globalSetup é idempotente (setup wizard → admin/admin123, widget E2E + E2E_WIDGET_ID, reset mustChangePassword). Config em playwright.config.ts (30s timeout, retries 2). As spec enterprise-gated self-skippeiam sem LICENSE_KEY.
Coverage
Nenhum limiar de coverage configurado nos config Jest e a coverage não é um gate CI; o gate de qualidade mais próximo é o test-count guard (cap 3900 declarações para a suite community). Reports locais:
pnpm test:all -- --coverage
pnpm --filter server test -- --coverageFoco de escrita nos serviços críticos: agent orchestrator, hybridSearch, backup, encryption, license, RBAC.
Teste de fluxos críticos (checklist)
- RAG híbrido: vector + FTS + RRF fusion + fallback archive (D-07) + guard embedding mismatch (D-01) + metadata filtering (pre-filter + SQL predicate + backstop server-side).
- Agent ReAct: loop detection, circuit breaker unknown-tool (BOT-03), budget wallclock/token/context, per-user concurrency, fallback provider.
- Widget: sessão anónima + expiração, rate limit layer duplo (burst per-widget + daily per-widget+IP), lead capture, IDOR prevention (whitelist
WidgetWorkspace), proxy SSE transparente. - 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 a 3 níveis).
- License: graceful degradation Enterprise→Community, gating 402, limites numéricos.
Debug test
pnpm --filter server test -- src/__tests__/auth.test.ts # por ficheiro (posicional)
pnpm --filter server test -- -t "nome do teste" # por nome
pnpm --filter server test:integration -- --runInBand # serial para DB
DEBUG=1 pnpm test:e2e -- --headedCI
Turborepo cacheia test; pipeline típica: lint → typecheck → test → test:integration → build → test:e2e. O worker DB para integration requer um service PostgreSQL em CI (pgvector/pgvector:pg16). Jobs test-relevant: 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
- Convenções: 10 - Development
- Internals testados: 05 - Feature Guide