// The claude login dialog's step logic. Run by `npm test`, which Node runs // with its built-in test runner and type stripping, so the `.ts` module is // imported as it is. import assert from "node:assert/strict"; import { test } from "node:test"; import { afterCode, afterStart, beginStart, claudeLoginPath, isLatestStart, leavesLoginRunning, pastedCode, startOutlivedDialog, } from "../src/agent/claude-login/ClaudeLoginSteps.ts"; test("the routes name the agent, escaped", () => { assert.equal(claudeLoginPath("atlas"), "/api/agents/atlas/claude-login"); assert.equal( claudeLoginPath("atlas", true), "/api/agents/atlas/claude-login/code", ); assert.equal(claudeLoginPath("a/b"), "/api/agents/a%2Fb/claude-login"); }); test("a started login asks for the code at its URL", () => { assert.deepEqual(afterStart({ url: "https://claude.ai/oauth/x" }), { step: "code", url: "https://claude.ai/oauth/x", }); }); test("a start that failed shows why and has no URL", () => { const problem = { detail: "no claude login minter is listening" }; assert.deepEqual(afterStart({ problem }), { step: "failed", problem }); }); test("an accepted code is stored; a refused one is a failure", () => { assert.deepEqual(afterCode(null), { step: "stored" }); const problem = { detail: "OAuth error: invalid code" }; assert.deepEqual(afterCode(problem), { step: "failed", problem }); }); test("only a login waiting for its code is stopped on close", () => { assert.equal(leavesLoginRunning({ step: "code", url: "https://u" }), true); assert.equal(leavesLoginRunning({ step: "starting" }), false); assert.equal( leavesLoginRunning({ step: "submitting", url: "https://u" }), false, ); assert.equal(leavesLoginRunning({ step: "stored" }), false); }); test("a start that answers after the dialog closed is stopped, unless it failed or was replaced", () => { assert.equal(startOutlivedDialog(false, null, true), true); assert.equal(startOutlivedDialog(true, null, true), false); assert.equal( startOutlivedDialog(false, { detail: "no minter" }, true), false, ); assert.equal(startOutlivedDialog(false, null, false), false); }); test("only an agent's newest start counts as the latest", () => { const first = beginStart("login-test-a"); assert.equal(isLatestStart("login-test-a", first), true); const second = beginStart("login-test-a"); assert.equal(isLatestStart("login-test-a", first), false); assert.equal(isLatestStart("login-test-a", second), true); // Another agent's starts are counted on their own. const other = beginStart("login-test-b"); assert.equal(isLatestStart("login-test-a", second), true); assert.equal(isLatestStart("login-test-b", other), true); }); test("a pasted code is trimmed, and a blank one is nothing", () => { assert.equal(pastedCode(" abc-def \n"), "abc-def"); assert.equal(pastedCode(" \n "), null); });