129 lines
3.2 KiB
TypeScript
129 lines
3.2 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { PERMS } from "@/lib/permission-slugs";
|
|
import { ownedLegacyPages } from "./discover-legacy-pages";
|
|
import { systemMigrationEntries } from "./system";
|
|
import { validateMigrationEntries } from "./validate-matrix";
|
|
|
|
const SYSTEM_PREFIXES = [
|
|
"/admin/alerts",
|
|
"/admin/analytics",
|
|
"/admin/commandocentrum",
|
|
"/admin/devops",
|
|
"/admin/emulator",
|
|
"/admin/housekeeping",
|
|
"/admin/logs",
|
|
"/admin/maintenance",
|
|
"/admin/menu",
|
|
"/admin/permissions",
|
|
"/admin/settings",
|
|
] as const;
|
|
|
|
describe("systemMigrationEntries", () => {
|
|
it("covers all 19 System pages exactly once", () => {
|
|
expect(systemMigrationEntries).toHaveLength(19);
|
|
expect(
|
|
validateMigrationEntries(
|
|
ownedLegacyPages(SYSTEM_PREFIXES),
|
|
systemMigrationEntries,
|
|
),
|
|
).toEqual([]);
|
|
});
|
|
|
|
it("removes legacy foundation-owned pages", () => {
|
|
expect(systemMigrationEntries).toEqual(
|
|
expect.arrayContaining([
|
|
expect.objectContaining({
|
|
legacyPath: "/admin/housekeeping",
|
|
decision: "REMOVE",
|
|
targetPath: null,
|
|
}),
|
|
expect.objectContaining({
|
|
legacyPath: "/admin/menu",
|
|
decision: "REMOVE",
|
|
targetPath: null,
|
|
}),
|
|
]),
|
|
);
|
|
});
|
|
|
|
it("keeps live permissions as a System workflow", () => {
|
|
expect(systemMigrationEntries).toContainEqual(
|
|
expect.objectContaining({
|
|
legacyPath: "/admin/permissions",
|
|
targetPath: "/admin/system/access/permissions",
|
|
decision: expect.not.stringMatching("REMOVE"),
|
|
}),
|
|
);
|
|
});
|
|
|
|
it("retains the read-only legacy housekeeping value in removal notes", () => {
|
|
const housekeeping = systemMigrationEntries.find(
|
|
(row) => row.legacyPath === "/admin/housekeeping",
|
|
);
|
|
|
|
expect(housekeeping?.dependencies.queries).toEqual(
|
|
expect.arrayContaining([
|
|
"exportPermissions",
|
|
"getAuditLogs",
|
|
"legacy ACL comparison",
|
|
]),
|
|
);
|
|
expect(housekeeping?.notes.join(" ")).toMatch(
|
|
/read-only.*export.*comparison/i,
|
|
);
|
|
});
|
|
|
|
it("uses only the approved System target roots", () => {
|
|
const allowedRoots = [
|
|
"/admin/system/access",
|
|
"/admin/system/configuration",
|
|
"/admin/system/observability",
|
|
"/admin/system/operations",
|
|
];
|
|
|
|
expect(
|
|
systemMigrationEntries.every(
|
|
(row) =>
|
|
row.targetPath === null ||
|
|
allowedRoots.some(
|
|
(root) =>
|
|
row.targetPath === root || row.targetPath?.startsWith(`${root}/`),
|
|
),
|
|
),
|
|
).toBe(true);
|
|
});
|
|
|
|
it("keeps non-removal workflows planned without parity claims", () => {
|
|
expect(
|
|
systemMigrationEntries
|
|
.filter((row) => row.decision !== "REMOVE")
|
|
.every(
|
|
(row) => row.status === "PLANNED" && row.parityEvidence.length === 0,
|
|
),
|
|
).toBe(true);
|
|
});
|
|
|
|
it("records authoritative capabilities for privileged System mutations", () => {
|
|
expect(systemMigrationEntries).toEqual(
|
|
expect.arrayContaining([
|
|
expect.objectContaining({
|
|
legacyPath: "/admin/commandocentrum",
|
|
capabilities: {
|
|
read: [PERMS.RCON_EXECUTE],
|
|
mutate: [PERMS.RCON_EXECUTE],
|
|
},
|
|
auditRequirement: "PRIVILEGED_MUTATION",
|
|
}),
|
|
expect.objectContaining({
|
|
legacyPath: "/admin/permissions/:id",
|
|
capabilities: {
|
|
read: [PERMS.PERMISSIONS_MANAGE],
|
|
mutate: [PERMS.PERMISSIONS_MANAGE],
|
|
},
|
|
auditRequirement: "PRIVILEGED_MUTATION",
|
|
}),
|
|
]),
|
|
);
|
|
});
|
|
});
|