diff --git a/.agents/skills/jobindex-search/cli/tests/cli-contract.test.ts b/.agents/skills/jobindex-search/cli/tests/cli-contract.test.ts new file mode 100644 index 0000000..68d1cfa --- /dev/null +++ b/.agents/skills/jobindex-search/cli/tests/cli-contract.test.ts @@ -0,0 +1,38 @@ +import { describe, expect, test } from "bun:test"; +import { runCLI } from "./helpers"; + +describe("Jobindex CLI error contract", () => { + test("search without a query fails with JSON on stderr", async () => { + const result = await runCLI(["search"]); + + expect(result.exitCode).toBe(1); + expect(result.stdout).toBe(""); + expect(JSON.parse(result.stderr)).toEqual({ + error: "--query is required", + code: "MISSING_REQUIRED", + }); + }); + + test("detail without an ID fails before making a request", async () => { + const result = await runCLI(["detail"]); + + expect(result.exitCode).toBe(1); + expect(result.stdout).toBe(""); + expect(JSON.parse(result.stderr)).toEqual({ + error: "Job ID or URL is required", + code: "MISSING_REQUIRED", + }); + }); + + test("an invalid numeric option fails before making a request", async () => { + const result = await runCLI(["search", "--query", "test", "--page", "not-a-number"]); + const error = JSON.parse(result.stderr); + + expect(result.exitCode).toBe(1); + expect(result.stdout).toBe(""); + expect(error.ok).toBe(false); + expect(error.error.kind).toBe("validation"); + expect(error.error.option).toBe("page"); + expect(error.error.message).toContain("Expected number"); + }); +}); diff --git a/.agents/skills/jobnet-search/cli/tests/cli-contract.test.ts b/.agents/skills/jobnet-search/cli/tests/cli-contract.test.ts new file mode 100644 index 0000000..0dd1c67 --- /dev/null +++ b/.agents/skills/jobnet-search/cli/tests/cli-contract.test.ts @@ -0,0 +1,49 @@ +import { describe, expect, test } from "bun:test"; +import { runCLI } from "./helpers"; + +describe("Jobnet CLI error contract", () => { + test("detail without an ID fails with JSON on stderr", async () => { + const result = await runCLI(["detail"]); + + expect(result.exitCode).toBe(1); + expect(result.stdout).toBe(""); + expect(JSON.parse(result.stderr)).toEqual({ + error: "Job ad ID is required", + code: "MISSING_REQUIRED", + }); + }); + + test("occupations without a search string fails before making a request", async () => { + const result = await runCLI(["occupations"]); + + expect(result.exitCode).toBe(1); + expect(result.stdout).toBe(""); + expect(JSON.parse(result.stderr)).toEqual({ + error: "--search-string is required", + code: "MISSING_REQUIRED", + }); + }); + + test("suggestions without a query fails before making a request", async () => { + const result = await runCLI(["suggestions"]); + + expect(result.exitCode).toBe(1); + expect(result.stdout).toBe(""); + expect(JSON.parse(result.stderr)).toEqual({ + error: "--query is required", + code: "MISSING_REQUIRED", + }); + }); + + test("an invalid numeric option fails before making a request", async () => { + const result = await runCLI(["search", "--page", "not-a-number"]); + const error = JSON.parse(result.stderr); + + expect(result.exitCode).toBe(1); + expect(result.stdout).toBe(""); + expect(error.ok).toBe(false); + expect(error.error.kind).toBe("validation"); + expect(error.error.option).toBe("page"); + expect(error.error.message).toContain("Expected number"); + }); +});