54 lines
1.8 KiB
TypeScript
54 lines
1.8 KiB
TypeScript
|
|
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
||
|
|
|
||
|
|
import {
|
||
|
|
enqueuePublishTask,
|
||
|
|
getPublishSchedulerSnapshot,
|
||
|
|
initPublishScheduler,
|
||
|
|
notePublishTaskActivated,
|
||
|
|
notePublishTaskCompleted,
|
||
|
|
selectNextPublishTask,
|
||
|
|
} from "./publish-scheduler";
|
||
|
|
|
||
|
|
describe("publish scheduler", () => {
|
||
|
|
beforeEach(() => {
|
||
|
|
vi.useFakeTimers();
|
||
|
|
vi.setSystemTime(new Date("2026-04-24T00:00:00.000Z"));
|
||
|
|
initPublishScheduler();
|
||
|
|
});
|
||
|
|
|
||
|
|
afterEach(() => {
|
||
|
|
vi.useRealTimers();
|
||
|
|
initPublishScheduler();
|
||
|
|
});
|
||
|
|
|
||
|
|
it("skips same-platform queued tasks while selecting an allowed platform", () => {
|
||
|
|
enqueuePublishTask({ taskId: "toutiao-active", platform: "toutiao", routing: "rabbitmq-primary" });
|
||
|
|
notePublishTaskActivated("toutiao-active", "toutiao");
|
||
|
|
enqueuePublishTask({ taskId: "toutiao-next", platform: "toutiao", routing: "rabbitmq-primary" });
|
||
|
|
enqueuePublishTask({ taskId: "zhihu-next", platform: "zhihu", routing: "rabbitmq-primary" });
|
||
|
|
|
||
|
|
const selected = selectNextPublishTask({
|
||
|
|
maxConcurrency: 2,
|
||
|
|
activeCount: 1,
|
||
|
|
});
|
||
|
|
|
||
|
|
expect(selected?.taskId).toBe("zhihu-next");
|
||
|
|
expect(getPublishSchedulerSnapshot().leasingCount).toBe(1);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("holds same-platform tasks during completion cooldown", () => {
|
||
|
|
enqueuePublishTask({ taskId: "first", platform: "toutiao", routing: "rabbitmq-primary" });
|
||
|
|
expect(selectNextPublishTask({ maxConcurrency: 2, activeCount: 0 })?.taskId).toBe("first");
|
||
|
|
notePublishTaskActivated("first", "toutiao");
|
||
|
|
notePublishTaskCompleted("first", "toutiao");
|
||
|
|
|
||
|
|
enqueuePublishTask({ taskId: "second", platform: "toutiao", routing: "rabbitmq-primary" });
|
||
|
|
|
||
|
|
expect(selectNextPublishTask({ maxConcurrency: 2, activeCount: 0 })).toBeNull();
|
||
|
|
|
||
|
|
vi.advanceTimersByTime(6_001);
|
||
|
|
|
||
|
|
expect(selectNextPublishTask({ maxConcurrency: 2, activeCount: 0 })?.taskId).toBe("second");
|
||
|
|
});
|
||
|
|
});
|