Retour à la documentation
Guide 11

Testing

Simmetric Chat utilise Jest 30 avec la transformation @swc/jest (unit + integration) et Playwright (E2E), orchestrés par Turborepo. Le jest.config.cjs racine agrège les 5 projets (shared, server, frontend, collector, widget).

4 min de lecture

Simmetric Chat utilise Jest 30 avec la transformation @swc/jest (unit + integration) et Playwright (E2E), orchestrés par Turborepo. Le jest.config.cjs racine agrège les 5 projets (shared, server, frontend, collector, widget).

Niveaux

NiveauRunnerDBScope
UnitJest 30 + @swc/jestmock Prisma (pas de DB)services, utilities, validation
IntegrationJest 30 + supertest 7PostgreSQL worker réelroutes, middleware, flux DB
E2EPlaywrightapp complèteUI user-facing (13 spec)

Unit test

Mock de Prisma via jest.mock (pas de DB réelle). Tests de : services (RAG, backup, encryption, DLP, agent budget), utilities (RBAC, license, chunker), schema Zod, webhook dispatch. Server unit : mock moduleNameMapper pour les dépendances lourdes (uuid, jsdom, pdfjs-dist, pg-boss...) et mapping @simmetric-chat/shared → shared/dist (rebuild shared après édition - gotcha turbo ^build ; frontend/widget mappent la source).

bash
pnpm test               # tous les 5 package via turbo (Postgres-free)
pnpm test:all           # mêmes suites via jest.config.cjs (Jest pur)
pnpm --filter server test
pnpm --filter shared test

Conventions : fichiers *.test.ts dans __tests__/ à côté du source (frontend *.test.tsx en environnement jsdom). Snapshot uniquement pour des outputs déterministes (pas pour LLM). Utilise jest.mock('../prisma') pour isoler la DB ; un fichier server unit commence par import "./helpers/setupEnv".

Integration test

Worker DB PostgreSQL réel sur localhost:5434 (pour .env.test). Template simmetricchat_test_template cloné par-test-file (SHA-256 du path) pour l'isolation. Tests de routes Express (supertest 7), middleware (auth, RBAC, license, rate limit), flux DB complets (workspace, chat, documents, backup restore). Le collector a une suite integration dédiée sur pgvector_test port 5433 (jest.config.integration.cjs).

Setup :

  • Variables env de test (DB test, JWT_SECRET test, secrets partagés - tracées dans packages/server/.env.test).
  • Migrations appliquées au template (jest.globalSetup.js : migrate deploy + seed) ; chaque fichier de test clone une DB fresh ; le teardown droppe le template.
  • Run séquentiels (les suites peuvent lire le DATABASE_URL caché - dette connue).
bash
pnpm --filter server test:integration          # --forceExit inclus
pnpm --filter collector test:integration

E2E (Playwright)

13 spec dans e2e/. Elles couvrent les flux 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
# avec UI : pnpm exec playwright test --ui

Prérequis : app up (pnpm dev ou compose), DB migrated, @simmetric-chat/shared + frontend build, browsers installés (pnpm exec playwright install). Playwright démarre tout seul les 3 web server (backend tsx, frontend vite preview, widget - tous reuseExistingServer) ; le globalSetup est idempotent (setup wizard → admin/admin123, widget E2E + E2E_WIDGET_ID, reset mustChangePassword). Config dans playwright.config.ts (timeout 30s, retries 2). Les spec enterprise-gated s'auto-skippent sans LICENSE_KEY.

Coverage

Aucun seuil de coverage configuré dans les config Jest et la coverage n'est pas un gate CI ; le gate de qualité le plus proche est le test-count guard (plafond 3900 déclarations pour la suite community). Rapports locaux :

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

Focus d'écriture sur les services critiques : agent orchestrator, hybridSearch, backup, encryption, license, RBAC.

Test des flux critiques (checklist)

  • RAG hybride : 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 : session anonyme + expiration, rate limit double layer (burst per-widget + daily per-widget+IP), lead capture, IDOR prevention (whitelist WidgetWorkspace), proxy SSE transparent.
  • 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 niveaux).
  • License : graceful degradation Enterprise→Community, gating 402, limites numériques.

Debug test

bash
pnpm --filter server test -- src/__tests__/auth.test.ts      # par fichier (positionnel)
pnpm --filter server test -- -t "nom du test"                # par nom
pnpm --filter server test:integration -- --runInBand         # série pour DB
DEBUG=1 pnpm test:e2e -- --headed

CI

Turborepo cache les test ; pipeline typique : lint → typecheck → test → test:integration → build → test:e2e. Le worker DB pour l'integration exige un service PostgreSQL en 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).