From a65ff4de9fd4bbed15b165bcf3b2dafc85c0f5c7 Mon Sep 17 00:00:00 2001 From: Shakker Date: Thu, 2 Apr 2026 01:43:22 +0100 Subject: [PATCH] test: drain cron regression queue work before cleanup --- src/cron/service.regression-fixtures.ts | 9 +++++++-- src/cron/service/ops.regression.test.ts | 6 ++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/cron/service.regression-fixtures.ts b/src/cron/service.regression-fixtures.ts index 98e6ed69d9e..6f770c9c5b6 100644 --- a/src/cron/service.regression-fixtures.ts +++ b/src/cron/service.regression-fixtures.ts @@ -6,7 +6,7 @@ import { afterAll, afterEach, beforeAll, beforeEach, vi } from "vitest"; import { clearAllBootstrapSnapshots } from "../agents/bootstrap-cache.js"; import { clearSessionStoreCacheForTest } from "../config/sessions/store.js"; import { resetAgentRunContextForTest } from "../infra/agent-events.js"; -import { resetCommandQueueStateForTest } from "../process/command-queue.js"; +import { resetCommandQueueStateForTest, waitForActiveTasks } from "../process/command-queue.js"; import { useFrozenTime, useRealTime } from "../test-utils/frozen-time.js"; import { createCronServiceState, type CronServiceDeps } from "./service/state.js"; import type { CronJob, CronJobState } from "./types.js"; @@ -34,10 +34,11 @@ export function setupCronRegressionFixtures(options?: { prefix?: string; baseTim useFrozenTime(options?.baseTimeIso ?? "2026-02-06T10:05:00.000Z"); }); - afterEach(() => { + afterEach(async () => { vi.clearAllTimers(); vi.restoreAllMocks(); useRealTime(); + await waitForActiveTasks(250); resetCommandQueueStateForTest(); clearSessionStoreCacheForTest(); resetAgentRunContextForTest(); @@ -46,6 +47,7 @@ export function setupCronRegressionFixtures(options?: { prefix?: string; baseTim afterAll(async () => { useRealTime(); + await waitForActiveTasks(250); await fs.rm(fixtureRoot, { recursive: true, force: true }); }); @@ -127,8 +129,10 @@ export function createDefaultIsolatedRunner(): CronServiceDeps["runIsolatedAgent export function createAbortAwareIsolatedRunner(summary = "late") { let observedAbortSignal: AbortSignal | undefined; + const started = createDeferred(); const runIsolatedAgentJob = vi.fn(async ({ abortSignal }) => { observedAbortSignal = abortSignal; + started.resolve(); await new Promise((resolve) => { if (!abortSignal) { return; @@ -145,6 +149,7 @@ export function createAbortAwareIsolatedRunner(summary = "late") { return { runIsolatedAgentJob, getObservedAbortSignal: () => observedAbortSignal, + waitForStart: () => started.promise, }; } diff --git a/src/cron/service/ops.regression.test.ts b/src/cron/service/ops.regression.test.ts index 4e9468406a7..51f4bf9b61f 100644 --- a/src/cron/service/ops.regression.test.ts +++ b/src/cron/service/ops.regression.test.ts @@ -194,7 +194,6 @@ describe("cron service ops regressions", () => { }); it("applies timeoutSeconds to manual cron.run isolated executions", async () => { - vi.useRealTimers(); const store = opsRegressionFixtures.makeStorePath(); const scheduledAt = Date.parse("2026-02-15T13:00:00.000Z"); const job = createIsolatedRegressionJob({ @@ -217,7 +216,10 @@ describe("cron service ops regressions", () => { runIsolatedAgentJob: abortAwareRunner.runIsolatedAgentJob, }); - const result = await run(state, job.id, "force"); + const resultPromise = run(state, job.id, "force"); + await abortAwareRunner.waitForStart(); + await vi.advanceTimersByTimeAsync(10); + const result = await resultPromise; expect(result).toEqual({ ok: true, ran: true }); expect(abortAwareRunner.getObservedAbortSignal()?.aborted).toBe(true);