test(cli): cover Jobindex and Jobnet error contracts (#172)

Extend the offline CLI contract tests to the two remaining Danish
portal CLIs. Both implement the documented error contract (JSON
errors on stderr, exit 1) but had no test locking it in:

- jobindex-search: search without --query, detail without an ID,
  and bunli numeric-option validation (--page not-a-number)
- jobnet-search: detail without an ID, occupations without
  --search-string, suggestions without --query, and numeric-option
  validation

All asserted paths exit before any network request, matching the
no-live-portal-requests CI policy. Assertions were written against
observed CLI output, not assumed shapes.
This commit is contained in:
Ayobami Adegoke
2026-07-17 21:56:13 +02:00
committed by GitHub
parent fb91be7a0b
commit da2c3bbec9
2 changed files with 87 additions and 0 deletions
@@ -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");
});
});