import { describe, expect, it } from "vitest"; import { LEVELS, ROLES, levelAtLeast, levelFromPrisma, levelRank, levelToPrisma, maxLevel, minLevel, roleFromPrisma, roleToPrisma, type PermissionLevel, } from "./levels.js"; describe("LEVELS ordering", () => { it("orders none < view < comment < edit < full_access", () => { expect(LEVELS).toEqual(["none", "view", "comment", "edit", "full_access"]); expect(levelRank("none")).toBe(0); expect(levelRank("view")).toBe(1); expect(levelRank("comment")).toBe(2); expect(levelRank("edit")).toBe(3); expect(levelRank("full_access")).toBe(4); }); }); describe("maxLevel / minLevel", () => { it("takes the higher / lower of two levels", () => { expect(maxLevel("edit", "view")).toBe("edit"); expect(maxLevel("view", "full_access")).toBe("full_access"); expect(maxLevel("comment", "comment")).toBe("comment"); expect(minLevel("edit", "view")).toBe("view"); expect(minLevel("full_access", "comment")).toBe("comment"); expect(minLevel("none", "none")).toBe("none"); }); }); describe("levelAtLeast", () => { const cases: [PermissionLevel, PermissionLevel, boolean][] = [ ["edit", "comment", true], ["view", "edit", false], ["full_access", "full_access", true], ["full_access", "view", true], ["none", "view", false], ["view", "view", true], ["comment", "edit", false], ]; it.each(cases)("levelAtLeast(%s, %s) === %s", (level, required, expected) => { expect(levelAtLeast(level, required)).toBe(expected); }); }); describe("prisma mapping (levels)", () => { const pairs: [PermissionLevel, string][] = [ ["none", "NONE"], ["view", "VIEW"], ["comment", "COMMENT"], ["edit", "EDIT"], ["full_access", "FULL_ACCESS"], ]; it("maps wire → prisma", () => { for (const [wire, prisma] of pairs) { expect(levelToPrisma(wire)).toBe(prisma); } }); it("maps prisma → wire (round-trips)", () => { for (const [wire, prisma] of pairs) { expect(levelFromPrisma(prisma)).toBe(wire); } }); it("throws on unknown prisma values", () => { expect(() => levelFromPrisma("ADMIN")).toThrow(/unknown PermissionLevel/); expect(() => levelFromPrisma("view")).toThrow(/unknown PermissionLevel/); }); }); describe("prisma mapping (roles)", () => { it("maps wire → prisma and back", () => { expect(roleToPrisma("owner")).toBe("OWNER"); expect(roleToPrisma("admin")).toBe("ADMIN"); expect(roleToPrisma("member")).toBe("MEMBER"); expect(roleToPrisma("guest")).toBe("GUEST"); expect(roleFromPrisma("OWNER")).toBe("owner"); expect(roleFromPrisma("GUEST")).toBe("guest"); }); it("throws on unknown role values", () => { expect(() => roleFromPrisma("FULL_ACCESS")).toThrow(/unknown WorkspaceRole/); }); it("ROLES is ascending in authority", () => { expect(ROLES).toEqual(["guest", "member", "admin", "owner"]); }); });