87 lines
4.0 KiB
TypeScript
87 lines
4.0 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");
|
|
});
|
|
|
|
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");
|
|
});
|
|
});
|