66 lines
1.9 KiB
TypeScript
66 lines
1.9 KiB
TypeScript
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
import {
|
|
getTaskDrainStatus,
|
|
resolveHeartbeatSchedulingSuppression,
|
|
startTaskDrain,
|
|
stopTaskDrain,
|
|
} from "../services/heartbeat.ts";
|
|
|
|
describe("heartbeat task drain", () => {
|
|
afterEach(() => {
|
|
stopTaskDrain();
|
|
vi.useRealTimers();
|
|
});
|
|
|
|
it("start_task_drain_suppresses_admission", () => {
|
|
startTaskDrain({});
|
|
expect(resolveHeartbeatSchedulingSuppression({})).toEqual({
|
|
suppressed: true,
|
|
reason: "task_drain",
|
|
});
|
|
});
|
|
|
|
it("stop_task_drain_restores_admission", () => {
|
|
startTaskDrain({});
|
|
expect(stopTaskDrain()).toEqual({ wasActive: true });
|
|
expect(resolveHeartbeatSchedulingSuppression({})).toEqual({
|
|
suppressed: false,
|
|
reason: null,
|
|
});
|
|
expect(stopTaskDrain()).toEqual({ wasActive: false });
|
|
});
|
|
|
|
it("null_ttl_produces_no_expiry", () => {
|
|
const { expiresAt } = startTaskDrain({ ttlMs: null });
|
|
expect(expiresAt).toBeNull();
|
|
expect(getTaskDrainStatus().expiresAt).toBeNull();
|
|
});
|
|
|
|
it("an_expired_ttl_ends_the_drain_and_restores_admission", () => {
|
|
vi.useFakeTimers();
|
|
vi.setSystemTime(new Date("2026-01-01T00:00:00.000Z"));
|
|
startTaskDrain({ ttlMs: 1000 });
|
|
expect(resolveHeartbeatSchedulingSuppression({})).toEqual({
|
|
suppressed: true,
|
|
reason: "task_drain",
|
|
});
|
|
|
|
vi.setSystemTime(new Date("2026-01-01T00:00:01.001Z"));
|
|
expect(resolveHeartbeatSchedulingSuppression({})).toEqual({
|
|
suppressed: false,
|
|
reason: null,
|
|
});
|
|
expect(getTaskDrainStatus().draining).toBe(false);
|
|
});
|
|
|
|
it("status_reports_quiescent_when_both_promise_sets_are_empty", () => {
|
|
startTaskDrain({});
|
|
const status = getTaskDrainStatus();
|
|
expect(status.draining).toBe(true);
|
|
expect(status.activeRuns).toBe(0);
|
|
expect(status.pendingWakes).toBe(0);
|
|
expect(status.quiescent).toBe(true);
|
|
});
|
|
|
|
});
|