Files
waggle-os/vitest.setup.ts
Oleg Maslov 0c3e2ead3b
Some checks failed
Installer Smoke / installer-smoke (push) Has been cancelled
moving
2026-09-02 10:10:29 +02:00

86 lines
3.8 KiB
TypeScript

/**
* Vitest global setup — loads .env file into process.env for server tests
* that need DATABASE_URL, REDIS_URL, CLERK_SECRET_KEY, etc.
* No external dependencies (no dotenv required).
*/
import { readFileSync } from 'node:fs';
import { resolve } from 'node:path';
// Phase 5 canary — pin to 0 (canary OFF) for tests. Production code-default
// post-kick-off (2026-04-30) is 10; tests need explicit OFF so shape-selection
// assertions stay deterministic across runs. CI / dev env can still override.
// Audit: gepa-phase-5/manifest.yaml § canary_toggle.
if (!process.env.WAGGLE_PHASE5_CANARY_PCT) {
process.env.WAGGLE_PHASE5_CANARY_PCT = '0';
}
// W4.5: the cross-encoder reranker is default-ON in production (kill switch
// WAGGLE_RERANKER=0). Tests pin it OFF — the real ONNX model is a ~22MB
// download + per-call CPU inference, both unwanted in unit suites. Tests
// that exercise reranking inject a mock Reranker via OrchestratorConfig.
if (!process.env.WAGGLE_RERANKER) {
process.env.WAGGLE_RERANKER = '0';
}
// W4 (2026-06-11): the PromptAssembler is default-ON in production (kill
// switch WAGGLE_PROMPT_ASSEMBLER=0) after the live chat smoke. Tests pin it
// OFF so the broad chat-route suite keeps exercising the stable legacy
// buildSystemPrompt path (prompt-cache assertions, deterministic shapes);
// assembler behavior has its own dedicated suites that opt in explicitly.
if (!process.env.WAGGLE_PROMPT_ASSEMBLER) {
process.env.WAGGLE_PROMPT_ASSEMBLER = '0';
}
// D1 (2026-06-12): chunk-level retrieval is default-ON in production (kill
// switch WAGGLE_CHUNK_RETRIEVAL=0) after the long-frame needle probe. Tests
// pin it OFF — the broad suites' retrieval assertions predate the chunk lane;
// chunk behavior has its own suite (search-chunks.test.ts) that opts in.
if (!process.env.WAGGLE_CHUNK_RETRIEVAL) {
process.env.WAGGLE_CHUNK_RETRIEVAL = '0';
}
// D1: the local sidecar now requires a bearer token even on loopback in production
// (no localhost-trust). The broad server suite predates this and uses raw inject()
// without tokens, so default tests to localhost-trust mode. Production keeps the
// SECURE default (no env). The dedicated D1 auth tests set WAGGLE_TRUST_LOCALHOST='0'
// to exercise the real secure path. CI/dev can override.
if (!process.env.WAGGLE_TRUST_LOCALHOST) {
process.env.WAGGLE_TRUST_LOCALHOST = '1';
}
// Pin the embedding provider to 'mock' for tests. The auto-fallback chain
// (embedding-provider.ts) probes the in-process @xenova/transformers model
// FIRST — it fails to init on some dev machines (-> mock) but succeeds on CI
// Linux (-> 'inprocess'), making getActiveProvider() platform-dependent and
// breaking mock-embedder-guard assertions (plus downloading ~87MB of model
// weights into the test data dir). 'mock' short-circuits the chain
// deterministically: no network, no native model load. Read by
// WaggleConfig.getEmbeddingConfig(); CI/dev can still override.
if (!process.env.EMBEDDING_PROVIDER) {
process.env.EMBEDDING_PROVIDER = 'mock';
}
// Mock embeddings are intentional in deterministic tests; the production
// warning remains enabled unless a caller explicitly opts into this test flag.
if (!process.env.WAGGLE_SUPPRESS_EMBEDDING_WARNING) {
process.env.WAGGLE_SUPPRESS_EMBEDDING_WARNING = '1';
}
try {
const content = readFileSync(resolve(process.cwd(), '.env'), 'utf-8');
for (const line of content.split('\n')) {
const trimmed = line.trim();
if (!trimmed || trimmed.startsWith('#')) continue;
const eq = trimmed.indexOf('=');
if (eq < 0) continue;
const key = trimmed.slice(0, eq).trim();
const val = trimmed.slice(eq + 1).trim();
// Don't override existing env vars (CLI > .env)
if (!process.env[key]) {
process.env[key] = val;
}
}
} catch {
// .env not found — tests will use fallback config values
}