import "../setup.ts"; import { assertEquals } from "@std/assert"; import { FakeTime } from "@std/testing/time"; import { startJobs } from "../../lib/scheduler.ts"; Deno.test("startJobs: waits for the first run, then repeats, skipping a run still going", async () => { using time = new FakeTime(); let runs = 0; let release = () => {}; startJobs([{ name: "slow", everyMs: 1_000, firstAfterMs: 500, run: () => { runs++; return new Promise((resolve) => release = resolve); }, }]); await time.tickAsync(499); assertEquals(runs, 0); await time.tickAsync(1); assertEquals(runs, 1); // Still running at the next tick: skipped. await time.tickAsync(1_000); assertEquals(runs, 1); release(); await time.tickAsync(1_000); assertEquals(runs, 2); }); Deno.test("startJobs: a failed run is logged, and the next one runs anyway", async () => { using time = new FakeTime(); const errors: unknown[][] = []; const consoleError = console.error; console.error = (...args: unknown[]) => errors.push(args); try { let runs = 0; startJobs([{ name: "flaky", everyMs: 1_000, run: () => { runs++; throw new Error("boom"); }, }]); await time.tickAsync(2_000); assertEquals(runs, 2); assertEquals(errors.length, 2); assertEquals(errors[0][0], "[flaky] run failed:"); } finally { console.error = consoleError; } });