Files
frontend-miniapp/tests/unit/GuideAudioOptions.spec.ts
lyf 9ea1bfab71
Some checks failed
CI / verify (push) Has been cancelled
同步 sgs-frontend-mobile 源码
2026-07-27 11:26:01 +08:00

103 lines
3.0 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import {
toGuideStopInfo
} from '@/data/adapters/guideStopInfoAdapter'
import {
canToggleGuideAudioGender,
GUIDE_AUDIO_LANGUAGE_OPTIONS,
resolveGuideAudioOption
} from '@/domain/guideAudioOptions'
import type { MuseumGuideAudioOption } from '@/domain/museum'
const audioOptions: MuseumGuideAudioOption[] = [
{
channelCode: 'standard.zh-CN.female',
languageCode: 'zh-CN',
gender: 'female',
playUrl: '/audio/zh-female.mp3',
isDefault: true,
sortOrder: 10
},
{
channelCode: 'standard.zh-CN.male',
languageCode: 'zh-CN',
gender: 'male',
playUrl: '/audio/zh-male.mp3',
sortOrder: 20
},
{
channelCode: 'standard.en-US.female',
languageCode: 'en-US',
gender: 'female',
playUrl: '/audio/en-female.mp3'
},
{
channelCode: 'standard.en-US.male',
languageCode: 'en-US',
gender: 'male',
playUrl: '/audio/en-male.mp3'
},
{
channelCode: 'standard.yue-HK.female',
languageCode: 'yue-HK',
gender: 'female',
playUrl: '/audio/yue-female.mp3'
}
]
describe('guide audio options', () => {
it('parses directly playable audio options from stop-info', () => {
const stopInfo = toGuideStopInfo({
available: true,
targetType: 'STOP',
targetId: '100',
lang: 'zh-CN',
title: '测试讲解',
audioStatus: 'READY',
audioOptionCount: 5,
audioOptions: audioOptions.map((option) => ({
...option,
duration: 120
}))
}, {
targetType: 'STOP',
targetId: '100',
lang: 'zh-CN'
})
expect(stopInfo.audioOptions).toHaveLength(5)
expect(stopInfo.audioOptions[1]).toMatchObject({
channelCode: 'standard.zh-CN.male',
languageCode: 'zh-CN',
gender: 'male',
playUrl: '/audio/zh-male.mp3',
duration: 120
})
expect(stopInfo.supportedLanguages).toEqual(['zh-CN', 'en-US', 'yue-HK'])
})
it('keeps tabs in Chinese, English, Cantonese order and defaults Chinese and English to male', () => {
expect(GUIDE_AUDIO_LANGUAGE_OPTIONS.map((option) => option.value)).toEqual([
'zh-CN',
'en-US',
'yue-HK'
])
expect(resolveGuideAudioOption(audioOptions, 'zh-CN', 'male')?.channelCode)
.toBe('standard.zh-CN.male')
expect(resolveGuideAudioOption(audioOptions, 'en-US', 'male')?.channelCode)
.toBe('standard.en-US.male')
})
it('shares the selected voice between Chinese and English, while Cantonese is female-only', () => {
const selectedGender = 'female' as const
expect(resolveGuideAudioOption(audioOptions, 'zh-CN', selectedGender)?.channelCode)
.toBe('standard.zh-CN.female')
expect(resolveGuideAudioOption(audioOptions, 'en-US', selectedGender)?.channelCode)
.toBe('standard.en-US.female')
expect(resolveGuideAudioOption(audioOptions, 'yue-HK', 'male')?.channelCode)
.toBe('standard.yue-HK.female')
expect(canToggleGuideAudioGender(audioOptions, 'zh-CN')).toBe(true)
expect(canToggleGuideAudioGender(audioOptions, 'yue-HK')).toBe(false)
})
})