Skip to content
File

Blob: tests/shared/entitlements/member-management.test.ts

typescript75 lines
1import { describe, expect, it } from "vitest";
2import { canChangeMemberRole, canLeaveWorkspace, canRemoveMember } from "@/shared/entitlements";
3 
4describe("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});