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"]); });