mirror of
https://github.com/musistudio/claude-code-router.git
synced 2026-08-27 17:31:49 +00:00
76 lines
2.6 KiB
TypeScript
76 lines
2.6 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import test from "node:test";
|
|
import { DEFAULT_TRAY_COMPONENT_VARIANTS } from "@ccr/core/contracts/app.ts";
|
|
import {
|
|
normalizeTrayComponentVariants,
|
|
normalizeTrayIconPreference,
|
|
normalizeTrayWidgets,
|
|
normalizeTrayWindowModules
|
|
} from "@ccr/ui/pages/tray/shared.tsx";
|
|
|
|
test("tray window modules reject unknown values and remove duplicates without reordering", () => {
|
|
assert.deepEqual(
|
|
normalizeTrayWindowModules(["stats", "unknown", "header", "stats", "footer"]),
|
|
["stats", "header", "footer"]
|
|
);
|
|
});
|
|
|
|
test("tray component variants retain valid values and fall back independently", () => {
|
|
assert.deepEqual(
|
|
normalizeTrayComponentVariants({
|
|
account: "arc",
|
|
modelShare: "invalid",
|
|
rings: "gauges",
|
|
stats: "pills",
|
|
tokenFlow: "sparkline",
|
|
tokenMix: "donut"
|
|
}),
|
|
{
|
|
account: "arc",
|
|
modelShare: DEFAULT_TRAY_COMPONENT_VARIANTS.modelShare,
|
|
rings: "gauges",
|
|
stats: "pills",
|
|
tokenFlow: "sparkline",
|
|
tokenMix: "donut"
|
|
}
|
|
);
|
|
assert.deepEqual(normalizeTrayComponentVariants(null), DEFAULT_TRAY_COMPONENT_VARIANTS);
|
|
});
|
|
|
|
test("tray widgets normalize ids and variants, pin top widgets, and dedupe singletons", () => {
|
|
const widgets = normalizeTrayWidgets([
|
|
{ id: " custom-account ", type: "account", variant: "arc" },
|
|
{ id: "", type: "header", variant: "ignored" },
|
|
{ id: "duplicate-header", type: "header" },
|
|
{ type: "source-tabs" },
|
|
{ id: "invalid-variant", type: "stats", variant: "unknown" },
|
|
{ type: "not-a-widget" },
|
|
null
|
|
]);
|
|
|
|
assert.deepEqual(widgets, [
|
|
{ id: "header", type: "header" },
|
|
{ id: "source-tabs", type: "source-tabs" },
|
|
{ id: "custom-account", type: "account", variant: "arc" },
|
|
{ id: "invalid-variant", type: "stats", variant: DEFAULT_TRAY_COMPONENT_VARIANTS.stats }
|
|
]);
|
|
});
|
|
|
|
test("legacy tray modules migrate into widgets with current variant preferences", () => {
|
|
assert.deepEqual(
|
|
normalizeTrayWidgets(undefined, ["stats", "header", "footer", "source-tabs"], { stats: "pills" }),
|
|
[
|
|
{ id: "header", type: "header" },
|
|
{ id: "source-tabs", type: "source-tabs" },
|
|
{ id: "stats", type: "stats", variant: "pills" }
|
|
]
|
|
);
|
|
});
|
|
|
|
test("tray icon preference accepts supported values and safely defaults", () => {
|
|
for (const value of ["violet", "orange", "cyan", "progress", "random"] as const) {
|
|
assert.equal(normalizeTrayIconPreference(value), value);
|
|
}
|
|
assert.equal(normalizeTrayIconPreference(undefined), "random");
|
|
assert.equal(normalizeTrayIconPreference("unsupported" as never), "random");
|
|
});
|