File
Blob: tests/shared/entitlements/member-management.test.ts
| 1 | import { describe, expect, it } from "vitest"; |
| 2 | import { canChangeMemberRole, canLeaveWorkspace, canRemoveMember } from "@/shared/entitlements"; |
| 3 | |
| 4 | describe("member management entitlements", () => { |
| 5 | describe("canChangeMemberRole", () => { |
| 6 | it("lets the owner promote to any role including admin", () => { |
| 7 | expect(canChangeMemberRole("owner", "member", "admin")).toBe(true); |
| 8 | expect(canChangeMemberRole("owner", "guest", "member")).toBe(true); |
| 9 | expect(canChangeMemberRole("owner", "admin", "member")).toBe(true); |
| 10 | }); |
| 11 | |
| 12 | it("blocks admins from promoting anyone to admin", () => { |
| 13 | expect(canChangeMemberRole("admin", "member", "admin")).toBe(false); |
| 14 | }); |
| 15 | |
| 16 | it("lets admins demote members and guests to non-admin roles", () => { |
| 17 | expect(canChangeMemberRole("admin", "member", "guest")).toBe(true); |
| 18 | expect(canChangeMemberRole("admin", "guest", "member")).toBe(true); |
| 19 | }); |
| 20 | |
| 21 | it("never allows owner role to be touched", () => { |
| 22 | expect(canChangeMemberRole("owner", "owner", "admin")).toBe(false); |
| 23 | expect(canChangeMemberRole("admin", "owner", "member")).toBe(false); |
| 24 | }); |
| 25 | |
| 26 | it("blocks members, guests, and non-members from changing roles", () => { |
| 27 | expect(canChangeMemberRole("member", "guest", "member")).toBe(false); |
| 28 | expect(canChangeMemberRole("guest", "member", "guest")).toBe(false); |
| 29 | expect(canChangeMemberRole("none", "member", "guest")).toBe(false); |
| 30 | }); |
| 31 | }); |
| 32 | |
| 33 | describe("canRemoveMember", () => { |
| 34 | it("lets anyone except the owner remove themselves", () => { |
| 35 | expect(canRemoveMember("admin", "admin", true)).toBe(true); |
| 36 | expect(canRemoveMember("member", "member", true)).toBe(true); |
| 37 | expect(canRemoveMember("guest", "guest", true)).toBe(true); |
| 38 | expect(canRemoveMember("owner", "owner", true)).toBe(false); |
| 39 | expect(canRemoveMember("none", "none", true)).toBe(false); |
| 40 | }); |
| 41 | |
| 42 | it("lets the owner remove anyone except the owner", () => { |
| 43 | expect(canRemoveMember("owner", "admin", false)).toBe(true); |
| 44 | expect(canRemoveMember("owner", "member", false)).toBe(true); |
| 45 | expect(canRemoveMember("owner", "guest", false)).toBe(true); |
| 46 | expect(canRemoveMember("owner", "owner", false)).toBe(false); |
| 47 | }); |
| 48 | |
| 49 | it("blocks admins from removing other admins but allows removing members/guests", () => { |
| 50 | expect(canRemoveMember("admin", "admin", false)).toBe(false); |
| 51 | expect(canRemoveMember("admin", "member", false)).toBe(true); |
| 52 | expect(canRemoveMember("admin", "guest", false)).toBe(true); |
| 53 | }); |
| 54 | |
| 55 | it("blocks members, guests, and non-members from removing others", () => { |
| 56 | expect(canRemoveMember("member", "guest", false)).toBe(false); |
| 57 | expect(canRemoveMember("guest", "member", false)).toBe(false); |
| 58 | expect(canRemoveMember("none", "member", false)).toBe(false); |
| 59 | }); |
| 60 | }); |
| 61 | |
| 62 | describe("canLeaveWorkspace", () => { |
| 63 | it("allows any non-owner member", () => { |
| 64 | expect(canLeaveWorkspace("admin")).toBe(true); |
| 65 | expect(canLeaveWorkspace("member")).toBe(true); |
| 66 | expect(canLeaveWorkspace("guest")).toBe(true); |
| 67 | }); |
| 68 | |
| 69 | it("blocks the owner and non-members", () => { |
| 70 | expect(canLeaveWorkspace("owner")).toBe(false); |
| 71 | expect(canLeaveWorkspace("none")).toBe(false); |
| 72 | }); |
| 73 | }); |
| 74 | }); |