import { describe, it } from "node:test"; import assert from "node:assert"; import { resolveClient } from "../src/dispatch.js"; import type { ClientName } from "../src/types.js"; describe("resolveClient", () => { it('returns "codex" when prompt contains "use codex"', () => { const result = resolveClient("use codex to refactor this"); assert.strictEqual(result, "codex"); }); it('returns "claude" when prompt contains "tell claude to..."', () => { const result = resolveClient("tell claude to review my code"); assert.strictEqual(result, "claude"); }); it('returns "opencode" when prompt contains "run with opencode"', () => { const result = resolveClient("run with opencode"); assert.strictEqual(result, "opencode"); }); it('returns "opencode" when prompt contains "open code"', () => { const result = resolveClient("open code this file"); assert.strictEqual(result, "opencode"); }); it("returns null when no keyword matches and no default is configured", () => { const result = resolveClient("hello world"); assert.strictEqual(result, null); }); it("returns defaultClient when no keyword matches", () => { const result = resolveClient("hello world", { defaultClient: "claude" }); assert.strictEqual(result, "claude"); }); it("prefers --client flag over keyword parsing", () => { const result = resolveClient("use codex for this", { client: "claude" }); assert.strictEqual(result, "claude"); }); it("prefers --client flag over defaultClient", () => { const result = resolveClient("hello world", { client: "opencode", defaultClient: "codex", }); assert.strictEqual(result, "opencode"); }); it("handles uppercase CODEX", () => { const result = resolveClient("Use CODEX please"); assert.strictEqual(result, "codex"); }); it("handles mixed-case Claude", () => { const result = resolveClient("Tell Claude to fix this"); assert.strictEqual(result, "claude"); }); it("returns first match when multiple clients are mentioned", () => { const result = resolveClient("ask claude or codex to help"); assert.strictEqual(result, "claude"); }); it("returns null for empty prompt with no default", () => { const result = resolveClient(""); assert.strictEqual(result, null); }); it("returns defaultClient for empty prompt", () => { const result = resolveClient("", { defaultClient: "codex" }); assert.strictEqual(result, "codex"); }); it("validates --client flag value", () => { // Invalid client flag should fall back to keyword/default behavior const result = resolveClient("use codex", { client: "invalid" as ClientName, }); // If client flag is invalid, we should fall back to keyword matching assert.strictEqual(result, "codex"); }); });