Files
Jyotisha/frontend/tests/public-models.test.ts
2026-07-17 13:42:50 +08:00

94 lines
2.1 KiB
TypeScript

import assert from "node:assert/strict";
import test from "node:test";
import {
parsePublicModelCatalog,
resolveSessionModelId,
} from "../src/lib/public-models.ts";
const publicPayload = {
defaultModelId: "deepseek-pro",
models: [
{
id: "deepseek-pro",
label: "DeepSeek V4 Pro",
description: "复杂分析",
creditCost: 1,
isDefault: true,
},
{
id: "gpt-mini",
label: "ChatGPT Mini",
description: "均衡响应",
creditCost: 1,
isDefault: false,
},
],
} as const;
test("parses a sanitized public model catalog", () => {
// Given
const payload: unknown = publicPayload;
// When
const catalog = parsePublicModelCatalog(payload);
// Then
assert.equal(catalog.defaultModelId, "deepseek-pro");
assert.equal(catalog.models.length, 2);
assert.equal(catalog.models[0]?.label, "DeepSeek V4 Pro");
});
test("rejects provider routing fields in a public model payload", () => {
// Given
const payload = {
...publicPayload,
models: [{
...publicPayload.models[0],
baseURL: "https://api.deepseek.com",
apiKeyEnv: "DEEPSEEK_API_KEY",
}],
};
// When
const parse = () => parsePublicModelCatalog(payload);
// Then
assert.throws(parse);
});
test("rejects a default model that is absent from the public list", () => {
// Given
const payload = {
...publicPayload,
defaultModelId: "removed-model",
};
// When
const parse = () => parsePublicModelCatalog(payload);
// Then
assert.throws(parse);
});
test("keeps a saved model that remains available", () => {
// Given
const catalog = parsePublicModelCatalog(publicPayload);
// When
const result = resolveSessionModelId("gpt-mini", catalog);
// Then
assert.deepEqual(result, { modelId: "gpt-mini", fellBack: false });
});
test("falls back to the configured default when a saved model is removed", () => {
// Given
const catalog = parsePublicModelCatalog(publicPayload);
// When
const result = resolveSessionModelId("removed-model", catalog);
// Then
assert.deepEqual(result, { modelId: "deepseek-pro", fellBack: true });
});