gongxiangp2/lib/__tests__/material-purge-worker.test.ts

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