diff --git a/src/cron/delivery-plan.test.ts b/src/cron/delivery-plan.test.ts index ccffba972de..f4875156f93 100644 --- a/src/cron/delivery-plan.test.ts +++ b/src/cron/delivery-plan.test.ts @@ -1,28 +1,11 @@ import { describe, expect, it } from "vitest"; import { resolveCronDeliveryPlan } from "./delivery-plan.js"; -import type { CronJob } from "./types.js"; - -function makeJob(overrides: Partial): CronJob { - const now = Date.now(); - return { - id: "job-1", - name: "test", - enabled: true, - createdAtMs: now, - updatedAtMs: now, - schedule: { kind: "every", everyMs: 60_000 }, - sessionTarget: "isolated", - wakeMode: "next-heartbeat", - payload: { kind: "agentTurn", message: "hello" }, - state: {}, - ...overrides, - }; -} +import { makeCronJob } from "./delivery.test-helpers.js"; describe("resolveCronDeliveryPlan", () => { it("preserves explicit message target context for delivery.mode=none", () => { const plan = resolveCronDeliveryPlan( - makeJob({ + makeCronJob({ name: "Cron Target Context", payload: { kind: "agentTurn", message: "send a message" }, delivery: { diff --git a/src/cron/delivery.test-helpers.ts b/src/cron/delivery.test-helpers.ts new file mode 100644 index 00000000000..ce2b8067c06 --- /dev/null +++ b/src/cron/delivery.test-helpers.ts @@ -0,0 +1,18 @@ +import type { CronJob } from "./types.js"; + +export function makeCronJob(overrides: Partial): CronJob { + const now = Date.now(); + return { + id: "job-1", + name: "test", + enabled: true, + createdAtMs: now, + updatedAtMs: now, + schedule: { kind: "every", everyMs: 60_000 }, + sessionTarget: "isolated", + wakeMode: "next-heartbeat", + payload: { kind: "agentTurn", message: "hello" }, + state: {}, + ...overrides, + }; +} diff --git a/src/cron/delivery.test.ts b/src/cron/delivery.test.ts index f30ddb22d4a..c53097482e2 100644 --- a/src/cron/delivery.test.ts +++ b/src/cron/delivery.test.ts @@ -1,28 +1,11 @@ import { describe, expect, it } from "vitest"; import { resolveCronDeliveryPlan, resolveFailureDestination } from "./delivery-plan.js"; -import type { CronJob } from "./types.js"; - -function makeJob(overrides: Partial): CronJob { - const now = Date.now(); - return { - id: "job-1", - name: "test", - enabled: true, - createdAtMs: now, - updatedAtMs: now, - schedule: { kind: "every", everyMs: 60_000 }, - sessionTarget: "isolated", - wakeMode: "next-heartbeat", - payload: { kind: "agentTurn", message: "hello" }, - state: {}, - ...overrides, - }; -} +import { makeCronJob } from "./delivery.test-helpers.js"; describe("resolveCronDeliveryPlan", () => { it("defaults to announce when delivery object has no mode", () => { const plan = resolveCronDeliveryPlan( - makeJob({ + makeCronJob({ delivery: { channel: "telegram", to: "123", mode: undefined as never }, }), ); @@ -34,7 +17,7 @@ describe("resolveCronDeliveryPlan", () => { it("defaults missing isolated agentTurn delivery to announce", () => { const plan = resolveCronDeliveryPlan( - makeJob({ + makeCronJob({ delivery: undefined, payload: { kind: "agentTurn", message: "hello" }, }), @@ -46,7 +29,7 @@ describe("resolveCronDeliveryPlan", () => { it("resolves mode=none with requested=false and no channel (#21808)", () => { const plan = resolveCronDeliveryPlan( - makeJob({ + makeCronJob({ delivery: { mode: "none", to: "telegram:123" }, }), ); @@ -58,7 +41,7 @@ describe("resolveCronDeliveryPlan", () => { it("resolves webhook mode without channel routing", () => { const plan = resolveCronDeliveryPlan( - makeJob({ + makeCronJob({ delivery: { mode: "webhook", to: "https://example.invalid/cron" }, }), ); @@ -70,7 +53,7 @@ describe("resolveCronDeliveryPlan", () => { it("threads delivery.accountId when explicitly configured", () => { const plan = resolveCronDeliveryPlan( - makeJob({ + makeCronJob({ delivery: { mode: "announce", channel: "telegram", @@ -88,7 +71,7 @@ describe("resolveCronDeliveryPlan", () => { it("threads delivery.threadId when explicitly configured", () => { const plan = resolveCronDeliveryPlan( - makeJob({ + makeCronJob({ delivery: { mode: "announce", channel: "telegram", @@ -108,7 +91,7 @@ describe("resolveCronDeliveryPlan", () => { describe("resolveFailureDestination", () => { it("merges global defaults with job-level overrides", () => { const plan = resolveFailureDestination( - makeJob({ + makeCronJob({ delivery: { mode: "announce", channel: "telegram", @@ -133,7 +116,7 @@ describe("resolveFailureDestination", () => { it("returns null for webhook mode without destination URL", () => { const plan = resolveFailureDestination( - makeJob({ + makeCronJob({ delivery: { mode: "announce", channel: "telegram", @@ -148,7 +131,7 @@ describe("resolveFailureDestination", () => { it("returns null when failure destination matches primary delivery target", () => { const plan = resolveFailureDestination( - makeJob({ + makeCronJob({ delivery: { mode: "announce", channel: "telegram", @@ -169,7 +152,7 @@ describe("resolveFailureDestination", () => { it("returns null when webhook failure destination matches the primary webhook target", () => { const plan = resolveFailureDestination( - makeJob({ + makeCronJob({ sessionTarget: "main", payload: { kind: "systemEvent", text: "tick" }, delivery: { @@ -188,7 +171,7 @@ describe("resolveFailureDestination", () => { it("does not reuse inherited announce recipient when switching failure destination to webhook", () => { const plan = resolveFailureDestination( - makeJob({ + makeCronJob({ delivery: { mode: "announce", channel: "telegram", @@ -209,7 +192,7 @@ describe("resolveFailureDestination", () => { it("allows job-level failure destination fields to clear inherited global values", () => { const plan = resolveFailureDestination( - makeJob({ + makeCronJob({ delivery: { mode: "announce", channel: "telegram",