mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-06 15:22:12 +03:00
- byProvider now resolves the internal provider id to its configured display name via getProviderById() (fallback: raw id for providers not in the static registry). Fixes the Usage page showing "codex" instead of "OpenAI Codex". - byModel's in-memory dedup key now uses the normalized model name instead of the raw one, so the same logical model recorded under a bare and a provider-prefixed spelling (e.g. "glm-5.2" vs "z-ai/glm-5.2") merges into a single aggregated row instead of appearing twice with the same displayed name. - Introduces a local UsageRows type alias in route.ts to shrink the repeated "as Array<Record<string, unknown>>" casts back under the frozen file-size baseline once the file was touched.
90 lines
3.1 KiB
TypeScript
90 lines
3.1 KiB
TypeScript
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";
|
|
|
|
const TEST_DATA_DIR = fs.mkdtempSync(
|
|
path.join(os.tmpdir(), "omniroute-usage-analytics-provider-name-")
|
|
);
|
|
process.env.DATA_DIR = TEST_DATA_DIR;
|
|
const ORIGINAL_API_KEY_SECRET = process.env.API_KEY_SECRET;
|
|
process.env.API_KEY_SECRET = "test-usage-analytics-provider-name-secret";
|
|
|
|
const core = await import("../../src/lib/db/core.ts");
|
|
const apiKeysDb = await import("../../src/lib/db/apiKeys.ts");
|
|
const usageHistory = await import("../../src/lib/usage/usageHistory.ts");
|
|
const analyticsRoute = await import("../../src/app/api/usage/analytics/route.ts");
|
|
const providers = await import("../../src/shared/constants/providers.ts");
|
|
|
|
function makeRequest(url: string) {
|
|
return new Request(url, { method: "GET" });
|
|
}
|
|
|
|
test.beforeEach(() => {
|
|
core.resetDbInstance();
|
|
apiKeysDb.resetApiKeyState();
|
|
fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true });
|
|
fs.mkdirSync(TEST_DATA_DIR, { recursive: true });
|
|
usageHistory.clearPendingRequests();
|
|
});
|
|
|
|
test.after(() => {
|
|
core.resetDbInstance();
|
|
apiKeysDb.resetApiKeyState();
|
|
fs.rmSync(TEST_DATA_DIR, { recursive: true, force: true });
|
|
|
|
if (ORIGINAL_API_KEY_SECRET === undefined) {
|
|
delete process.env.API_KEY_SECRET;
|
|
} else {
|
|
process.env.API_KEY_SECRET = ORIGINAL_API_KEY_SECRET;
|
|
}
|
|
});
|
|
|
|
test("#7534: byProvider exposes the configured display name, not the raw internal provider id", async () => {
|
|
const db = core.getDbInstance();
|
|
const now = new Date().toISOString();
|
|
db.prepare(
|
|
`INSERT INTO usage_history (provider, model, connection_id, api_key_id, api_key_name, tokens_input, tokens_output, success, latency_ms, timestamp)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
|
|
).run("codex", "gpt-5.5", "test-conn", "test-key", "Primary Key", 100, 50, 1, 200, now);
|
|
|
|
const response = await analyticsRoute.GET(makeRequest("http://localhost/api/usage/analytics"));
|
|
const body = await response.json();
|
|
|
|
const expectedDisplayName = providers.getProviderById("codex")?.name;
|
|
assert.equal(response.status, 200);
|
|
assert.equal(
|
|
body.byProvider[0].provider,
|
|
expectedDisplayName,
|
|
`expected byProvider[0].provider to be the display name "${expectedDisplayName}", ` +
|
|
`but got "${body.byProvider[0].provider}" (#7534)`
|
|
);
|
|
});
|
|
|
|
test("#7534: byProvider falls back to the raw id for providers not in the static registry", async () => {
|
|
const db = core.getDbInstance();
|
|
const now = new Date().toISOString();
|
|
db.prepare(
|
|
`INSERT INTO usage_history (provider, model, connection_id, api_key_id, api_key_name, tokens_input, tokens_output, success, latency_ms, timestamp)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`
|
|
).run(
|
|
"openai-compatible-custom",
|
|
"some-model",
|
|
"test-conn",
|
|
"test-key",
|
|
"Primary Key",
|
|
100,
|
|
50,
|
|
1,
|
|
200,
|
|
now
|
|
);
|
|
|
|
const response = await analyticsRoute.GET(makeRequest("http://localhost/api/usage/analytics"));
|
|
const body = await response.json();
|
|
|
|
assert.equal(response.status, 200);
|
|
assert.equal(body.byProvider[0].provider, "openai-compatible-custom");
|
|
});
|