gongxiangp2/lib/__tests__/retry-transcode-route.test.ts
chenpei 5ef70bce4e fix: 转码按正式目录找源文件,失败只给用户可重试提示
把 /uploads 网址路径落到 UPLOAD_DIR,避免误判文件不存在。
页面和接口不再回传路径或堆栈,只提示稍后重试。
2026-08-17 15:24:13 +08:00

87 lines
2.6 KiB
TypeScript

/** @jest-environment node */
import { NextRequest } from 'next/server'
import { getServerSession } from 'next-auth'
import { POST } from '@/app/api/materials/[id]/retry-transcode/route'
import { prisma } from '@/lib/prisma'
import { enqueueVideoTranscodeTask } from '@/lib/video-transcode-task'
jest.mock('next-auth', () => ({
getServerSession: jest.fn(),
}))
jest.mock('@/lib/auth', () => ({
authOptions: {},
}))
jest.mock('@/lib/prisma', () => ({
prisma: {
material: {
findUnique: jest.fn(),
update: jest.fn(),
},
user: {
findUnique: jest.fn(),
},
},
}))
jest.mock('@/lib/video-transcode-task', () => ({
enqueueVideoTranscodeTask: jest.fn(),
USER_TRANSCODE_FAILURE_MESSAGE: '预览还没做好,请稍后重试',
}))
describe('retry transcode route', () => {
beforeEach(() => {
jest.clearAllMocks()
;(getServerSession as jest.Mock).mockResolvedValue({
user: { id: 'owner-1', role: 'USER' },
})
;(prisma.material.findUnique as jest.Mock).mockResolvedValue({
id: 'material-1',
userId: 'owner-1',
videoProcessingStatus: 'failed',
videoSourceUrl: 'uploads/materials/source.mp4',
videoCoverUrl: null,
})
;(prisma.user.findUnique as jest.Mock).mockResolvedValue({ role: 'USER' })
;(prisma.material.update as jest.Mock).mockResolvedValue({})
;(enqueueVideoTranscodeTask as jest.Mock).mockResolvedValue(undefined)
})
function createRequest() {
return new NextRequest('http://localhost/api/materials/material-1/retry-transcode', {
method: 'POST',
})
}
it('重试时会真正将视频任务加入转码队列', async () => {
const response = await POST(createRequest(), { params: { id: 'material-1' } })
expect(response.status).toBe(200)
expect(enqueueVideoTranscodeTask).toHaveBeenCalledWith(
'material-1',
'uploads/materials/source.mp4',
true
)
})
it('入队失败时回写失败状态而不是永久停留在 processing', async () => {
;(enqueueVideoTranscodeTask as jest.Mock).mockRejectedValue(new Error('queue unavailable'))
const response = await POST(createRequest(), { params: { id: 'material-1' } })
const body = await response.json()
expect(response.status).toBe(500)
expect(body.error).toBe('预览还没做好,请稍后重试')
expect(body.error).not.toContain('queue unavailable')
expect(prisma.material.update).toHaveBeenLastCalledWith({
where: { id: 'material-1' },
data: {
videoProcessingStatus: 'failed',
transcodeLastError: '预览还没做好,请稍后重试',
},
})
})
})