2026-05-01 20:39:09 +08:00
|
|
|
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
|
2026-04-24 09:44:08 +08:00
|
|
|
|
|
|
|
|
import {
|
|
|
|
|
enqueuePublishTask,
|
|
|
|
|
getPublishSchedulerSnapshot,
|
|
|
|
|
initPublishScheduler,
|
|
|
|
|
notePublishTaskActivated,
|
|
|
|
|
notePublishTaskCompleted,
|
|
|
|
|
selectNextPublishTask,
|
2026-05-01 20:39:09 +08:00
|
|
|
} from './publish-scheduler'
|
2026-04-24 09:44:08 +08:00
|
|
|
|
2026-05-01 20:39:09 +08:00
|
|
|
describe('publish scheduler', () => {
|
2026-04-24 09:44:08 +08:00
|
|
|
beforeEach(() => {
|
2026-05-01 20:39:09 +08:00
|
|
|
vi.useFakeTimers()
|
|
|
|
|
vi.setSystemTime(new Date('2026-04-24T00:00:00.000Z'))
|
|
|
|
|
initPublishScheduler()
|
|
|
|
|
})
|
2026-04-24 09:44:08 +08:00
|
|
|
|
|
|
|
|
afterEach(() => {
|
2026-05-01 20:39:09 +08:00
|
|
|
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' })
|
2026-04-24 09:44:08 +08:00
|
|
|
|
|
|
|
|
const selected = selectNextPublishTask({
|
|
|
|
|
maxConcurrency: 2,
|
|
|
|
|
activeCount: 1,
|
2026-05-01 20:39:09 +08:00
|
|
|
})
|
2026-04-24 09:44:08 +08:00
|
|
|
|
2026-05-01 20:39:09 +08:00
|
|
|
expect(selected?.taskId).toBe('zhihu-next')
|
|
|
|
|
expect(getPublishSchedulerSnapshot().leasingCount).toBe(1)
|
|
|
|
|
})
|
2026-04-24 09:44:08 +08:00
|
|
|
|
2026-05-01 20:39:09 +08:00
|
|
|
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')
|
2026-04-24 09:44:08 +08:00
|
|
|
|
2026-05-01 20:39:09 +08:00
|
|
|
enqueuePublishTask({ taskId: 'second', platform: 'toutiao', routing: 'rabbitmq-primary' })
|
2026-04-24 09:44:08 +08:00
|
|
|
|
2026-05-01 20:39:09 +08:00
|
|
|
expect(selectNextPublishTask({ maxConcurrency: 2, activeCount: 0 })).toBeNull()
|
2026-04-24 09:44:08 +08:00
|
|
|
|
2026-05-01 20:39:09 +08:00
|
|
|
vi.advanceTimersByTime(6_001)
|
2026-04-24 09:44:08 +08:00
|
|
|
|
2026-05-01 20:39:09 +08:00
|
|
|
expect(selectNextPublishTask({ maxConcurrency: 2, activeCount: 0 })?.taskId).toBe('second')
|
|
|
|
|
})
|
|
|
|
|
})
|