feat(S-401): Test-drive and implement src/dispatch.ts
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
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");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user