File size: 7,951 Bytes
cd8bd0a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
/**
 * 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)}`
  );
});