testServerAccess

tcmts.cli.sync.testServerAccess · #yjusu75m · term

import { authorFor, branchFor, callerOf, refusal, tokenDigest } from "#codebase/tcmts/cli/sync";
import type { Caller } from "#codebase/tcmts/cli/sync";
import assert from "node:assert/strict";

export const testServerAccess = () => {
  const users = [{ handle: "ada", digest: tokenDigest("ada-token"), added: 0 }];
  assert.deepEqual(callerOf(users, "Bearer main-token", "main-token", false), {
    role: "maintainer",
  });
  assert.deepEqual(callerOf(users, "Bearer ada-token", "main-token", false), {
    role: "contributor",
    handle: "ada",
  });
  assert.equal(
    callerOf(users, "Bearer nope", "main-token", true),
    undefined,
    "a wrong token is no one, public or not",
  );
  assert.equal(callerOf(users, undefined, "main-token", false), undefined);
  assert.deepEqual(callerOf(users, undefined, "main-token", true), { role: "reader" });

  const ada: Caller = { role: "contributor", handle: "ada" };
  const reader: Caller = { role: "reader" };
  const owners: Record<number, string> = { 1: "@ada/faster", 2: "@grace/x" };
  const refused = (c: Caller, route: string, body: Record<string, unknown> = {}) =>
    refusal(c, route, body, (id) => owners[id]);

  for (const route of ["missing", "get", "branch", "contributions", "contribution", "whoami"])
    assert.equal(refused(reader, route), undefined, `anyone reads: ${route}`);
  assert.match(refused(reader, "put")!, /put needs a token/);
  assert.match(refused(reader, "comment")!, /needs a token/);
  for (const route of [
    "run",
    "merge-contribution",
    "put-results",
    "put-lints",
    "put-releases",
    "users",
    "add-user",
  ]) {
    assert.match(refused(ada, route)!, /only the server's maintainer can/, route);
    assert.equal(refused({ role: "maintainer" }, route), undefined, route);
  }
  assert.equal(refused(ada, "set-branch", { name: "@ada/faster" }), undefined);
  assert.match(
    refused(ada, "set-branch", { name: "main" })!,
    /can't push main: contributors push branches under @ada\//,
  );
  assert.match(refused(ada, "set-branch", { name: "@grace/x" })!, /can't push @grace\/x/);
  assert.match(
    refused(ada, "set-branch", { name: "@ada/" })!,
    /can't push/,
    "a branch under the prefix, not the prefix",
  );
  assert.match(refused(ada, "set-branch", { name: "@adam/x" })!, /can't push/);
  assert.equal(
    refused(ada, "open-contribution", { source: "@ada/faster", target: "main" }),
    undefined,
  );
  assert.match(refused(ada, "open-contribution", { source: "faster" })!, /can't propose faster/);
  assert.equal(refused(ada, "close-contribution", { id: 1 }), undefined);
  assert.match(refused(ada, "close-contribution", { id: 2 })!, /can't close #2: it isn't theirs/);
  assert.match(refused(ada, "reopen-contribution", { id: 3 })!, /can't reopen #3/);

  assert.equal(branchFor(ada, "faster"), "@ada/faster");
  assert.equal(branchFor(ada, "@ada/faster"), "@ada/faster");
  assert.equal(branchFor({ role: "maintainer" }, "faster"), "faster");
  assert.equal(authorFor(ada, "grace"), "@ada", "a contributor signs as themselves");
  assert.equal(authorFor({ role: "maintainer" }, "grace"), "grace");
}

uses