Files
waooplus/tests/unit/task/normalize-error.test.ts
2026-03-08 17:10:06 +08:00

66 lines
2.7 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import { normalizeAnyError } from '@/lib/errors/normalize'
describe('normalizeAnyError network termination mapping', () => {
it('maps undici terminated TypeError to NETWORK_ERROR', () => {
const normalized = normalizeAnyError(new TypeError('terminated'))
expect(normalized.code).toBe('NETWORK_ERROR')
expect(normalized.retryable).toBe(true)
})
it('maps socket hang up TypeError to NETWORK_ERROR', () => {
const normalized = normalizeAnyError(new TypeError('socket hang up'))
expect(normalized.code).toBe('NETWORK_ERROR')
expect(normalized.retryable).toBe(true)
})
it('maps wrapped terminated message to NETWORK_ERROR', () => {
const normalized = normalizeAnyError(new Error('exception TypeError: terminated'))
expect(normalized.code).toBe('NETWORK_ERROR')
expect(normalized.retryable).toBe(true)
})
})
describe('normalizeAnyError provider-specific mapping', () => {
it('maps Ark ModelNotOpen payload to MODEL_NOT_OPEN', () => {
const normalized = normalizeAnyError({
status: 404,
code: 'ModelNotOpen',
message: 'Your account has not activated the model doubao-seedream. Please activate the model service in the Ark Console.',
})
expect(normalized.code).toBe('MODEL_NOT_OPEN')
expect(normalized.retryable).toBe(false)
})
it('maps Gemini empty response payload to EMPTY_RESPONSE even when status is 429', () => {
const normalized = normalizeAnyError({
status: 429,
message: 'received empty response from Gemini: no meaningful content in candidates (code: channel:empty_response)',
})
expect(normalized.code).toBe('EMPTY_RESPONSE')
expect(normalized.retryable).toBe(true)
})
it('maps template status 500 message to EXTERNAL_ERROR instead of INTERNAL_ERROR', () => {
const normalized = normalizeAnyError(new Error('Template request failed with status 500: upstream overloaded'))
expect(normalized.code).toBe('EXTERNAL_ERROR')
expect(normalized.retryable).toBe(true)
})
it('maps openai-compatible video template mismatch to VIDEO_API_FORMAT_UNSUPPORTED', () => {
const normalized = normalizeAnyError(
new Error('VIDEO_API_FORMAT_UNSUPPORTED: OPENAI_COMPAT_VIDEO_TEMPLATE_TASK_ID_NOT_FOUND'),
)
expect(normalized.code).toBe('VIDEO_API_FORMAT_UNSUPPORTED')
expect(normalized.retryable).toBe(false)
})
it('maps template status 415 message to VIDEO_API_FORMAT_UNSUPPORTED', () => {
const normalized = normalizeAnyError(
new Error('Template request failed with status 415: unsupported media type'),
)
expect(normalized.code).toBe('VIDEO_API_FORMAT_UNSUPPORTED')
expect(normalized.retryable).toBe(false)
})
})