Files
openclaw/ui/src/lib/sidebar-zone.test.ts
T
Peter Steinberger 440539b538 feat(workboard): routable boards, sidebar pinning, icon and color (#112302)
* feat(ui): add Workboard board routes and pins

* fix(ui): reject malformed Workboard board catalogs

* perf(ui): lazy-load Workboard sidebar runtime

* test(ui): align sidebar board fixtures with render contract

* fix(ui): clear Workboard landing gates
2026-07-21 15:16:38 -07:00

113 lines
3.3 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { SIDEBAR_NAV_ROUTES } from "../app-navigation.ts";
import { reconcileSidebarZone } from "./sidebar-zone.ts";
describe("reconcileSidebarZone", () => {
it("preserves route and pinned-session interleaving", () => {
const result = reconcileSidebarZone(
["route:usage", "session:agent:main:alpha", "route:plugins"],
[{ key: "agent:main:alpha" }],
SIDEBAR_NAV_ROUTES,
);
expect(result.entries).toEqual([
{ type: "route", route: "usage" },
{ type: "session", key: "agent:main:alpha" },
{ type: "route", route: "plugins" },
]);
expect(result.sidebarEntries).toEqual([
"route:usage",
"session:agent:main:alpha",
"route:plugins",
]);
});
it("prunes known-unpinned sessions and appends server-pinned sessions", () => {
const result = reconcileSidebarZone(
["session:agent:main:stale", "route:usage", "session:agent:main:alpha"],
[{ key: "agent:main:alpha" }, { key: "agent:main:beta" }],
SIDEBAR_NAV_ROUTES,
new Set(["agent:main:stale"]),
);
expect(result.sidebarEntries).toEqual([
"route:usage",
"session:agent:main:alpha",
"session:agent:main:beta",
]);
});
it("keeps unknown-state session entries in place without rendering them", () => {
// agent-b's pinned session is not loaded in this view; its slot must
// survive a canonical write or synced prefs lose cross-agent order.
const result = reconcileSidebarZone(
["session:agent:b:remote", "route:usage", "session:agent:main:alpha"],
[{ key: "agent:main:alpha" }],
SIDEBAR_NAV_ROUTES,
new Set(["agent:main:other"]),
);
expect(result.entries).toEqual([
{ type: "route", route: "usage" },
{ type: "session", key: "agent:main:alpha" },
]);
expect(result.sidebarEntries).toEqual([
"session:agent:b:remote",
"route:usage",
"session:agent:main:alpha",
]);
});
it("drops routes outside the supplied valid route set", () => {
expect(
reconcileSidebarZone(["route:usage", "route:plugins"], [], ["usage"]).sidebarEntries,
).toEqual(["route:usage"]);
});
it("keeps active Workboard boards and drops stale or plugin-off pins", () => {
const boards = [
{ id: "default", total: 0, active: 0, archived: 0, byStatus: {} },
{ id: "ops", total: 0, active: 0, archived: 0, byStatus: {} },
];
expect(
reconcileSidebarZone(
["workboard:ops", "workboard:deleted", "route:usage"],
[],
SIDEBAR_NAV_ROUTES,
new Set(),
boards,
true,
true,
).sidebarEntries,
).toEqual(["workboard:ops", "route:usage"]);
expect(
reconcileSidebarZone(
["workboard:ops", "route:usage"],
[],
SIDEBAR_NAV_ROUTES,
new Set(),
boards,
false,
true,
).sidebarEntries,
).toEqual(["route:usage"]);
});
it("preserves Workboard pins until the active plugin's board catalog is authoritative", () => {
expect(
reconcileSidebarZone(
["workboard:ops", "route:usage"],
[],
SIDEBAR_NAV_ROUTES,
new Set(),
[],
true,
false,
),
).toEqual({
entries: [{ type: "route", route: "usage" }],
sidebarEntries: ["workboard:ops", "route:usage"],
});
});
});