Skip to content
30 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.

The runner base keeps its old comment, so the pushed base image still matches its folder1import assert from "node:assert/strict";
2import { test } from "node:test";
3
4import type { User } from "@g1t/contracts";
5
6import { can, needs, permission } from "../../../packages/contracts/src/access.ts";
7import { NEEDS, repoRef } from "./access.ts";
8
9const row = (isPrivate: boolean) => ({ repo_id: "repo_api", repo_namespace: "acme", repo_private: isPrivate ? 1 : 0 });
10const person = (extra: Partial<User>): User => ({ id: "u", username: "u", kind: "user", verified: true, workspaces: [], ...extra }) as User;
11
12test("a private project is seen by those who can read its repository", () => {
13 const none = person({ workspaces: [{ slug: "acme", role: "member", base_permission: "none" }] });
14 assert.equal(permission(none, repoRef(row(true))), null, "a member with no base permission does not see it");
15 assert.ok(permission(none, repoRef(row(false))), "but sees a public one");
16 const granted = person({ workspaces: [{ slug: "acme", role: "member", base_permission: "none" }], grants: [{ repo_id: "repo_api", workspace: "acme", role: "read" }] });
17 assert.equal(permission(granted, repoRef(row(true))), "read");
18 const outside = person({ grants: [{ repo_id: "repo_api", workspace: "acme", role: "read" }] });
19 assert.equal(permission(outside, repoRef(row(true))), "read", "an outside collaborator sees the project of a repository shared with them");
20});
21
Projects no longer depend on each other: the dependsOn relation, its settings page (old links redirect), the overview card, a pull request's Affects panel and preview stacks, reference variables and agents' notes on what a project uses are gone; the table is dropped in a later deploy22test("changing a project takes Maintain", () => {
The runner base keeps its old comment, so the pushed base image still matches its folder23 const member = person({ workspaces: [{ slug: "acme", role: "member" }] });
Projects no longer depend on each other: the dependsOn relation, its settings page (old links redirect), the overview card, a pull request's Affects panel and preview stacks, reference variables and agents' notes on what a project uses are gone; the table is dropped in a later deploy24 assert.ok(!can(member, repoRef(row(true)), NEEDS.update), "Write, the default base permission, is not enough");
The runner base keeps its old comment, so the pushed base image still matches its folder25 assert.equal(needs(NEEDS.update), "Needs the Maintain role or higher.");
26 const maintainer = person({ grants: [{ repo_id: "repo_api", workspace: "acme", role: "maintain" }] });
Projects no longer depend on each other: the dependsOn relation, its settings page (old links redirect), the overview card, a pull request's Affects panel and preview stacks, reference variables and agents' notes on what a project uses are gone; the table is dropped in a later deploy27 for (const capability of [NEEDS.update, NEEDS.create]) assert.ok(can(maintainer, repoRef(row(true)), capability));
The runner base keeps its old comment, so the pushed base image still matches its folder28 const owner = person({ workspaces: [{ slug: "acme", role: "owner" }] });
29 assert.ok(can(owner, repoRef(row(true)), NEEDS.create));
30});

This file's history is long; its oldest lines are credited to the oldest commit read.