|
@@ -1,7 +1,12 @@
|
|
|
/* @vitest-environment node */
|
|
/* @vitest-environment node */
|
|
|
|
|
|
|
|
import { describe, it, expect } from "vitest";
|
|
import { describe, it, expect } from "vitest";
|
|
|
-import { canAccessBranch, filterBranchesForSession } from "./permissions.js";
|
|
|
|
|
|
|
+import {
|
|
|
|
|
+ canAccessBranch,
|
|
|
|
|
+ filterBranchesForSession,
|
|
|
|
|
+ canManageUsers,
|
|
|
|
|
+ requireUserManagement,
|
|
|
|
|
+} from "./permissions.js";
|
|
|
|
|
|
|
|
describe("lib/auth/permissions", () => {
|
|
describe("lib/auth/permissions", () => {
|
|
|
describe("canAccessBranch", () => {
|
|
describe("canAccessBranch", () => {
|
|
@@ -27,6 +32,12 @@ describe("lib/auth/permissions", () => {
|
|
|
expect(canAccessBranch(session, "NL99")).toBe(true);
|
|
expect(canAccessBranch(session, "NL99")).toBe(true);
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
|
|
+ it("allows superadmin role for any branch", () => {
|
|
|
|
|
+ const session = { role: "superadmin" };
|
|
|
|
|
+ expect(canAccessBranch(session, "NL01")).toBe(true);
|
|
|
|
|
+ expect(canAccessBranch(session, "NL99")).toBe(true);
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
it("allows dev role for any branch", () => {
|
|
it("allows dev role for any branch", () => {
|
|
|
const session = { role: "dev" };
|
|
const session = { role: "dev" };
|
|
|
expect(canAccessBranch(session, "NL01")).toBe(true);
|
|
expect(canAccessBranch(session, "NL01")).toBe(true);
|
|
@@ -57,13 +68,16 @@ describe("lib/auth/permissions", () => {
|
|
|
expect(filterBranchesForSession(session, ["NL02", "NL03"])).toEqual([]);
|
|
expect(filterBranchesForSession(session, ["NL02", "NL03"])).toEqual([]);
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
- it("for admin/dev: returns the full list", () => {
|
|
|
|
|
|
|
+ it("for admin/superadmin/dev: returns the full list", () => {
|
|
|
const branches = ["NL01", "NL02", "NL03"];
|
|
const branches = ["NL01", "NL02", "NL03"];
|
|
|
expect(filterBranchesForSession({ role: "admin" }, branches)).toEqual(
|
|
expect(filterBranchesForSession({ role: "admin" }, branches)).toEqual(
|
|
|
- branches
|
|
|
|
|
|
|
+ branches,
|
|
|
);
|
|
);
|
|
|
|
|
+ expect(
|
|
|
|
|
+ filterBranchesForSession({ role: "superadmin" }, branches),
|
|
|
|
|
+ ).toEqual(branches);
|
|
|
expect(filterBranchesForSession({ role: "dev" }, branches)).toEqual(
|
|
expect(filterBranchesForSession({ role: "dev" }, branches)).toEqual(
|
|
|
- branches
|
|
|
|
|
|
|
+ branches,
|
|
|
);
|
|
);
|
|
|
});
|
|
});
|
|
|
|
|
|
|
@@ -74,4 +88,54 @@ describe("lib/auth/permissions", () => {
|
|
|
expect(branches).toEqual(copy);
|
|
expect(branches).toEqual(copy);
|
|
|
});
|
|
});
|
|
|
});
|
|
});
|
|
|
|
|
+
|
|
|
|
|
+ describe("canManageUsers", () => {
|
|
|
|
|
+ it("returns true for dev and superadmin", () => {
|
|
|
|
|
+ expect(canManageUsers({ role: "dev" })).toBe(true);
|
|
|
|
|
+ expect(canManageUsers({ role: "superadmin" })).toBe(true);
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it("returns false for admin and branch", () => {
|
|
|
|
|
+ expect(canManageUsers({ role: "admin" })).toBe(false);
|
|
|
|
|
+ expect(canManageUsers({ role: "branch", branchId: "NL01" })).toBe(false);
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it("returns false for unknown roles or missing session", () => {
|
|
|
|
|
+ expect(canManageUsers({ role: "user" })).toBe(false);
|
|
|
|
|
+ expect(canManageUsers(null)).toBe(false);
|
|
|
|
|
+ });
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ describe("requireUserManagement", () => {
|
|
|
|
|
+ it("does not throw for dev and superadmin", () => {
|
|
|
|
|
+ expect(() => requireUserManagement({ role: "dev" })).not.toThrow();
|
|
|
|
|
+ expect(() => requireUserManagement({ role: "superadmin" })).not.toThrow();
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it("throws 403 AUTH_FORBIDDEN_USER_MANAGEMENT for admin", () => {
|
|
|
|
|
+ try {
|
|
|
|
|
+ requireUserManagement({ role: "admin" });
|
|
|
|
|
+ throw new Error("Expected requireUserManagement to throw");
|
|
|
|
|
+ } catch (err) {
|
|
|
|
|
+ expect(err).toMatchObject({
|
|
|
|
|
+ status: 403,
|
|
|
|
|
+ code: "AUTH_FORBIDDEN_USER_MANAGEMENT",
|
|
|
|
|
+ message: "Forbidden",
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ it("throws 403 AUTH_FORBIDDEN_USER_MANAGEMENT for branch", () => {
|
|
|
|
|
+ try {
|
|
|
|
|
+ requireUserManagement({ role: "branch", branchId: "NL01" });
|
|
|
|
|
+ throw new Error("Expected requireUserManagement to throw");
|
|
|
|
|
+ } catch (err) {
|
|
|
|
|
+ expect(err).toMatchObject({
|
|
|
|
|
+ status: 403,
|
|
|
|
|
+ code: "AUTH_FORBIDDEN_USER_MANAGEMENT",
|
|
|
|
|
+ message: "Forbidden",
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ });
|
|
|
});
|
|
});
|