Files
stef-openclaw-skills/tools/ai-cli-dispatch/tests/cli.test.ts
T
2026-05-18 17:45:27 -05:00

67 lines
2.0 KiB
TypeScript

import { describe, it } from "node:test";
import assert from "node:assert";
import { main, discoverClients, execClient } from "../src/cli.js";
import { ClientNotFoundError } from "../src/types.js";
describe("discoverClients", () => {
it("returns all three configured clients", () => {
const clients = discoverClients();
assert.strictEqual(clients.length, 3);
const names = clients.map((c) => c.name);
assert.deepStrictEqual(names, ["codex", "claude", "opencode"]);
});
it("returns ClientInfo with found boolean", () => {
const clients = discoverClients();
for (const c of clients) {
assert.strictEqual(typeof c.found, "boolean");
}
});
});
describe("main", () => {
it("returns 0 for --help", async () => {
const code = await main(["node", "cli.ts", "--help"]);
assert.strictEqual(code, 0);
});
it("returns 0 for list", async () => {
const code = await main(["node", "cli.ts", "list"]);
assert.strictEqual(code, 0);
});
it("returns 0 for list --json", async () => {
const code = await main(["node", "cli.ts", "list", "--json"]);
assert.strictEqual(code, 0);
});
it("returns 1 for exec without --client", async () => {
const code = await main(["node", "cli.ts", "exec", "--prompt", "hello"]);
assert.strictEqual(code, 1);
});
it("returns 1 for exec without --prompt", async () => {
const code = await main(["node", "cli.ts", "exec", "--client", "codex"]);
assert.strictEqual(code, 1);
});
it("returns 1 for unknown command", async () => {
const code = await main(["node", "cli.ts", "bogus"]);
assert.strictEqual(code, 1);
});
it("returns 1 when no command is given", async () => {
const code = await main(["node", "cli.ts"]);
assert.strictEqual(code, 1);
});
});
describe("execClient", () => {
it("throws ClientNotFoundError when client path is empty", () => {
assert.throws(
() => execClient("codex", "test prompt", ""),
(err: unknown) => err instanceof ClientNotFoundError
);
});
});