| 1 | import assert from "node:assert/strict"; |
| 2 | import { test } from "node:test"; |
| 3 | |
| 4 | import { agentAbilities, atLeast, leavesNoManager, readableByAll, readableByWorkspace, roleOf, type Person, type SpaceRules } from "./access.ts"; |
| 5 | |
| 6 | const ana: Person = { user_id: "u1", owner: false, teams: new Set(["web"]) }; |
| 7 | const bo: Person = { user_id: "u2", owner: false, teams: new Set() }; |
| 8 | const owner: Person = { user_id: "u9", owner: true, teams: new Set() }; |
| 9 | |
| 10 | const workspace: SpaceRules = { kind: "workspace", team: null, default_role: "edit", members: [] }; |
| 11 | const team: SpaceRules = { kind: "team", team: "web", default_role: "comment", members: [] }; |
| 12 | const secret: SpaceRules = { kind: "private", team: null, default_role: null, members: [{ principal: "user:u1", role: "manage" }] }; |
| 13 | |
| 14 | test("workspace spaces give every member their base role", () => { |
| 15 | assert.equal(roleOf(workspace, ana), "edit"); |
| 16 | assert.equal(roleOf(workspace, bo), "edit"); |
| 17 | }); |
| 18 | |
| 19 | test("team spaces give the team's members their base role, and nobody else anything", () => { |
| 20 | assert.equal(roleOf(team, ana), "comment"); |
| 21 | assert.equal(roleOf(team, bo), null); |
| 22 | }); |
| 23 | |
| 24 | test("a listing raises a role but never lowers it", () => { |
| 25 | const raised: SpaceRules = { ...team, members: [{ principal: "user:u1", role: "manage" }, { principal: "user:u2", role: "view" }] }; |
| 26 | assert.equal(roleOf(raised, ana), "manage"); |
| 27 | assert.equal(roleOf(raised, bo), "view"); |
| 28 | const lowered: SpaceRules = { ...workspace, members: [{ principal: "user:u2", role: "view" }] }; |
| 29 | assert.equal(roleOf(lowered, bo), "edit"); |
| 30 | }); |
| 31 | |
| 32 | test("a team listed on a space reaches its members", () => { |
| 33 | const listed: SpaceRules = { ...secret, members: [{ principal: "team:WEB", role: "edit" }] }; |
| 34 | assert.equal(roleOf(listed, ana), "edit"); |
| 35 | assert.equal(roleOf(listed, bo), null); |
| 36 | }); |
| 37 | |
| 38 | test("owners manage workspace and team spaces, but a private space is its members' alone", () => { |
| 39 | assert.equal(roleOf(team, owner), "manage"); |
| 40 | assert.equal(roleOf(secret, owner), null); |
| 41 | assert.equal(roleOf(secret, ana), "manage"); |
| 42 | }); |
| 43 | |
| 44 | test("an audience reads a space only if every person in it can", () => { |
| 45 | assert.equal(readableByAll(team, [ana]), true); |
| 46 | assert.equal(readableByAll(team, [ana, bo]), false); |
| 47 | assert.equal(readableByAll(workspace, [ana, bo]), true); |
| 48 | assert.equal(readableByWorkspace(workspace), true); |
| 49 | assert.equal(readableByWorkspace(team), false); |
| 50 | assert.equal(readableByWorkspace({ ...workspace, default_role: null }), false); |
| 51 | }); |
| 52 | |
| 53 | test("an agent is capped by the person it acts for and by the space's agent mode", () => { |
| 54 | assert.deepEqual(agentAbilities("edit", "suggest"), { read: true, suggest: true, edit: false }); |
| 55 | assert.deepEqual(agentAbilities("edit", "edit"), { read: true, suggest: true, edit: true }); |
| 56 | assert.deepEqual(agentAbilities("view", "edit"), { read: true, suggest: false, edit: false }); |
| 57 | assert.deepEqual(agentAbilities("comment", "edit"), { read: true, suggest: true, edit: false }); |
| 58 | assert.deepEqual(agentAbilities(null, "edit"), { read: false, suggest: false, edit: false }); |
| 59 | }); |
| 60 | |
| 61 | test("roles order view < comment < edit < manage", () => { |
| 62 | assert.equal(atLeast("comment", "view"), true); |
| 63 | assert.equal(atLeast("comment", "edit"), false); |
| 64 | assert.equal(atLeast(null, "view"), false); |
| 65 | }); |
| 66 | |
| 67 | test("a private space keeps someone who can manage it", () => { |
| 68 | const members = [ |
| 69 | { principal: "user:u1", role: "manage" as const }, |
| 70 | { principal: "user:u2", role: "edit" as const }, |
| 71 | ]; |
| 72 | assert.equal(leavesNoManager("private", members, "user:u1", null), true); |
| 73 | assert.equal(leavesNoManager("private", members, "user:u1", "edit"), true); |
| 74 | assert.equal(leavesNoManager("private", members, "user:u2", null), false); |
| 75 | assert.equal(leavesNoManager("workspace", members, "user:u1", null), false); |
| 76 | }); |