mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-07-31 20:32:20 +03:00
Repaired 47 of 49 pre-existing failing unit test files on release/v3.8.2 (down to docs-site-overhaul, a tr46/tsx/Node24 toolchain blocker, tracked separately). Stale tests reconciled with current source (catalog/registry/version drift), the notable ones: openai gpt-4o / gpt-4o-mini removed from the registry; Antigravity Claude models removed from the public catalog; DEFAULT_CLAUDE_CODE_VERSION and DEFAULT_CODEX_CLIENT_VERSION bumps; voyage-3-large → voyage-4; model-alias seed now routes via gemini-cli; remapToolNames API change; getLKGP return shape; sidebar nav overhaul; CLI commands now write via process.stdout.write; cloudEnabled default true. Real SOURCE bugs found by the tests and fixed (not masked): - fix(db): commandCodeAuth.toSafeStatus + evals.ts read the `*Json` camel keys that rowToCamel does not produce — it auto-parses `*_json` columns under the base name, so metadata/outputs/summary/results/tags were always empty. Read the base keys. - fix(executors): re-register claude-web / cw-web in the executor index (the provider shipped in #2476 but was never wired into the registry). - fix(validation): build the OpenAI-like /models probe with addModelsSuffix so an OpenAI base URL validates against /v1/models, not /v1/chat/completions/models; honor a ya29.* Google OAuth token as Bearer even when authType is apikey/header (it was shadowed by an unreachable else-if); make the Anthropic /models probe best-effort (try/catch) so a 404/malformed-URL throw no longer marks a valid key invalid. - fix(security): add the requireCliToolsAuth guard to the GET handlers of cli-tools/guide-settings/[toolId] and cli-tools/hermes-agent-settings (host config access was unguarded). - revert(stream): restore the SSE heartbeat default to 15s (the 4s round-8 change regressed runtime-timeouts; #2544's early-keepalive route wrapper remains the fix). Also: env-doc sync (OMNIROUTE_SKIP_DB_HEALTHCHECK) and new sidebar i18n keys.
107 lines
3.2 KiB
TypeScript
107 lines
3.2 KiB
TypeScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
|
|
const ORIGINAL_FETCH = globalThis.fetch;
|
|
|
|
function makeResponse(data: unknown, status = 200) {
|
|
return {
|
|
ok: status >= 200 && status < 300,
|
|
status,
|
|
headers: new Headers({ "content-type": "application/json" }),
|
|
json: async () => data,
|
|
text: async () => JSON.stringify(data),
|
|
} as unknown as Response;
|
|
}
|
|
|
|
async function withModelsFetch(mockFetch: typeof fetch, fn: () => Promise<void>) {
|
|
globalThis.fetch = mockFetch;
|
|
try {
|
|
await fn();
|
|
} finally {
|
|
globalThis.fetch = ORIGINAL_FETCH;
|
|
}
|
|
}
|
|
|
|
test("models returns 1 when server is offline", async () => {
|
|
await withModelsFetch(
|
|
(async () => {
|
|
throw new Error("connection refused");
|
|
}) as typeof fetch,
|
|
async () => {
|
|
const { runModelsCommand } = await import("../../bin/cli/commands/models.mjs");
|
|
const originalError = console.error;
|
|
console.error = () => {};
|
|
const result = await runModelsCommand(undefined, {});
|
|
console.error = originalError;
|
|
assert.equal(result, 1);
|
|
}
|
|
);
|
|
});
|
|
|
|
test("models --json returns 0 and prints JSON when server responds", async () => {
|
|
const mockModels = [
|
|
{ id: "gpt-4o", provider: "openai", name: "GPT-4o" },
|
|
{ id: "claude-3-5-sonnet", provider: "anthropic", name: "Claude 3.5 Sonnet" },
|
|
];
|
|
|
|
const mockFetch = (async (url: string) => {
|
|
if (String(url).includes("/api/health")) {
|
|
return makeResponse({ status: "ok" });
|
|
}
|
|
if (String(url).includes("/api/models")) {
|
|
return makeResponse(mockModels);
|
|
}
|
|
throw new Error("unexpected URL: " + url);
|
|
}) as typeof fetch;
|
|
|
|
await withModelsFetch(mockFetch, async () => {
|
|
const { runModelsCommand } = await import("../../bin/cli/commands/models.mjs");
|
|
|
|
const chunks: string[] = [];
|
|
const originalWrite = process.stdout.write.bind(process.stdout);
|
|
process.stdout.write = (chunk: any) => {
|
|
chunks.push(String(chunk));
|
|
return true;
|
|
};
|
|
const result = await runModelsCommand(undefined, { json: true });
|
|
process.stdout.write = originalWrite;
|
|
|
|
assert.equal(result, 0);
|
|
const parsed = JSON.parse(chunks.join(""));
|
|
assert.ok(Array.isArray(parsed));
|
|
assert.equal(parsed.length, 2);
|
|
});
|
|
});
|
|
|
|
test("models filters by provider argument", async () => {
|
|
const mockModels = [
|
|
{ id: "gpt-4o", provider: "openai" },
|
|
{ id: "claude-3-5-sonnet", provider: "anthropic" },
|
|
];
|
|
|
|
const mockFetch = (async (url: string) => {
|
|
if (String(url).includes("/api/health")) {
|
|
return makeResponse({ status: "ok" });
|
|
}
|
|
return makeResponse(mockModels);
|
|
}) as typeof fetch;
|
|
|
|
await withModelsFetch(mockFetch, async () => {
|
|
const { runModelsCommand } = await import("../../bin/cli/commands/models.mjs");
|
|
|
|
const chunks: string[] = [];
|
|
const originalWrite = process.stdout.write.bind(process.stdout);
|
|
process.stdout.write = (chunk: any) => {
|
|
chunks.push(String(chunk));
|
|
return true;
|
|
};
|
|
const result = await runModelsCommand("openai", { json: true });
|
|
process.stdout.write = originalWrite;
|
|
|
|
assert.equal(result, 0);
|
|
const parsed = JSON.parse(chunks.join(""));
|
|
assert.equal(parsed.length, 1);
|
|
assert.equal(parsed[0].provider, "openai");
|
|
});
|
|
});
|