Files

88 lines
2.9 KiB
JavaScript

import assert from "node:assert/strict";
import test from "node:test";
import React from "react";
import { renderToStaticMarkup } from "react-dom/server";
import { createJiti } from "jiti";
const jiti = createJiti(import.meta.url, {
jsx: { runtime: "automatic" },
tsconfigPaths: true,
});
const { ChatInput, ModelErrorBanner, filterModelOptions } = await jiti.import("./ChatInput.tsx");
const { I18nProvider } = await jiti.import("../hooks/useI18n.tsx");
test("renders the upstream model error", () => {
const html = renderToStaticMarkup(
React.createElement(ModelErrorBanner, {
error: "Invalid models.json schema:\nproviders.custom.models.0.id must not be empty",
}),
);
assert.match(html, /role="alert"/);
assert.match(html, /Model error/);
assert.match(html, /providers\.custom\.models\.0\.id must not be empty/);
});
test("does not render an empty model error", () => {
assert.equal(renderToStaticMarkup(React.createElement(ModelErrorBanner, { error: null })), "");
});
test("keeps the model selector visible when a model error leaves no options", () => {
const html = renderToStaticMarkup(
React.createElement(
I18nProvider,
null,
React.createElement(ChatInput, {
onSend() {},
onAbort() {},
onModelChange() {},
isStreaming: false,
modelError: "Invalid models.json schema",
modelList: [],
modelNames: {},
}),
),
);
assert.match(html, />No models</);
assert.match(html, /title="No available models"/);
});
test("filters model options by name and id", () => {
const options = [
{ provider: "ollama", modelId: "qwen3:latest", name: "Qwen 3" },
{ provider: "anthropic", modelId: "claude-sonnet-4-6", name: "Claude Sonnet 4.6" },
{ provider: "openai", modelId: "gpt-5.4", name: "GPT-5.4" },
];
assert.deepEqual(filterModelOptions(options, "QWEN"), [options[0]]);
assert.deepEqual(filterModelOptions(options, "claude-sonnet"), [options[1]]);
assert.equal(filterModelOptions(options, "OpenAI").length, 0);
assert.equal(filterModelOptions(options, "anthropic/claude").length, 0);
assert.equal(filterModelOptions(options, "missing").length, 0);
assert.equal(filterModelOptions(options, " "), options);
});
test("renders compact errors above the input as a wrapping alert", () => {
const error = "Compaction failed: OpenAI API error (403): <html>request forbidden</html>";
const html = renderToStaticMarkup(
React.createElement(
I18nProvider,
null,
React.createElement(ChatInput, {
onSend() {},
onAbort() {},
onCompact() {},
isStreaming: false,
compactError: error,
}),
),
);
assert.match(html, /role="alert"/);
assert.match(html, /Compaction failed: OpenAI API error/);
assert.match(html, /&lt;html&gt;request forbidden&lt;\/html&gt;/);
assert.match(html, /white-space:pre-wrap/);
assert.ok(html.indexOf('role="alert"') < html.indexOf("<textarea"));
});