import { expect, test, vi } from "vitest" import { Scheduler, Task } from "#Source/orchestration/index.ts" test("Scheduler runs one-shot tasks and records run logs", async () => { vi.useFakeTimers() vi.setSystemTime(new Date(2_026, 0, 1, 0, 0, 0, 0)) try { const run = vi.fn(() => undefined) const runAt = new Date(Date.now() + 1_000) const scheduler = new Scheduler({ tasks: [ new Task({ name: "alpha", cron: runAt, run, }), ], }) scheduler.run() await vi.advanceTimersByTimeAsync(999) expect(run).toHaveBeenCalledTimes(0) await vi.advanceTimersByTimeAsync(1) expect(run).toHaveBeenCalledTimes(1) expect(scheduler.getErrLog()).toEqual([]) expect(scheduler.getRunLog()).toHaveLength(1) expect(scheduler.getRunLog()[0]).toEqual({ name: "alpha", time: runAt, }) } finally { vi.clearAllTimers() vi.useRealTimers() } }) test("Scheduler records both run and error logs when a task fails", async () => { vi.useFakeTimers() vi.setSystemTime(new Date(2_026, 0, 1, 0, 0, 0, 0)) try { const error = new Error("boom") const run = vi.fn(async () => await Promise.reject(error)) const runAt = new Date(Date.now() + 1_000) const scheduler = new Scheduler({ tasks: [ new Task({ name: "beta", cron: runAt, run, }), ], }) scheduler.run() await vi.advanceTimersByTimeAsync(1_000) expect(run).toHaveBeenCalledTimes(1) expect(scheduler.getRunLog()).toHaveLength(1) expect(scheduler.getErrLog()).toEqual([ { name: "beta", time: runAt, reason: "Error: boom", }, ]) } finally { vi.clearAllTimers() vi.useRealTimers() } }) test("Scheduler.run rejects duplicate starts", () => { vi.useFakeTimers() vi.setSystemTime(new Date(2_026, 0, 1, 0, 0, 0, 0)) try { const scheduler = new Scheduler({ tasks: [ new Task({ name: "gamma", cron: new Date(Date.now() + 1_000), run: () => undefined, }), ], }) scheduler.run() expect(() => scheduler.run()).toThrow("Scheduler is already running") } finally { vi.clearAllTimers() vi.useRealTimers() } })