Skip to content
81 linesCodeBlameRaw
1import assert from "node:assert/strict";
2import { test } from "node:test";
3
4import { capShare, formatCap, lines, settingsFromForm, tri, workflowDomainLine, workflowDomains } from "./guardrails.ts";
5
6const catalog = {
7 registries: ["npm", "pypi", "crates"],
8 kinds: ["implement", "review"] as const,
9};
10
11function form(entries: Record<string, string>): FormData {
12 const data = new FormData();
13 for (const [key, value] of Object.entries(entries)) data.set(key, value);
14 return data;
15}
16
17test("workflow-only domains are read one per line, and written back the same way", () => {
18 const read = workflowDomains(
19 " api.cloudflare.com | deploy.yml | production \n\n*.example.com\nhooks.example.com | | staging, production\nci.example.com | ci.yml, release.yml\n | deploy.yml",
20 );
21 assert.deepEqual(read, [
22 { domain: "api.cloudflare.com", workflows: ["deploy.yml"], environments: ["production"] },
23 { domain: "*.example.com", workflows: [], environments: [] },
24 { domain: "hooks.example.com", workflows: [], environments: ["staging", "production"] },
25 { domain: "ci.example.com", workflows: ["ci.yml", "release.yml"], environments: [] },
26 ]);
27 assert.deepEqual(read.map(workflowDomainLine), [
28 "api.cloudflare.com | deploy.yml | production",
29 "*.example.com",
30 "hooks.example.com | | staging, production",
31 "ci.example.com | ci.yml, release.yml",
32 ]);
33 const settings = settingsFromForm(form({ workflowDomains: "api.cloudflare.com | deploy.yml | production" }), catalog);
34 assert.deepEqual(settings.workflowDomains, [{ domain: "api.cloudflare.com", workflows: ["deploy.yml"], environments: ["production"] }]);
35});
36
37test("an untouched form inherits everything", () => {
38 const settings = settingsFromForm(form({ restrictNetwork: "inherit", registries: "inherit" }), catalog);
39 assert.equal(settings.restrictNetwork, null);
40 assert.equal(settings.registries, null);
41 assert.deepEqual(settings.minutes, {});
42 assert.deepEqual(settings.domains, []);
43});
44
45test("choices of a level's own are kept", () => {
46 const settings = settingsFromForm(
47 form({
48 restrictNetwork: "off",
49 registries: "custom",
50 "registry:npm": "on",
51 "registry:crates": "on",
52 "minutes:implement": "45",
53 "minutes:review": "",
54 domains: "api.stripe.com\n\n api.stripe.com \r\n*.example.com",
55 }),
56 catalog,
57 );
58 assert.equal(settings.restrictNetwork, false);
59 assert.deepEqual(settings.registries, ["npm", "crates"]);
60 assert.deepEqual(settings.minutes, { implement: 45 });
61 assert.deepEqual(settings.domains, ["api.stripe.com", "*.example.com"]);
62});
63
64test("nonsense is passed on for the service to refuse", () => {
65 const settings = settingsFromForm(form({ "minutes:implement": "soon" }), catalog);
66 assert.equal(settings.minutes?.implement, 0);
67});
68
69test("a cap reads as dollars, or no cap", () => {
70 assert.equal(formatCap(null), "no cap");
71 assert.equal(formatCap(5), "$5.00");
72});
73
74test("helpers", () => {
75 assert.equal(tri(undefined), "inherit");
76 assert.equal(tri(false), "off");
77 assert.deepEqual(lines(" a \nb\na"), ["a", "b"]);
78 assert.equal(capShare(1, 4), 0.25);
79 assert.equal(capShare(9, 4), 1);
80 assert.equal(capShare(1, null), null);
81});