import { beforeEach, describe, expect, it, vi } from "vitest"; const callGatewayMock = vi.fn(); vi.mock("../../gateway/call.js", () => ({ callGateway: (opts: unknown) => callGatewayMock(opts), })); import { createCronTool } from "./cron-tool.js"; describe("cron tool", () => { beforeEach(() => { callGatewayMock.mockReset(); callGatewayMock.mockResolvedValue({ ok: true }); }); it.each([ [ "update", { action: "update", id: "job-1", patch: { foo: "bar" } }, { id: "job-1", patch: { foo: "bar" } }, ], ["remove", { action: "remove", id: "job-1" }, { id: "job-1" }], ["run", { action: "run", id: "job-1" }, { id: "job-1" }], ["runs", { action: "runs", id: "job-1" }, { id: "job-1" }], ])("%s sends id to gateway", async (action, args, expectedParams) => { const tool = createCronTool(); await tool.execute("call1", args); expect(callGatewayMock).toHaveBeenCalledTimes(1); const call = callGatewayMock.mock.calls[0]?.[0] as { method?: string; params?: unknown; }; expect(call.method).toBe(`cron.${action}`); expect(call.params).toEqual(expectedParams); }); it("normalizes cron.add job payloads", async () => { const tool = createCronTool(); await tool.execute("call2", { action: "add", job: { data: { name: "wake-up", schedule: { atMs: 123 }, payload: { text: "hello" }, }, }, }); expect(callGatewayMock).toHaveBeenCalledTimes(1); const call = callGatewayMock.mock.calls[0]?.[0] as { method?: string; params?: unknown; }; expect(call.method).toBe("cron.add"); expect(call.params).toEqual({ name: "wake-up", schedule: { kind: "at", atMs: 123 }, sessionTarget: "main", wakeMode: "next-heartbeat", payload: { kind: "systemEvent", text: "hello" }, }); }); });