Files
OmniRoute/tests/unit/sseHeartbeat.test.ts
Praveen K Palaniswamy 65e81158ab fix(ollama): route models by advertised capability (#11088)
Landed with the design call resolved per the owner's pick — **option 1**: the synced store is now endpoint-agnostic (persistDiscoveredModels and managedModelImport no longer drop non-chat models at write time), and chat selectability moved to read time (auto-pool expansion in autoStrategy applies filterChatSelectableModels; the models-route projection already had its chatOnly filter). Your discovery test now passes end-to-end (3/3): /api/show capabilities persist per connection and image/embedding requests route through the advertising host.

Reconciliation notes: conflicted areas merged onto the current tip (adobe discovery import, requestedModel preflight signature, resolvedProvider fast-path coexists with the synced-route override — explicit resolution wins); carried base-red drains (#10055 memoization, #11071 test variants) dropped as already-landed; the managed-model-import exclusion test was propagated to the new contract (image/video models persist; the read filter still hides them from chat pickers — pinned by a new assertion). Full battery: 205/206 focused (the one red is a confirmed periodic-timer timing flake on the loaded devbox — 20/20 isolated), autoCombo vitest 30/30, combo suites 46/46, gates + typecheck clean.

Thank you @yourspraveen — the capability probe + routing design was right; it just needed the store contract opened up. Fixes #11087.
2026-08-23 11:45:01 -03:00

97 lines
3.8 KiB
TypeScript

import test from "node:test";
import assert from "node:assert/strict";
import {
sseCommentsEnabled,
shapeForClientFormat,
createSseHeartbeatTransform,
HEARTBEAT_SHAPES,
} from "../../open-sse/utils/sseHeartbeat.ts";
function withEnv(value: string | undefined, fn: () => void) {
const prev = process.env.OMNIROUTE_SSE_COMMENTS;
try {
if (value === undefined) delete process.env.OMNIROUTE_SSE_COMMENTS;
else process.env.OMNIROUTE_SSE_COMMENTS = value;
fn();
} finally {
if (prev === undefined) delete process.env.OMNIROUTE_SSE_COMMENTS;
else process.env.OMNIROUTE_SSE_COMMENTS = prev;
}
}
async function withEnvAsync<T>(value: string | undefined, fn: () => Promise<T>): Promise<T> {
const prev = process.env.OMNIROUTE_SSE_COMMENTS;
try {
if (value === undefined) delete process.env.OMNIROUTE_SSE_COMMENTS;
else process.env.OMNIROUTE_SSE_COMMENTS = value;
return await fn();
} finally {
if (prev === undefined) delete process.env.OMNIROUTE_SSE_COMMENTS;
else process.env.OMNIROUTE_SSE_COMMENTS = prev;
}
}
async function collectHeartbeatOutput(
shape: (typeof HEARTBEAT_SHAPES)[keyof typeof HEARTBEAT_SHAPES]
) {
const enc = new TextEncoder();
let closeTimer: ReturnType<typeof setTimeout> | undefined;
const input = new ReadableStream<Uint8Array>({
start(controller) {
controller.enqueue(enc.encode("data: ordinary\n\n"));
closeTimer = setTimeout(() => controller.close(), 35);
},
cancel() {
if (closeTimer) clearTimeout(closeTimer);
},
});
return new Response(
input.pipeThrough(createSseHeartbeatTransform({ shape, intervalMs: 10 }))
).text();
}
test("sseCommentsEnabled defaults to false when the env var is unset (#10524)", () => {
withEnv(undefined, () => assert.equal(sseCommentsEnabled(), false));
});
test("sseCommentsEnabled is false for 'off', 'false', '0', 'no' (case-insensitive)", () => {
withEnv("off", () => assert.equal(sseCommentsEnabled(), false));
withEnv("OFF", () => assert.equal(sseCommentsEnabled(), false));
withEnv("false", () => assert.equal(sseCommentsEnabled(), false));
withEnv("FALSE", () => assert.equal(sseCommentsEnabled(), false));
withEnv("0", () => assert.equal(sseCommentsEnabled(), false));
withEnv("no", () => assert.equal(sseCommentsEnabled(), false));
withEnv("NO", () => assert.equal(sseCommentsEnabled(), false));
withEnv("on", () => assert.equal(sseCommentsEnabled(), true));
withEnv("yes", () => assert.equal(sseCommentsEnabled(), true));
withEnv("1", () => assert.equal(sseCommentsEnabled(), true));
});
test("shapeForClientFormat maps known client formats", () => {
assert.equal(shapeForClientFormat("claude"), HEARTBEAT_SHAPES.ANTHROPIC_PING);
assert.equal(shapeForClientFormat("openai"), HEARTBEAT_SHAPES.OPENAI_CHUNK);
assert.equal(
shapeForClientFormat("openai-responses"),
HEARTBEAT_SHAPES.OPENAI_RESPONSES_IN_PROGRESS
);
assert.equal(shapeForClientFormat(undefined), HEARTBEAT_SHAPES.COMMENT);
});
test("comment opt-out suppresses only COMMENT heartbeats, not data-event heartbeats", async () => {
await withEnvAsync("off", async () => {
const comment = await collectHeartbeatOutput(HEARTBEAT_SHAPES.COMMENT);
assert.doesNotMatch(comment, /: keepalive/, "comment heartbeat should be suppressed");
assert.match(comment, /data: ordinary/, "ordinary data should pass through unchanged");
const openAI = await collectHeartbeatOutput(HEARTBEAT_SHAPES.OPENAI_CHUNK);
assert.match(openAI, /"object":"chat\.completion\.chunk"/);
const anthropic = await collectHeartbeatOutput(HEARTBEAT_SHAPES.ANTHROPIC_PING);
assert.match(anthropic, /event: ping\ndata: \{"type":"ping"\}/);
const responses = await collectHeartbeatOutput(HEARTBEAT_SHAPES.OPENAI_RESPONSES_IN_PROGRESS);
assert.match(responses, /data: \{"type":"response\.in_progress"\}/);
});
});