permissions.test.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /* @vitest-environment node */
  2. import { describe, it, expect } from "vitest";
  3. import { canAccessBranch, filterBranchesForSession } from "./permissions.js";
  4. describe("lib/auth/permissions", () => {
  5. describe("canAccessBranch", () => {
  6. it("returns false when session is missing", () => {
  7. expect(canAccessBranch(null, "NL01")).toBe(false);
  8. });
  9. it("returns false when branchId is missing", () => {
  10. expect(canAccessBranch({ role: "admin" }, "")).toBe(false);
  11. expect(canAccessBranch({ role: "admin" }, null)).toBe(false);
  12. expect(canAccessBranch({ role: "admin" }, undefined)).toBe(false);
  13. });
  14. it("allows branch role only for its own branch", () => {
  15. const session = { role: "branch", branchId: "NL01" };
  16. expect(canAccessBranch(session, "NL01")).toBe(true);
  17. expect(canAccessBranch(session, "NL02")).toBe(false);
  18. });
  19. it("allows admin role for any branch", () => {
  20. const session = { role: "admin" };
  21. expect(canAccessBranch(session, "NL01")).toBe(true);
  22. expect(canAccessBranch(session, "NL99")).toBe(true);
  23. });
  24. it("allows dev role for any branch", () => {
  25. const session = { role: "dev" };
  26. expect(canAccessBranch(session, "NL01")).toBe(true);
  27. expect(canAccessBranch(session, "NL99")).toBe(true);
  28. });
  29. it("denies unknown roles", () => {
  30. const session = { role: "user", branchId: "NL01" };
  31. expect(canAccessBranch(session, "NL01")).toBe(false);
  32. });
  33. });
  34. describe("filterBranchesForSession", () => {
  35. it("returns [] when session is missing", () => {
  36. expect(filterBranchesForSession(null, ["NL01", "NL02"])).toEqual([]);
  37. });
  38. it("returns [] when branchIds is not an array", () => {
  39. expect(filterBranchesForSession({ role: "admin" }, null)).toEqual([]);
  40. expect(filterBranchesForSession({ role: "admin" }, "NL01")).toEqual([]);
  41. });
  42. it("for branch role: returns only own branch (if present)", () => {
  43. const session = { role: "branch", branchId: "NL01" };
  44. expect(filterBranchesForSession(session, ["NL01", "NL02"])).toEqual([
  45. "NL01",
  46. ]);
  47. expect(filterBranchesForSession(session, ["NL02", "NL03"])).toEqual([]);
  48. });
  49. it("for admin/dev: returns the full list", () => {
  50. const branches = ["NL01", "NL02", "NL03"];
  51. expect(filterBranchesForSession({ role: "admin" }, branches)).toEqual(
  52. branches
  53. );
  54. expect(filterBranchesForSession({ role: "dev" }, branches)).toEqual(
  55. branches
  56. );
  57. });
  58. it("does not mutate the input array", () => {
  59. const branches = ["NL01", "NL02"];
  60. const copy = [...branches];
  61. filterBranchesForSession({ role: "admin" }, branches);
  62. expect(branches).toEqual(copy);
  63. });
  64. });
  65. });