feat: initial release v0.3.0
This commit is contained in:
121
tests/unit/task/async-poll-bailian.test.ts
Normal file
121
tests/unit/task/async-poll-bailian.test.ts
Normal file
@@ -0,0 +1,121 @@
|
||||
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',
|
||||
})
|
||||
})
|
||||
})
|
||||
Reference in New Issue
Block a user