Skip to content

Where people and agents ship software together. The open-source git platform for the whole job: issues, agents, checks and deploys to the edge.

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