69 lines
3.0 KiB
TypeScript
69 lines
3.0 KiB
TypeScript
import { describe, expect, it, vi } from 'vitest'
|
|
import {
|
|
DEFAULT_VOICE_SCHEME_COUNT,
|
|
MAX_VOICE_SCHEME_COUNT,
|
|
MIN_VOICE_SCHEME_COUNT,
|
|
generateVoiceDesignOptions,
|
|
normalizeVoiceSchemeCount,
|
|
} from '@/components/voice/voice-design-shared'
|
|
|
|
describe('voice-design-shared', () => {
|
|
it('clamps scheme count into the supported range', () => {
|
|
expect(normalizeVoiceSchemeCount(undefined)).toBe(DEFAULT_VOICE_SCHEME_COUNT)
|
|
expect(normalizeVoiceSchemeCount('not-a-number')).toBe(DEFAULT_VOICE_SCHEME_COUNT)
|
|
expect(normalizeVoiceSchemeCount(0)).toBe(MIN_VOICE_SCHEME_COUNT)
|
|
expect(normalizeVoiceSchemeCount(99)).toBe(MAX_VOICE_SCHEME_COUNT)
|
|
expect(normalizeVoiceSchemeCount('5')).toBe(5)
|
|
})
|
|
|
|
it('generates the requested number of voice options with default preview text fallback', async () => {
|
|
const onDesignVoice = vi
|
|
.fn<(_: {
|
|
voicePrompt: string
|
|
previewText: string
|
|
preferredName: string
|
|
language: 'zh'
|
|
}) => Promise<{ voiceId: string; audioBase64: string }>>()
|
|
.mockResolvedValueOnce({ voiceId: 'voice-1', audioBase64: 'audio-1' })
|
|
.mockResolvedValueOnce({ voiceId: 'voice-2', audioBase64: 'audio-2' })
|
|
.mockResolvedValueOnce({ voiceId: 'voice-3', audioBase64: 'audio-3' })
|
|
.mockResolvedValueOnce({ voiceId: 'voice-4', audioBase64: 'audio-4' })
|
|
|
|
const result = await generateVoiceDesignOptions({
|
|
count: '4',
|
|
voicePrompt: ' 温柔女声 ',
|
|
previewText: ' ',
|
|
defaultPreviewText: '默认试听文案',
|
|
onDesignVoice,
|
|
createPreferredName: (index) => `preferred-${index + 1}`,
|
|
})
|
|
|
|
expect(result).toEqual([
|
|
{ voiceId: 'voice-1', audioBase64: 'audio-1', audioUrl: 'data:audio/wav;base64,audio-1' },
|
|
{ voiceId: 'voice-2', audioBase64: 'audio-2', audioUrl: 'data:audio/wav;base64,audio-2' },
|
|
{ voiceId: 'voice-3', audioBase64: 'audio-3', audioUrl: 'data:audio/wav;base64,audio-3' },
|
|
{ voiceId: 'voice-4', audioBase64: 'audio-4', audioUrl: 'data:audio/wav;base64,audio-4' },
|
|
])
|
|
expect(onDesignVoice.mock.calls).toEqual([
|
|
[{ voicePrompt: '温柔女声', previewText: '默认试听文案', preferredName: 'preferred-1', language: 'zh' }],
|
|
[{ voicePrompt: '温柔女声', previewText: '默认试听文案', preferredName: 'preferred-2', language: 'zh' }],
|
|
[{ voicePrompt: '温柔女声', previewText: '默认试听文案', preferredName: 'preferred-3', language: 'zh' }],
|
|
[{ voicePrompt: '温柔女声', previewText: '默认试听文案', preferredName: 'preferred-4', language: 'zh' }],
|
|
])
|
|
})
|
|
|
|
it('fails explicitly when a designed voice is missing voiceId', async () => {
|
|
const onDesignVoice = vi.fn(async () => ({ voiceId: '', audioBase64: 'audio-only' }))
|
|
|
|
await expect(
|
|
generateVoiceDesignOptions({
|
|
count: 1,
|
|
voicePrompt: '旁白',
|
|
previewText: '测试',
|
|
defaultPreviewText: '默认试听文案',
|
|
onDesignVoice,
|
|
}),
|
|
).rejects.toThrow('VOICE_DESIGN_INVALID_RESPONSE: missing voiceId')
|
|
})
|
|
})
|