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') }) })