| 1 | import assert from "node:assert/strict"; |
| 2 | import { test } from "node:test"; |
| 3 | |
| 4 | import type { Issue, Pull } from "@g1t/contracts"; |
| 5 | |
| 6 | import { delegateInput, fixUrlFor, noModelMessage, notStarted, queued, started } from "./delegate.ts"; |
| 7 | |
| 8 | const issue = { number: 41, title: "Retry webhooks" } as Issue; |
| 9 | |
| 10 | test("each refusal points at where it is fixed", () => { |
| 11 | const cases: [string, string | null][] = [ |
| 12 | ["not_paid", "https://g1t.sh/acme/-/billing"], |
| 13 | ["trial_used", "https://g1t.sh/acme/-/billing"], |
| 14 | ["limit", "https://g1t.sh/acme/-/billing#limit"], |
| 15 | ["issue_cap", "https://g1t.sh/acme/-/billing#caps"], |
| 16 | ["no_model", "https://g1t.sh/acme/-/integrations"], |
| 17 | // Nothing on a page fixes these: support does, or a minute's wait. |
| 18 | ["paused", null], |
| 19 | ["billing_unavailable", null], |
| 20 | ]; |
| 21 | for (const [code, url] of cases) assert.equal(fixUrlFor(code, "Acme"), url, code); |
| 22 | }); |
| 23 | |
| 24 | test("the issue is kept whatever became of the agent", () => { |
| 25 | const pull = { number: 42 } as Pull; |
| 26 | assert.deepEqual(started(issue, pull), { |
| 27 | issue, |
| 28 | pull, |
| 29 | agent: { status: "started", code: null, message: null, fixUrl: null }, |
| 30 | }); |
| 31 | const waiting = queued(issue, "Every agent slot is busy."); |
| 32 | assert.equal(waiting.issue, issue); |
| 33 | assert.equal(waiting.pull, null); |
| 34 | assert.equal(waiting.agent.status, "queued"); |
| 35 | const refused = notStarted(issue, "not_paid", "Agents need a paid workspace.", "acme"); |
| 36 | assert.equal(refused.issue.number, 41); |
| 37 | assert.deepEqual(refused.agent, { |
| 38 | status: "not_started", |
| 39 | code: "not_paid", |
| 40 | message: "Agents need a paid workspace.", |
| 41 | fixUrl: "https://g1t.sh/acme/-/billing", |
| 42 | }); |
| 43 | assert.match(noModelMessage("acme"), /Integrations/); |
| 44 | assert.match(noModelMessage("acme", true), /not open to the acme workspace yet.*Integrations/); |
| 45 | }); |
| 46 | |
| 47 | test("what to do is tidied, and checks may come one per line", () => { |
| 48 | assert.deepEqual(delegateInput({ title: " Retry webhooks ", body: " Use backoff. ", checks: "npm test\n\n npm run lint " }), { |
| 49 | title: "Retry webhooks", |
| 50 | body: "Use backoff.", |
| 51 | checks: ["npm test", "npm run lint"], |
| 52 | labels: [], |
| 53 | }); |
| 54 | assert.deepEqual(delegateInput({ title: 3, checks: ["cargo test", " "], labels: ["bug"] }), { |
| 55 | title: "", |
| 56 | body: "", |
| 57 | checks: ["cargo test"], |
| 58 | labels: ["bug"], |
| 59 | }); |
| 60 | }); |