122 lines
3.2 KiB
TypeScript
122 lines
3.2 KiB
TypeScript
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
|
|
const getProviderConfigMock = vi.hoisted(() =>
|
|
vi.fn(async () => ({
|
|
id: 'bailian',
|
|
apiKey: 'bl-key',
|
|
})),
|
|
)
|
|
|
|
vi.mock('@/lib/api-config', () => ({
|
|
getProviderConfig: getProviderConfigMock,
|
|
}))
|
|
|
|
vi.mock('@/lib/async-submit', () => ({
|
|
queryFalStatus: vi.fn(),
|
|
}))
|
|
|
|
vi.mock('@/lib/async-task-utils', () => ({
|
|
queryGeminiBatchStatus: vi.fn(),
|
|
queryGoogleVideoStatus: vi.fn(),
|
|
querySeedanceVideoStatus: vi.fn(),
|
|
}))
|
|
|
|
import { pollAsyncTask } from '@/lib/async-poll'
|
|
|
|
describe('async poll bailian task', () => {
|
|
beforeEach(() => {
|
|
vi.clearAllMocks()
|
|
})
|
|
|
|
it('returns pending when task is running', async () => {
|
|
const fetchMock = vi.fn(async () => ({
|
|
ok: true,
|
|
status: 200,
|
|
text: async () => JSON.stringify({
|
|
output: {
|
|
task_status: 'RUNNING',
|
|
},
|
|
}),
|
|
}))
|
|
vi.stubGlobal('fetch', fetchMock as unknown as typeof fetch)
|
|
|
|
const result = await pollAsyncTask('BAILIAN:VIDEO:task-running', 'user-1')
|
|
|
|
expect(getProviderConfigMock).toHaveBeenCalledWith('user-1', 'bailian')
|
|
expect(fetchMock).toHaveBeenCalledWith(
|
|
'https://dashscope.aliyuncs.com/api/v1/tasks/task-running',
|
|
{
|
|
headers: {
|
|
Authorization: 'Bearer bl-key',
|
|
},
|
|
},
|
|
)
|
|
expect(result).toEqual({ status: 'pending' })
|
|
})
|
|
|
|
it('returns completed with video url when task succeeded', async () => {
|
|
const fetchMock = vi.fn(async () => ({
|
|
ok: true,
|
|
status: 200,
|
|
text: async () => JSON.stringify({
|
|
output: {
|
|
task_status: 'SUCCEEDED',
|
|
video_url: 'https://video.example/result.mp4',
|
|
},
|
|
}),
|
|
}))
|
|
vi.stubGlobal('fetch', fetchMock as unknown as typeof fetch)
|
|
|
|
const result = await pollAsyncTask('BAILIAN:VIDEO:task-success', 'user-1')
|
|
|
|
expect(result).toEqual({
|
|
status: 'completed',
|
|
resultUrl: 'https://video.example/result.mp4',
|
|
videoUrl: 'https://video.example/result.mp4',
|
|
imageUrl: undefined,
|
|
})
|
|
})
|
|
|
|
it('returns failed when task succeeded but no media url', async () => {
|
|
const fetchMock = vi.fn(async () => ({
|
|
ok: true,
|
|
status: 200,
|
|
text: async () => JSON.stringify({
|
|
output: {
|
|
task_status: 'SUCCEEDED',
|
|
},
|
|
}),
|
|
}))
|
|
vi.stubGlobal('fetch', fetchMock as unknown as typeof fetch)
|
|
|
|
const result = await pollAsyncTask('BAILIAN:VIDEO:task-no-url', 'user-1')
|
|
|
|
expect(result).toEqual({
|
|
status: 'failed',
|
|
error: 'Bailian: 任务完成但未返回结果URL',
|
|
})
|
|
})
|
|
|
|
it('returns output code/message when task failed', async () => {
|
|
const fetchMock = vi.fn(async () => ({
|
|
ok: true,
|
|
status: 200,
|
|
text: async () => JSON.stringify({
|
|
output: {
|
|
task_status: 'FAILED',
|
|
code: 'InternalError.DownloadException',
|
|
message: 'Unknown error occurred while downloading the file.',
|
|
},
|
|
}),
|
|
}))
|
|
vi.stubGlobal('fetch', fetchMock as unknown as typeof fetch)
|
|
|
|
const result = await pollAsyncTask('BAILIAN:VIDEO:task-failed', 'user-1')
|
|
|
|
expect(result).toEqual({
|
|
status: 'failed',
|
|
error: 'Bailian: InternalError.DownloadException',
|
|
})
|
|
})
|
|
})
|