34 lines
1.4 KiB
TypeScript
34 lines
1.4 KiB
TypeScript
/** @jest-environment node */
|
|
import { ensureMaterialPurgeWorkerStarted } from '@/lib/material-purge'
|
|
import { prisma } from '@/lib/prisma'
|
|
|
|
jest.mock('@/lib/prisma', () => ({ prisma: { $transaction: jest.fn() } }))
|
|
jest.mock('@/lib/material-purge-files', () => ({}))
|
|
|
|
test('空队列检查期间收到入队信号,立即再检查,不丢失唤醒并等待轮询', async () => {
|
|
jest.useFakeTimers()
|
|
const global = globalThis as typeof globalThis & { __materialPurgeWorkerStarted?: boolean; __materialPurgePump?: () => Promise<void> }
|
|
const oldBuild = process.env.NEXT_BUILD
|
|
delete process.env.NEXT_BUILD
|
|
delete global.__materialPurgeWorkerStarted
|
|
delete global.__materialPurgePump
|
|
let finish!: (rows: unknown[]) => void
|
|
const query = jest.fn().mockImplementationOnce(() => new Promise(resolve => { finish = resolve })).mockResolvedValue([])
|
|
;(prisma.$transaction as jest.Mock).mockImplementation(callback => callback({ $queryRaw: query }))
|
|
try {
|
|
ensureMaterialPurgeWorkerStarted()
|
|
expect(query).toHaveBeenCalledTimes(1)
|
|
ensureMaterialPurgeWorkerStarted()
|
|
finish([])
|
|
await jest.advanceTimersByTimeAsync(0)
|
|
expect(query).toHaveBeenCalledTimes(2)
|
|
} finally {
|
|
jest.clearAllTimers()
|
|
jest.useRealTimers()
|
|
delete global.__materialPurgeWorkerStarted
|
|
delete global.__materialPurgePump
|
|
if (oldBuild === undefined) delete process.env.NEXT_BUILD
|
|
else process.env.NEXT_BUILD = oldBuild
|
|
}
|
|
})
|