Voltar para a documentação
Guia 11

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).

3 min de leitura

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ívelRunnerDBScope
UnitJest 30 + @swc/jestmock Prisma (sem DB)serviços, utilities, validação
IntegrationJest 30 + supertest 7PostgreSQL worker realroutes, middleware, fluxos DB
E2EPlaywrightapp completaUI 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).

bash
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 test

Convençõ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_SECRET test, secrets partilhados - traçados em packages/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_URL cacheado - dívida conhecida).
bash
pnpm --filter server test:integration          # --forceExit incluído
pnpm --filter collector test:integration

E2E (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.

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

Pré-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:

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

Foco 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

bash
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 -- --headed

CI

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).