Zurück zur Dokumentation
Guide 11

Testing

Simmetric Chat nutzt Jest 30 mit @swc/jest-Transformation (Unit + Integration) und Playwright (E2E), orchestriert von Turborepo. Die Root-Konfiguration jest.config.cjs aggregiert die 5 Projekte (shared, server, frontend, collector, widget).

3 Min. Lesezeit

Simmetric Chat nutzt Jest 30 mit @swc/jest-Transformation (Unit + Integration) und Playwright (E2E), orchestriert von Turborepo. Die Root-Konfiguration jest.config.cjs aggregiert die 5 Projekte (shared, server, frontend, collector, widget).

Ebenen

EbeneRunnerDBScope
UnitJest 30 + @swc/jestPrisma Mock (keine DB)Services, Utilities, Validierung
IntegrationJest 30 + supertest 7echte PostgreSQL-Worker-DBRoutes, Middleware, DB-Flows
E2EPlaywrightkomplette AppUI user-facing (13 Specs)

Unit Tests

Prisma-Mock via jest.mock (keine echte DB). Tests von: Services (RAG, Backup, Encryption, DLP, Agent Budget), Utilities (RBAC, License, Chunker), Zod-Schema, Webhook Dispatch. Server Unit: moduleNameMapper-Mock für die schweren Abhängigkeiten (uuid, jsdom, pdfjs-dist, pg-boss...) und Mapping @simmetric-chat/shared → shared/dist (rebuild shared nach Edits - Turbo-Gotcha ^build; frontend/widget mappen die Source).

bash
pnpm test               # alle 5 Packages via turbo (Postgres-free)
pnpm test:all           # dieselben Suiten via jest.config.cjs (reines Jest)
pnpm --filter server test
pnpm --filter shared test

Konventionen: Dateien *.test.ts in __tests__/ neben dem Source (frontend *.test.tsx in jsdom-Umgebung). Snapshots nur für deterministische Outputs (nicht für LLM). Nutze jest.mock('../prisma') zur DB-Isolation; eine Server-Unit-Datei beginnt mit import "./helpers/setupEnv".

Integration Tests

Echte PostgreSQL-Worker-DB auf localhost:5434 (für .env.test). Template simmetricchat_test_template pro Test-Datei geklont (SHA-256 des Paths) zur Isolation. Tests von Express-Routes (supertest 7), Middleware (auth, RBAC, License, Rate Limit), kompletten DB-Flows (Workspace, Chat, Dokumente, Backup Restore). Der Collector hat eine dedizierte Integration-Suite auf pgvector_test Port 5433 (jest.config.integration.cjs).

Setup:

  • Test-Env-Variablen (Test-DB, JWT_SECRET Test, Shared Secrets - getrackt in packages/server/.env.test).
  • Migrationen auf das Template angewendet (jest.globalSetup.js: migrate deploy + seed); jede Test-Datei klont eine frische DB; das Teardown droppt das Template.
  • Sequentielle Runs (die Suiten können die gecachte DATABASE_URL lesen - bekannte Schuld).
bash
pnpm --filter server test:integration          # --forceExit inklusive
pnpm --filter collector test:integration

E2E (Playwright)

13 Specs in e2e/. Sie decken user-facing Flows ab: 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
# mit UI: pnpm exec playwright test --ui

Voraussetzungen: App up (pnpm dev oder Compose), DB migrated, @simmetric-chat/shared + Frontend-Build, Browser installiert (pnpm exec playwright install). Playwright startet selbst die 3 Web Server (Backend tsx, Frontend vite preview, Widget - alle reuseExistingServer); das globalSetup ist idempotent (Setup Wizard → admin/admin123, Widget E2E + E2E_WIDGET_ID, Reset mustChangePassword). Config in playwright.config.ts (30s Timeout, Retries 2). Enterprise-gated Specs skippen sich selbst ohne LICENSE_KEY.

Coverage

Kein Coverage-Schwellwert in den Jest-Configs konfiguriert und Coverage ist kein CI-Gate; das nächste Qualitätsgate ist der Test-Count Guard (Cap 3900 Deklarationen für die Community-Suite). Lokale Reports:

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

Schreibfokus auf die kritischen Services: Agent Orchestrator, HybridSearch, Backup, Encryption, License, RBAC.

Tests kritischer Flows (Checkliste)

  • Hybrides RAG: Vector + FTS + RRF Fusion + Archive-Fallback (D-07) + Embedding-Mismatch-Guard (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, Provider-Fallback.
  • Widget: anonyme Session + Ablauf, Rate Limit Doppel-Layer (Burst per Widget + Daily per Widget+IP), Lead Capture, IDOR Prevention (Whitelist WidgetWorkspace), transparenter 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 auf 3 Ebenen).
  • License: Graceful Degradation Enterprise→Community, Gating 402, numerische Limits.

Test Debug

bash
pnpm --filter server test -- src/__tests__/auth.test.ts      # pro Datei (positional)
pnpm --filter server test -- -t "Testname"                   # per Name
pnpm --filter server test:integration -- --runInBand         # seriell für DB
DEBUG=1 pnpm test:e2e -- --headed

CI

Turborepo cached die Tests; typische Pipeline: lint → typecheck → test → test:integration → build → test:e2e. Die Worker-DB für Integration erfordert einen PostgreSQL-Service in CI (pgvector/pgvector:pg16). Test-relevante Jobs: test-unit (+ air-gap grep gate + FTS locale gate + test-count guard), test-airgap (NETWORK_EGRESS_BLOCKED=1), test-e2e, build (+ freshness check).