109 lines
3.3 KiB
TypeScript
109 lines
3.3 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import test from "node:test";
|
|
|
|
import {
|
|
applyCompactMenuOverrides,
|
|
isDefaultCompactMenuType,
|
|
normalizeCompactMenuType,
|
|
preserveUnknownCompactMenuOverrides,
|
|
snapshotCompactMenuOverrides,
|
|
} from "./compact-menu-overrides";
|
|
import type { MenuItem } from "./sidebar-menu";
|
|
|
|
const I = (() => null) as unknown as MenuItem["icon"];
|
|
|
|
test("normalizeCompactMenuType defaults to A", () => {
|
|
assert.equal(normalizeCompactMenuType(undefined), "A");
|
|
assert.equal(normalizeCompactMenuType(""), "A");
|
|
assert.equal(normalizeCompactMenuType("default"), "A");
|
|
assert.equal(normalizeCompactMenuType("b"), "B");
|
|
assert.equal(normalizeCompactMenuType("2"), "B");
|
|
assert.equal(normalizeCompactMenuType("alt"), "B");
|
|
assert.equal(isDefaultCompactMenuType(undefined), true);
|
|
assert.equal(isDefaultCompactMenuType(""), true);
|
|
assert.equal(isDefaultCompactMenuType("B"), false);
|
|
});
|
|
|
|
test("applyCompactMenuOverrides splits sidebar, settings, and toolbox", () => {
|
|
const items: MenuItem[] = [
|
|
{ id: "a", label: "对话", icon: I, path: "/a" },
|
|
{ id: "b", label: "智能体", icon: I, path: "/b" },
|
|
{ id: "c", label: "技能", icon: I, path: "/c" },
|
|
];
|
|
const applied = applyCompactMenuOverrides(items, [
|
|
{ nodeId: "b", placement: "settings", sortOrder: 0, label: "智能体设置" },
|
|
{ nodeId: "c", placement: "toolbox", sortOrder: 0, label: "技能工具" },
|
|
]);
|
|
assert.deepEqual(
|
|
applied.sidebarItems.map((item) => item.id),
|
|
["a"],
|
|
);
|
|
assert.equal(applied.settingsItems[0]?.id, "b");
|
|
assert.equal(applied.settingsItems[0]?.label, "智能体设置");
|
|
assert.equal(applied.toolboxItems[0]?.id, "c");
|
|
assert.equal(applied.toolboxItems[0]?.label, "技能工具");
|
|
});
|
|
|
|
test("snapshotCompactMenuOverrides keeps every personal item and lane order", () => {
|
|
const items = [
|
|
{
|
|
id: "a",
|
|
label: "我的对话",
|
|
defaultLabel: "对话",
|
|
defaultIndex: 0,
|
|
compactPlacement: "sidebar" as const,
|
|
compactOrder: 0,
|
|
icon: I,
|
|
path: "/a",
|
|
},
|
|
{
|
|
id: "b",
|
|
label: "我的工具",
|
|
defaultLabel: "工具",
|
|
defaultIndex: 1,
|
|
compactPlacement: "toolbox" as const,
|
|
compactOrder: 0,
|
|
icon: I,
|
|
path: "/b",
|
|
},
|
|
{
|
|
id: "c",
|
|
label: "设置",
|
|
defaultLabel: "设置",
|
|
defaultIndex: 2,
|
|
compactPlacement: "sidebar" as const,
|
|
compactOrder: 1,
|
|
icon: I,
|
|
path: "/c",
|
|
},
|
|
];
|
|
assert.deepEqual(
|
|
snapshotCompactMenuOverrides(items).map((item) => [item.nodeId, item.placement, item.sortOrder]),
|
|
[
|
|
["a", "sidebar", 0],
|
|
["b", "toolbox", 0],
|
|
["c", "sidebar", 1],
|
|
],
|
|
);
|
|
assert.equal(snapshotCompactMenuOverrides(items)[0]?.label, "我的对话");
|
|
});
|
|
|
|
test("personal compact snapshot preserves a temporarily absent old item", () => {
|
|
const visible = snapshotCompactMenuOverrides([
|
|
{
|
|
id: "a",
|
|
label: "对话",
|
|
defaultLabel: "对话",
|
|
defaultIndex: 0,
|
|
compactPlacement: "sidebar",
|
|
compactOrder: 0,
|
|
icon: I,
|
|
path: "/a",
|
|
},
|
|
]);
|
|
const combined = preserveUnknownCompactMenuOverrides(visible, [
|
|
{ nodeId: "temporarily-hidden", placement: "toolbox", sortOrder: 0, label: "旧工具" },
|
|
]);
|
|
assert.deepEqual(combined.map((item) => item.nodeId), ["a", "temporarily-hidden"]);
|
|
});
|