Skip to content
37 linesCodeBlameRaw
1import assert from "node:assert/strict";
2import { test } from "node:test";
3
4import { CODING_AGENTS, codingAgentById, codingAgentFor } from "./coding-agents.ts";
5
6test("a coding agent is found by the address on its commits, not by its name", () => {
7 assert.equal(codingAgentFor("noreply@anthropic.com")?.id, "claude");
8 assert.equal(codingAgentFor(" NoReply@Anthropic.com ")?.id, "claude");
9 assert.equal(codingAgentFor("209825114+claude[bot]@users.noreply.github.com")?.id, "claude");
10 assert.equal(codingAgentFor("198982749+Copilot@users.noreply.github.com")?.id, "copilot");
11 assert.equal(codingAgentFor("49699333+dependabot[bot]@users.noreply.github.com")?.id, "dependabot");
12 assert.equal(codingAgentFor("41898282+github-actions[bot]@users.noreply.github.com")?.id, "github-actions");
13 assert.equal(codingAgentFor("cursoragent@cursor.com")?.id, "cursor");
14 assert.equal(codingAgentFor("ada@example.com"), null);
15 assert.equal(codingAgentFor("123+ada@users.noreply.github.com"), null);
16 assert.equal(codingAgentFor(""), null);
17 assert.equal(codingAgentFor(null), null);
18});
19
20test("every agent has a unique id, lowercase addresses and logins, and a mark colour that is a hex or none", () => {
21 const ids = new Set<string>();
22 const addresses = new Set<string>();
23 for (const agent of CODING_AGENTS) {
24 assert.ok(!ids.has(agent.id), agent.id);
25 ids.add(agent.id);
26 assert.ok(agent.emails.length + agent.logins.length > 0, `${agent.id} matches nothing`);
27 for (const value of [...agent.emails, ...agent.logins]) {
28 assert.equal(value, value.toLowerCase(), value);
29 assert.ok(!addresses.has(value), `${value} is listed twice`);
30 addresses.add(value);
31 }
32 assert.ok(agent.color === null || /^[0-9A-F]{6}$/.test(agent.color), agent.id);
33 assert.ok(agent.url.startsWith("https://"), agent.id);
34 }
35 assert.equal(codingAgentById("claude")?.name, "Claude");
36 assert.equal(codingAgentById("nobody"), null);
37});