mirror of
https://github.com/MadsLorentzen/ai-job-search.git
synced 2026-09-17 00:26:26 +00:00
fix(cli): reject negative and fractional filter flags in Danish portal CLIs (#281)
Follow-up to #191: it tightened page/limit/per-page, but five filter flags still used bare z.coerce.number() and accepted negative and fractional values that were sent raw to the portals (e.g. --jobage=-5, --radius=2.5). jobindex --jobage, jobnet --radius, jobdanmark --category/--jobtitle-id and jobbank --company now use .int().min(1), mirroring #191. Adds 8 network-free regression tests (a negative and a fractional case per flag) using the same validation-error pattern as the existing cli-flag-validation suites.
This commit is contained in:
@@ -87,10 +87,10 @@ export const search = defineCommand({
|
||||
text: option(z.string().optional(), {
|
||||
description: "Free-text keyword search (job title, keyword)",
|
||||
}),
|
||||
category: option(z.coerce.number().optional(), {
|
||||
category: option(z.coerce.number().int().min(1).optional(), {
|
||||
description: "Category ID",
|
||||
}),
|
||||
"jobtitle-id": option(z.coerce.number().optional(), {
|
||||
"jobtitle-id": option(z.coerce.number().int().min(1).optional(), {
|
||||
description: "Job title ID from autocomplete results",
|
||||
}),
|
||||
municipality: option(z.string().optional(), {
|
||||
|
||||
@@ -4,7 +4,9 @@ import { runCLI } from "./helpers";
|
||||
// All cases fail schema validation (or the required-flag guard) before any
|
||||
// network request, so the suite is network-free. Regression context: a bare
|
||||
// z.coerce.number() accepted --limit=-1, and slice(0, -1) then silently
|
||||
// dropped the last result instead of erroring.
|
||||
// dropped the last result instead of erroring. Filter flags (--category,
|
||||
// --jobtitle-id) also accepted negative and fractional values that were
|
||||
// sent raw to the portal.
|
||||
|
||||
function expectValidationError(result: { exitCode: number; stdout: string; stderr: string }, option: string) {
|
||||
expect(result.exitCode).toBe(1);
|
||||
@@ -27,6 +29,18 @@ describe("Jobdanmark CLI flag validation", () => {
|
||||
expectValidationError(result, "page");
|
||||
});
|
||||
|
||||
test("search --category=-1 is rejected", async () => {
|
||||
const result = await runCLI(["search", "--category=-1"]);
|
||||
expectValidationError(result, "category");
|
||||
expect(JSON.parse(result.stderr).error.message).toContain("greater than or equal to 1");
|
||||
});
|
||||
|
||||
test("search --jobtitle-id=1.5 is rejected as non-integer", async () => {
|
||||
const result = await runCLI(["search", "--jobtitle-id=1.5"]);
|
||||
expectValidationError(result, "jobtitle-id");
|
||||
expect(JSON.parse(result.stderr).error.message).toContain("Expected integer");
|
||||
});
|
||||
|
||||
test("search --limit=1.5 is rejected as non-integer", async () => {
|
||||
const result = await runCLI(["search", "--limit=1.5"]);
|
||||
expectValidationError(result, "limit");
|
||||
|
||||
Reference in New Issue
Block a user