2026-05-09 21:47:48 +08:00

60 lines
2.5 KiB
JavaScript

import { describe, expect, test } from "vitest";
import { fallbackNavigation, filterNavigationByPermission, mergeNavigationItems } from "./menu.js";
describe("navigation menu helpers", () => {
test("keeps only fallback menu items allowed by permissions", () => {
const items = filterNavigationByPermission(
fallbackNavigation,
(code) => code === "agency:view" || code === "host:view",
);
expect(flattenCodes(items)).not.toContain("geo");
expect(flattenCodes(items)).toContain("host-org");
expect(flattenCodes(items)).toContain("host-org-agencies");
expect(flattenCodes(items)).toContain("host-org-hosts");
expect(flattenCodes(items)).not.toContain("host-org-bds");
});
test("places country and region pages under geo menu", () => {
const items = filterNavigationByPermission(
fallbackNavigation,
(code) => code === "country:view" || code === "region:view",
);
const geo = items.find((item) => item.code === "geo");
expect(geo).toBeTruthy();
expect(geo.children.map((item) => item.code)).toEqual(["host-org-countries", "host-org-regions"]);
expect(flattenCodes(items)).not.toContain("host-org");
});
test("keeps the app user login log entry routable", () => {
const items = filterNavigationByPermission(fallbackNavigation, (code) => code === "app-user:view");
const appUsers = items.find((item) => item.code === "app-users");
expect(appUsers.children.map((item) => item.code)).toContain("app-user-login-logs");
expect(appUsers.children.find((item) => item.code === "app-user-login-logs").path).toBe(
"/app/users/login-logs",
);
});
test("adds missing permitted fallback children to backend menu groups", () => {
const backendMenus = [
{
children: [],
code: "host-org",
icon: fallbackNavigation.find((item) => item.code === "host-org").icon,
id: "host-org",
label: "团队管理",
},
];
const fallbackMenus = filterNavigationByPermission(fallbackNavigation, (code) => code === "agency:view");
const merged = mergeNavigationItems(backendMenus, fallbackMenus);
expect(flattenCodes(merged)).toContain("host-org-agencies");
});
});
function flattenCodes(items) {
return items.flatMap((item) => [item.code, ...flattenCodes(item.children || [])]);
}