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