Spaces:
Runtime error
Runtime error
| /** | |
| * TDD: setEngineInDefaultCombo + normalizePipeline (new engines). | |
| * | |
| * DB isolation pattern mirrors tests/unit/db/per-engine-analytics.test.ts: | |
| * - Temp DATA_DIR, resetDbInstance() before each test, cleanup in test.after(). | |
| */ | |
| import test from "node:test"; | |
| import assert from "node:assert/strict"; | |
| import fs from "node:fs"; | |
| import os from "node:os"; | |
| import path from "node:path"; | |
| // ─── isolated temp DB ───────────────────────────────────────────────────────── | |
| const TEST_DATA_DIR = fs.mkdtempSync(path.join(os.tmpdir(), "omniroute-default-combo-toggle-")); | |
| const originalDataDir = process.env.DATA_DIR; | |
| process.env.DATA_DIR = TEST_DATA_DIR; | |
| const core = await import("../../../src/lib/db/core.ts"); | |
| core.resetDbInstance(); | |
| const { getDefaultCompressionCombo, setEngineInDefaultCombo, getCompressionCombo } = | |
| await import("../../../src/lib/db/compressionCombos.ts"); | |
| // ─── helpers ────────────────────────────────────────────────────────────────── | |
| function resetDb(): void { | |
| core.resetDbInstance(); | |
| fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); | |
| fs.mkdirSync(TEST_DATA_DIR, { recursive: true }); | |
| } | |
| // ─── lifecycle ──────────────────────────────────────────────────────────────── | |
| test.beforeEach(() => { | |
| resetDb(); | |
| }); | |
| test.after(() => { | |
| core.resetDbInstance(); | |
| fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true }); | |
| if (originalDataDir === undefined) delete process.env.DATA_DIR; | |
| else process.env.DATA_DIR = originalDataDir; | |
| }); | |
| // ─── tests ──────────────────────────────────────────────────────────────────── | |
| test("Fix #1: normalizePipeline passes through new engine IDs (headroom, session-dedup, ccr, llmlingua)", () => { | |
| // The default combo is seeded with [rtk, caveman]. Directly update the DB | |
| // to include new engine IDs, then read back via getDefaultCompressionCombo | |
| // to verify normalizePipeline no longer strips them. | |
| const db = core.getDbInstance(); | |
| // Ensure the table is created by triggering a read first. | |
| const combo = getDefaultCompressionCombo(); | |
| assert.ok(combo, "default combo should exist after table init"); | |
| const newPipeline = JSON.stringify([ | |
| { engine: "session-dedup" }, | |
| { engine: "ccr" }, | |
| { engine: "headroom" }, | |
| { engine: "caveman", intensity: "full" }, | |
| { engine: "llmlingua" }, | |
| ]); | |
| db.prepare("UPDATE compression_combos SET pipeline = ? WHERE id = ?").run(newPipeline, combo.id); | |
| const reloaded = getCompressionCombo(combo.id); | |
| assert.ok(reloaded, "should reload the combo"); | |
| const engineIds = reloaded.pipeline.map((s) => s.engine); | |
| assert.ok(engineIds.includes("headroom"), `expected headroom in pipeline, got: ${engineIds}`); | |
| assert.ok( | |
| engineIds.includes("session-dedup"), | |
| `expected session-dedup in pipeline, got: ${engineIds}` | |
| ); | |
| assert.ok(engineIds.includes("ccr"), `expected ccr in pipeline, got: ${engineIds}`); | |
| assert.ok(engineIds.includes("llmlingua"), `expected llmlingua in pipeline, got: ${engineIds}`); | |
| assert.equal( | |
| reloaded.pipeline.length, | |
| 5, | |
| `expected 5 steps, got ${reloaded.pipeline.length}: ${engineIds}` | |
| ); | |
| }); | |
| test("enabling headroom adds it to the pipeline sorted by stackPriority", () => { | |
| // Default pipeline is [rtk(10), caveman(20)]. | |
| // headroom has stackPriority=15 so it should be inserted between rtk and caveman. | |
| const result = setEngineInDefaultCombo("headroom", true); | |
| assert.ok(result, "should return the updated combo"); | |
| const engineIds = result.pipeline.map((s) => s.engine); | |
| assert.ok(engineIds.includes("headroom"), "headroom should be in the pipeline"); | |
| const rtkIdx = engineIds.indexOf("rtk"); | |
| const headroomIdx = engineIds.indexOf("headroom"); | |
| const cavemanIdx = engineIds.indexOf("caveman"); | |
| assert.ok(rtkIdx >= 0, "rtk should be in the pipeline"); | |
| assert.ok(headroomIdx >= 0, "headroom should be in the pipeline"); | |
| assert.ok(cavemanIdx >= 0, "caveman should be in the pipeline"); | |
| assert.ok( | |
| rtkIdx < headroomIdx, | |
| `rtk(10) should come before headroom(15), got order: ${engineIds}` | |
| ); | |
| assert.ok( | |
| headroomIdx < cavemanIdx, | |
| `headroom(15) should come before caveman(20), got order: ${engineIds}` | |
| ); | |
| }); | |
| test("enabling an engine with config persists the config", () => { | |
| const customConfig = { minRows: 5 }; | |
| const result = setEngineInDefaultCombo("headroom", true, customConfig); | |
| assert.ok(result, "should return the updated combo"); | |
| const headroomStep = result.pipeline.find((s) => s.engine === "headroom"); | |
| assert.ok(headroomStep, "headroom step should be present"); | |
| assert.deepEqual( | |
| headroomStep.config, | |
| customConfig, | |
| "config should be persisted on the pipeline step" | |
| ); | |
| }); | |
| test("updating config on an already-present engine merges correctly", () => { | |
| // First enable headroom | |
| setEngineInDefaultCombo("headroom", true); | |
| // Then re-enable with a config — should update the existing step, not add a duplicate | |
| const result = setEngineInDefaultCombo("headroom", true, { minRows: 8 }); | |
| assert.ok(result, "should return the updated combo"); | |
| const headroomSteps = result.pipeline.filter((s) => s.engine === "headroom"); | |
| assert.equal(headroomSteps.length, 1, "should not duplicate the headroom step"); | |
| assert.deepEqual(headroomSteps[0].config, { minRows: 8 }); | |
| }); | |
| test("disabling an engine removes it from the pipeline", () => { | |
| setEngineInDefaultCombo("headroom", true); | |
| const before = getDefaultCompressionCombo(); | |
| assert.ok( | |
| before?.pipeline.some((s) => s.engine === "headroom"), | |
| "headroom should be in pipeline before disabling" | |
| ); | |
| const result = setEngineInDefaultCombo("headroom", false); | |
| assert.ok(result, "should return the updated combo"); | |
| assert.ok( | |
| !result.pipeline.some((s) => s.engine === "headroom"), | |
| "headroom should be removed from pipeline" | |
| ); | |
| }); | |
| test("Fix #8: setEngineInDefaultCombo with unknown engineId returns null and does not modify the pipeline", () => { | |
| const before = getDefaultCompressionCombo(); | |
| assert.ok(before, "default combo must exist"); | |
| const originalPipeline = JSON.stringify(before.pipeline); | |
| const result = setEngineInDefaultCombo("not-a-real-engine", true); | |
| assert.equal(result, null, "should return null for unknown engine id"); | |
| // The combo must be unchanged | |
| const after = getDefaultCompressionCombo(); | |
| assert.ok(after, "default combo should still exist"); | |
| assert.equal( | |
| JSON.stringify(after.pipeline), | |
| originalPipeline, | |
| "pipeline should be unmodified when unknown engineId is rejected" | |
| ); | |
| }); | |
| test("Fix #2: disabling last engine produces an empty pipeline (not silently reverted to default)", () => { | |
| // Start with a pipeline that only has one engine by disabling everything except headroom. | |
| // First set a pipeline with only one known engine via a raw DB update. | |
| const db = core.getDbInstance(); | |
| const combo = getDefaultCompressionCombo(); | |
| assert.ok(combo, "default combo must exist"); | |
| db.prepare("UPDATE compression_combos SET pipeline = ? WHERE id = ?").run( | |
| JSON.stringify([{ engine: "headroom" }]), | |
| combo.id | |
| ); | |
| // Now disable headroom — result should be empty pipeline, not a fallback. | |
| const result = setEngineInDefaultCombo("headroom", false); | |
| assert.ok(result, "should return the updated combo"); | |
| assert.equal( | |
| result.pipeline.length, | |
| 0, | |
| `expected empty pipeline after disabling last engine, got: ${JSON.stringify(result.pipeline)}` | |
| ); | |
| }); | |