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).
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
| Ebene | Runner | DB | Scope |
|---|---|---|---|
| Unit | Jest 30 + @swc/jest | Prisma Mock (keine DB) | Services, Utilities, Validierung |
| Integration | Jest 30 + supertest 7 | echte PostgreSQL-Worker-DB | Routes, Middleware, DB-Flows |
| E2E | Playwright | komplette App | UI 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).
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 testKonventionen: 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_SECRETTest, Shared Secrets - getrackt inpackages/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_URLlesen - bekannte Schuld).
pnpm --filter server test:integration # --forceExit inklusive
pnpm --filter collector test:integrationE2E (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.
pnpm test:e2e
# mit UI: pnpm exec playwright test --uiVoraussetzungen: 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:
pnpm test:all -- --coverage
pnpm --filter server test -- --coverageSchreibfokus 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
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 -- --headedCI
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).
Cross-Link
- Konventionen: 10 - Development
- Getestete Internals: 05 - Feature Guide