| 1 | import assert from "node:assert/strict"; |
| 2 | import { test } from "node:test"; |
| 3 | |
| 4 | import type { DirectoryPerson, DirectoryTeam, PeopleDirectory } from "@g1t/contracts"; |
| 5 | |
| 6 | import { codeAccessWords, directoryEntries, leads, ownsFromText } from "./people.ts"; |
| 7 | |
| 8 | const person = (username: string, extra: Partial<DirectoryPerson> = {}): DirectoryPerson => ({ |
| 9 | user_id: `usr_${username}`, |
| 10 | username, |
| 11 | name: null, |
| 12 | avatar: null, |
| 13 | bio: null, |
| 14 | location: null, |
| 15 | pronouns: null, |
| 16 | timezone: null, |
| 17 | role: "member", |
| 18 | title: null, |
| 19 | owns: [], |
| 20 | joined_at: "2026-10-01T00:00:00Z", |
| 21 | ...extra, |
| 22 | }); |
| 23 | |
| 24 | const team = (slug: string, name: string, extra: Partial<DirectoryTeam> = {}): DirectoryTeam => ({ |
| 25 | slug, |
| 26 | name, |
| 27 | description: null, |
| 28 | visibility: "visible", |
| 29 | parent: null, |
| 30 | lead: null, |
| 31 | channel: null, |
| 32 | budget_micros: null, |
| 33 | people: [], |
| 34 | agent_ids: [], |
| 35 | repos_count: 0, |
| 36 | ...extra, |
| 37 | }); |
| 38 | |
| 39 | const directory: PeopleDirectory = { |
| 40 | people: [ |
| 41 | person("chase", { name: "Chase Pierce", title: "Founder", role: "owner" }), |
| 42 | person("sofia", { name: "Sofia Reyes", title: "Head of Sales", owns: ["the forecast"] }), |
| 43 | person("jordan", { name: "Jordan Lee", title: "Account Executive", owns: ["Halcyon", "Bluebird"] }), |
| 44 | person("kai", { name: "Kai Nakamura", title: "Product Designer" }), |
| 45 | ], |
| 46 | teams: [ |
| 47 | team("sales", "Sales", { |
| 48 | lead: { kind: "user", username: "sofia", name: "Sofia Reyes", avatar: null }, |
| 49 | people: [ |
| 50 | { username: "sofia", role: "maintainer" }, |
| 51 | { username: "jordan", role: "member" }, |
| 52 | ], |
| 53 | agent_ids: ["agt_david"], |
| 54 | repos_count: 0, |
| 55 | }), |
| 56 | team("design", "Design", { people: [{ username: "kai", role: "maintainer" }], repos_count: 2 }), |
| 57 | team("night-shift", "Night shift", { lead: { kind: "agent", agent_id: "agt_atlas" }, agent_ids: ["agt_atlas", "agt_sentinel", "agt_david"] }), |
| 58 | ], |
| 59 | base_permission: "read", |
| 60 | can_manage: true, |
| 61 | }; |
| 62 | |
| 63 | test("a team's lead is a person; an old agent lead is nobody's", () => { |
| 64 | assert.equal(leads(directory.teams[0]!.lead, { username: "sofia" }), true); |
| 65 | assert.equal(leads(directory.teams[0]!.lead, { username: "jordan" }), false); |
| 66 | assert.equal(leads(directory.teams[2]!.lead, { username: "atlas" }), false); |
| 67 | assert.equal(leads(null, { username: "sofia" }), false); |
| 68 | }); |
| 69 | |
| 70 | test("the directory lists people, in one search", () => { |
| 71 | const names = (query: string) => directoryEntries(directory, query).map((e) => e.person.username); |
| 72 | assert.deepEqual(names(""), ["chase", "sofia", "jordan", "kai"]); |
| 73 | assert.deepEqual(names("sales"), ["sofia", "jordan"]); |
| 74 | assert.deepEqual(names("halcyon"), ["jordan"]); |
| 75 | assert.deepEqual(names("owner"), ["chase"]); |
| 76 | // A team with no people on it is no one's team in the directory. |
| 77 | assert.deepEqual(names("night shift"), []); |
| 78 | assert.equal(names("nobody here").length, 0); |
| 79 | // Every entry is a person with their teams. |
| 80 | const sofia = directoryEntries(directory, "sofia")[0]!; |
| 81 | assert.deepEqual(Object.keys(sofia), ["person", "teams"]); |
| 82 | assert.deepEqual(sofia.teams.map((t) => t.slug), ["sales"]); |
| 83 | }); |
| 84 | |
| 85 | test("forms read plainly", () => { |
| 86 | assert.deepEqual(ownsFromText("storefront\n the release process ,, billing"), ["storefront", "the release process", "billing"]); |
| 87 | }); |
| 88 | |
| 89 | test("access to Code says where it comes from", () => { |
| 90 | assert.equal(codeAccessWords({ role: "owner" }, "read", []).summary, "Admin on every repository, as an owner"); |
| 91 | const kai = codeAccessWords({ role: "member" }, "read", [directory.teams[1]!]); |
| 92 | assert.equal(kai.summary, "Read on every repository, the workspace's base permission"); |
| 93 | assert.deepEqual(kai.through, ["Roles on 2 repositories through Design"]); |
| 94 | assert.equal(codeAccessWords({ role: "member" }, "none", []).summary, "Only repositories they're given a role on"); |
| 95 | }); |