Files
browser/platform_web/routes/routes.test.ts
T

97 lines
4.8 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { defaultPageForUser, firstPartyRoutes, hashForPage, navigationRoutesForUser, resolveRouteHash, routeForPage } from "./routes";
import { initialNavigationState } from "../stores/navigation";
import { capabilitiesForRoles, type CurrentUserView } from "../contracts/workspace";
const platformAdmin: CurrentUserView = {
id: "user-admin",
displayName: "Admin",
status: "active",
roles: ["platformAdmin"],
capabilities: capabilitiesForRoles(["platformAdmin"]),
profile: {},
source: "local"
};
const serverAdmin: CurrentUserView = {
id: "user-server",
displayName: "Server Operator",
status: "active",
roles: ["serverAdmin"],
capabilities: capabilitiesForRoles(["serverAdmin"]),
profile: {},
source: "local"
};
describe("console shell routes", () => {
it("resolves known hashes and paths", () => {
expect(resolveRouteHash("#/servers", platformAdmin).route.id).toBe("servers");
expect(resolveRouteHash("#/profile", platformAdmin).route.id).toBe("profileSettings");
expect(resolveRouteHash("#/aiProviders", platformAdmin).route.id).toBe("aiProviders");
expect(resolveRouteHash("#/ai-providers", platformAdmin).route.id).toBe("aiProviders");
expect(resolveRouteHash("#/unknown", platformAdmin).route.id).toBe("home");
expect(resolveRouteHash("#/plugins", platformAdmin).route.id).toBe("plugins");
});
it("resolves server detail hashes with params", () => {
const resolved = resolveRouteHash("#/servers/server-example-1", platformAdmin);
expect(resolved.route.id).toBe("serverDetail");
expect(resolved.params.serverId).toBe("server-example-1");
expect(hashForPage("serverDetail", { serverId: "server-example-1" })).toBe("#/servers/server-example-1");
expect(hashForPage("serverDetail", { serverId: "server-example-1", routeKey: "run-builder" })).toBe("#/servers/server-example-1?focus=run-builder");
expect(resolveRouteHash("#/servers/server-example-1?focus=run-builder", platformAdmin).params).toEqual({ serverId: "server-example-1", routeKey: "run-builder" });
});
it("round-trips hosted plugin page hashes with server context", () => {
const hash = hashForPage("pluginPage", { pluginId: "game.scum", routeKey: "operations", serverId: "server/scum-1" });
expect(hash).toBe("#/plugin-pages/game.scum/operations?serverInstanceId=server%2Fscum-1");
const resolved = resolveRouteHash(hash, platformAdmin);
expect(resolved.route).toMatchObject({ id: "pluginPage", showInNav: false, requiredCapability: "servers.read" });
expect(resolved.params).toEqual({ pluginId: "game.scum", routeKey: "operations", serverId: "server/scum-1" });
});
it("keeps route metadata available for shell navigation", () => {
expect(firstPartyRoutes.map((route) => route.id)).toContain("maintenance");
expect(firstPartyRoutes.map((route) => route.id)).toContain("profileSettings");
expect(routeForPage("users")).toMatchObject({ label: "用户管理", hash: "#/users" });
expect(routeForPage("profileSettings")).toMatchObject({ label: "个人设置", hash: "#/profile" });
});
it("routes platform administrators to the platform overview by default", () => {
expect(defaultPageForUser(platformAdmin)).toBe("home");
expect(initialNavigationState(platformAdmin, "").pageId).toBe("home");
});
it("routes server owners and administrators to the server list by default", () => {
expect(defaultPageForUser(serverAdmin)).toBe("servers");
expect(initialNavigationState(serverAdmin, "").pageId).toBe("servers");
});
it("hides platform-only navigation from server-only users", () => {
const labels = navigationRoutesForUser(serverAdmin).map((route) => route.label);
expect(labels).toContain("服务器管理");
expect(labels).not.toContain("平台概览");
expect(labels).not.toContain("用户管理");
expect(labels).not.toContain("AI 提供商管理");
expect(labels).not.toContain("系统维护");
expect(labels).not.toContain("个人设置");
});
it("shows all platform areas to platform administrators", () => {
const labels = navigationRoutesForUser(platformAdmin).map((route) => route.label);
expect(labels).toEqual(["平台概览", "服务器管理", "插件市场", "用户管理", "AI 提供商管理", "系统维护"]);
});
it("allows every authenticated role to open profile settings", () => {
expect(initialNavigationState(platformAdmin, "#/profile").pageId).toBe("profileSettings");
expect(initialNavigationState(serverAdmin, "#/profile").pageId).toBe("profileSettings");
});
it("redirects unauthorized hashes to the role default workspace", () => {
expect(initialNavigationState(serverAdmin, "#/home").pageId).toBe("servers");
expect(initialNavigationState(serverAdmin, "#/users").pageId).toBe("servers");
expect(initialNavigationState(serverAdmin, "#/servers/server-1").pageId).toBe("serverDetail");
});
});