4fa4f13558
Co-authored-by: iamlukethedev <iamlukethedev@users.noreply.github.com>
127 lines
3.5 KiB
TypeScript
127 lines
3.5 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
|
|
import {
|
|
buildCronJobCreateInput,
|
|
type CronCreateDraft,
|
|
} from "@/lib/cron/createPayloadBuilder";
|
|
|
|
describe("cron create payload builder", () => {
|
|
it("builds_agent_scoped_isolated_every_days_payload_with_anchor", () => {
|
|
const nowMs = Date.UTC(2026, 1, 11, 6, 30, 0);
|
|
const draft: CronCreateDraft = {
|
|
templateId: "morning-brief",
|
|
name: "Morning brief",
|
|
taskText: "Summarize overnight updates and priorities.",
|
|
scheduleKind: "every",
|
|
everyAmount: 1,
|
|
everyUnit: "days",
|
|
everyAtTime: "07:00",
|
|
everyTimeZone: "UTC",
|
|
};
|
|
|
|
const input = buildCronJobCreateInput("agent-1", draft, nowMs);
|
|
|
|
expect(input).toEqual({
|
|
name: "Morning brief",
|
|
agentId: "agent-1",
|
|
enabled: true,
|
|
schedule: {
|
|
kind: "every",
|
|
everyMs: 86_400_000,
|
|
anchorMs: Date.UTC(2026, 1, 11, 7, 0, 0),
|
|
},
|
|
sessionTarget: "isolated",
|
|
wakeMode: "now",
|
|
payload: {
|
|
kind: "agentTurn",
|
|
message: "Summarize overnight updates and priorities.",
|
|
},
|
|
delivery: { mode: "none" },
|
|
});
|
|
});
|
|
|
|
it("builds_main_system_event_payload_when_advanced_mode_selected", () => {
|
|
const draft: CronCreateDraft = {
|
|
templateId: "reminder",
|
|
name: "Standup reminder",
|
|
taskText: "Reminder: standup starts in 10 minutes.",
|
|
scheduleKind: "every",
|
|
everyAmount: 30,
|
|
everyUnit: "minutes",
|
|
advancedSessionTarget: "main",
|
|
advancedWakeMode: "next-heartbeat",
|
|
};
|
|
|
|
const input = buildCronJobCreateInput("agent-2", draft);
|
|
|
|
expect(input).toEqual({
|
|
name: "Standup reminder",
|
|
agentId: "agent-2",
|
|
enabled: true,
|
|
schedule: { kind: "every", everyMs: 1_800_000 },
|
|
sessionTarget: "main",
|
|
wakeMode: "next-heartbeat",
|
|
payload: {
|
|
kind: "systemEvent",
|
|
text: "Reminder: standup starts in 10 minutes.",
|
|
},
|
|
});
|
|
});
|
|
|
|
it("rejects_invalid_one_time_schedule_input", () => {
|
|
const draft: CronCreateDraft = {
|
|
templateId: "custom",
|
|
name: "One time",
|
|
taskText: "Run once later.",
|
|
scheduleKind: "at",
|
|
scheduleAt: "not-a-date",
|
|
};
|
|
|
|
expect(() => buildCronJobCreateInput("agent-1", draft)).toThrow("Invalid run time.");
|
|
});
|
|
|
|
it("rejects_invalid_interval_amount_for_every_schedule", () => {
|
|
const draft: CronCreateDraft = {
|
|
templateId: "custom",
|
|
name: "Invalid interval",
|
|
taskText: "Run repeatedly.",
|
|
scheduleKind: "every",
|
|
everyAmount: 0,
|
|
everyUnit: "minutes",
|
|
};
|
|
|
|
expect(() => buildCronJobCreateInput("agent-1", draft)).toThrow("Invalid interval amount.");
|
|
});
|
|
|
|
it("rejects_every_days_without_time", () => {
|
|
const draft: CronCreateDraft = {
|
|
templateId: "custom",
|
|
name: "Daily report",
|
|
taskText: "Compile report.",
|
|
scheduleKind: "every",
|
|
everyAmount: 1,
|
|
everyUnit: "days",
|
|
everyTimeZone: "UTC",
|
|
};
|
|
|
|
expect(() => buildCronJobCreateInput("agent-1", draft)).toThrow(
|
|
"Daily schedule time is required."
|
|
);
|
|
});
|
|
|
|
it("rejects_invalid_timezone_for_every_days", () => {
|
|
const draft: CronCreateDraft = {
|
|
templateId: "custom",
|
|
name: "Daily report",
|
|
taskText: "Compile report.",
|
|
scheduleKind: "every",
|
|
everyAmount: 1,
|
|
everyUnit: "days",
|
|
everyAtTime: "07:00",
|
|
everyTimeZone: "Mars/OlympusMons",
|
|
};
|
|
|
|
expect(() => buildCronJobCreateInput("agent-1", draft)).toThrow("Invalid timezone.");
|
|
});
|
|
});
|