Skip to content
76 linesCodeBlameRaw

Pick any line to see why it is the way it is: the commit, the pull request and issue it came from, and what the agent was thinking.

Docs: a workspace knowledge base people and agents write together1import assert from "node:assert/strict";
2import { test } from "node:test";
3
4import { agentAbilities, atLeast, leavesNoManager, readableByAll, 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 = { ...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
32test("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
38test("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
44test("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
53test("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
61test("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
67test("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});