mirror of
https://github.com/openclaw/openclaw.git
synced 2026-08-24 11:25:50 -06:00
440539b538
* 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
113 lines
3.3 KiB
TypeScript
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"],
|
|
});
|
|
});
|
|
});
|