@@ -2,6 +2,7 @@ import { describe, expect, it } from "vitest";
|
2 | 2 | import { |
3 | 3 | applyJobPatch, |
4 | 4 | createJob, |
| 5 | +nextWakeAtMs, |
5 | 6 | recomputeNextRuns, |
6 | 7 | recomputeNextRunsForMaintenance, |
7 | 8 | } from "./service/jobs.js"; |
@@ -646,6 +647,32 @@ describe("createJob rejects sessionTarget main for non-default agents", () => {
|
646 | 647 | }); |
647 | 648 | }); |
648 | 649 | |
| 650 | +describe("nextWakeAtMs", () => { |
| 651 | +it("treats missing enabled like enabled so older persisted jobs still wake", () => { |
| 652 | +const nextRunAtMs = Date.parse("2026-02-28T12:01:00.000Z"); |
| 653 | +const state = createMockState(Date.parse("2026-02-28T12:00:00.000Z")); |
| 654 | +state.store = { |
| 655 | +version: 1, |
| 656 | +jobs: [ |
| 657 | +{ |
| 658 | +id: "legacy-missing-enabled", |
| 659 | +name: "legacy missing enabled", |
| 660 | +enabled: undefined as unknown as boolean, |
| 661 | +createdAtMs: nextRunAtMs - 60_000, |
| 662 | +updatedAtMs: nextRunAtMs - 60_000, |
| 663 | +schedule: { kind: "at", at: new Date(nextRunAtMs).toISOString() }, |
| 664 | +sessionTarget: "main", |
| 665 | +wakeMode: "now", |
| 666 | +payload: { kind: "systemEvent", text: "wake" }, |
| 667 | +state: { nextRunAtMs }, |
| 668 | +}, |
| 669 | +], |
| 670 | +}; |
| 671 | + |
| 672 | +expect(nextWakeAtMs(state)).toBe(nextRunAtMs); |
| 673 | +}); |
| 674 | +}); |
| 675 | + |
649 | 676 | describe("applyJobPatch rejects sessionTarget main for non-default agents", () => { |
650 | 677 | const now = Date.now(); |
651 | 678 | |
@@ -863,7 +890,7 @@ describe("recomputeNextRuns", () => {
|
863 | 890 | if (job.schedule.kind === "every") { |
864 | 891 | expect(job.schedule.anchorMs).toBe(createdAtMs); |
865 | 892 | } |
866 | | -expect(job.state.nextRunAtMs).toBe(now); |
| 893 | +expect(job.state.nextRunAtMs).toBe(now + 60_000); |
867 | 894 | }); |
868 | 895 | |
869 | 896 | it("keeps recovered recurring error retries behind run-end backoff", () => { |
|