import { describe, expect, it } from "vitest"; import { isHeartbeatActionWakeReason, isHeartbeatEventDrivenReason, normalizeHeartbeatWakeReason, resolveHeartbeatReasonKind, } from "./heartbeat-reason.js"; describe("heartbeat-reason", () => { it.each([ { value: " cron:job-1 ", expected: "cron:job-1" }, { value: " ", expected: "requested" }, { value: undefined, expected: "requested" }, ])("normalizes wake reasons for %j", ({ value, expected }) => { expect(normalizeHeartbeatWakeReason(value)).toBe(expected); }); it.each([ { value: "retry", expected: "retry" }, { value: "interval", expected: "interval" }, { value: "manual", expected: "manual" }, { value: "exec-event", expected: "exec-event" }, { value: "wake", expected: "wake" }, { value: "acp:spawn:stream", expected: "wake" }, { value: "acp:spawn:", expected: "wake" }, { value: "cron:job-1", expected: "cron" }, { value: "hook:wake", expected: "hook" }, { value: " hook:wake ", expected: "hook" }, { value: "requested", expected: "other" }, { value: "slow", expected: "other" }, { value: "", expected: "other" }, { value: undefined, expected: "other" }, ])("classifies reason kinds for %j", ({ value, expected }) => { expect(resolveHeartbeatReasonKind(value)).toBe(expected); }); it.each([ { value: "exec-event", expected: true }, { value: "cron:job-1", expected: true }, { value: "wake", expected: true }, { value: "acp:spawn:stream", expected: true }, { value: "hook:gmail:sync", expected: true }, { value: "interval", expected: false }, { value: "manual", expected: false }, { value: "other", expected: false }, ])("matches event-driven behavior for %j", ({ value, expected }) => { expect(isHeartbeatEventDrivenReason(value)).toBe(expected); }); it.each([ { value: "manual", expected: true }, { value: "exec-event", expected: true }, { value: "hook:wake", expected: true }, { value: "interval", expected: false }, { value: "cron:job-1", expected: false }, { value: "retry", expected: false }, ])("matches action-priority wake behavior for %j", ({ value, expected }) => { expect(isHeartbeatActionWakeReason(value)).toBe(expected); }); });