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).
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
| Niveau | Runner | DB | Scope |
|---|---|---|---|
| Unit | Jest 30 + @swc/jest | mock Prisma (pas de DB) | services, utilities, validation |
| Integration | Jest 30 + supertest 7 | PostgreSQL worker réel | routes, middleware, flux DB |
| E2E | Playwright | app complète | UI 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).
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 testConventions : 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_SECRETtest, secrets partagés - tracées danspackages/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_URLcaché - dette connue).
pnpm --filter server test:integration # --forceExit inclus
pnpm --filter collector test:integrationE2E (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.
pnpm test:e2e
# avec UI : pnpm exec playwright test --uiPré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 :
pnpm test:all -- --coverage
pnpm --filter server test -- --coverageFocus 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
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 -- --headedCI
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).
Cross-link
- Conventions : 10 - Development
- Internals testés : 05 - Feature Guide