test(cli): dedupe cron add/edit assertion harness

This commit is contained in:
Peter Steinberger
2026-02-18 13:37:39 +00:00
parent 57083e4220
commit c7bfa818ea

View File

@@ -42,6 +42,15 @@ type CronUpdatePatch = {
}; };
}; };
type CronAddParams = {
schedule?: { kind?: string; staggerMs?: number };
payload?: { model?: string; thinking?: string };
delivery?: { mode?: string };
deleteAfterRun?: boolean;
agentId?: string;
sessionTarget?: string;
};
function buildProgram() { function buildProgram() {
const program = new Command(); const program = new Command();
program.exitOverride(); program.exitOverride();
@@ -62,6 +71,14 @@ async function runCronEditAndGetPatch(editArgs: string[]): Promise<CronUpdatePat
return (updateCall?.[2] ?? {}) as CronUpdatePatch; return (updateCall?.[2] ?? {}) as CronUpdatePatch;
} }
async function runCronAddAndGetParams(addArgs: string[]): Promise<CronAddParams> {
resetGatewayMock();
const program = buildProgram();
await program.parseAsync(["cron", "add", ...addArgs], { from: "user" });
const addCall = callGatewayFromCli.mock.calls.find((call) => call[0] === "cron.add");
return (addCall?.[2] ?? {}) as CronAddParams;
}
describe("cron cli", () => { describe("cron cli", () => {
it("trims model and thinking on cron add", { timeout: 60_000 }, async () => { it("trims model and thinking on cron add", { timeout: 60_000 }, async () => {
resetGatewayMock(); resetGatewayMock();
@@ -208,48 +225,28 @@ describe("cron cli", () => {
}); });
it("omits empty model and thinking on cron edit", async () => { it("omits empty model and thinking on cron edit", async () => {
resetGatewayMock(); const patch = await runCronEditAndGetPatch([
"--message",
const program = buildProgram(); "hello",
"--model",
await program.parseAsync( " ",
["cron", "edit", "job-1", "--message", "hello", "--model", " ", "--thinking", " "], "--thinking",
{ from: "user" }, " ",
); ]);
const updateCall = callGatewayFromCli.mock.calls.find((call) => call[0] === "cron.update");
const patch = updateCall?.[2] as {
patch?: { payload?: { model?: string; thinking?: string } };
};
expect(patch?.patch?.payload?.model).toBeUndefined(); expect(patch?.patch?.payload?.model).toBeUndefined();
expect(patch?.patch?.payload?.thinking).toBeUndefined(); expect(patch?.patch?.payload?.thinking).toBeUndefined();
}); });
it("trims model and thinking on cron edit", async () => { it("trims model and thinking on cron edit", async () => {
resetGatewayMock(); const patch = await runCronEditAndGetPatch([
"--message",
const program = buildProgram(); "hello",
"--model",
await program.parseAsync( " opus ",
[ "--thinking",
"cron", " high ",
"edit", ]);
"job-1",
"--message",
"hello",
"--model",
" opus ",
"--thinking",
" high ",
],
{ from: "user" },
);
const updateCall = callGatewayFromCli.mock.calls.find((call) => call[0] === "cron.update");
const patch = updateCall?.[2] as {
patch?: { payload?: { model?: string; thinking?: string } };
};
expect(patch?.patch?.payload?.model).toBe("opus"); expect(patch?.patch?.payload?.model).toBe("opus");
expect(patch?.patch?.payload?.thinking).toBe("high"); expect(patch?.patch?.payload?.thinking).toBe("high");
@@ -415,56 +412,34 @@ describe("cron cli", () => {
}); });
it("sets explicit stagger for cron add", async () => { it("sets explicit stagger for cron add", async () => {
resetGatewayMock(); const params = await runCronAddAndGetParams([
const program = buildProgram(); "--name",
"staggered",
await program.parseAsync( "--cron",
[ "0 * * * *",
"cron", "--stagger",
"add", "45s",
"--name", "--session",
"staggered", "main",
"--cron", "--system-event",
"0 * * * *", "tick",
"--stagger", ]);
"45s",
"--session",
"main",
"--system-event",
"tick",
],
{ from: "user" },
);
const addCall = callGatewayFromCli.mock.calls.find((call) => call[0] === "cron.add");
const params = addCall?.[2] as { schedule?: { kind?: string; staggerMs?: number } };
expect(params?.schedule?.kind).toBe("cron"); expect(params?.schedule?.kind).toBe("cron");
expect(params?.schedule?.staggerMs).toBe(45_000); expect(params?.schedule?.staggerMs).toBe(45_000);
}); });
it("sets exact cron mode on add", async () => { it("sets exact cron mode on add", async () => {
resetGatewayMock(); const params = await runCronAddAndGetParams([
const program = buildProgram(); "--name",
"exact",
await program.parseAsync( "--cron",
[ "0 * * * *",
"cron", "--exact",
"add", "--session",
"--name", "main",
"exact", "--system-event",
"--cron", "tick",
"0 * * * *", ]);
"--exact",
"--session",
"main",
"--system-event",
"tick",
],
{ from: "user" },
);
const addCall = callGatewayFromCli.mock.calls.find((call) => call[0] === "cron.add");
const params = addCall?.[2] as { schedule?: { kind?: string; staggerMs?: number } };
expect(params?.schedule?.kind).toBe("cron"); expect(params?.schedule?.kind).toBe("cron");
expect(params?.schedule?.staggerMs).toBe(0); expect(params?.schedule?.staggerMs).toBe(0);
}); });