68 lines
2.8 KiB
TypeScript
68 lines
2.8 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import { toGuideStopDetail } from '@/data/adapters/guideStopInfoAdapter'
|
|
|
|
const languages = ['zh-CN', 'en-US', 'yue-HK'] as const
|
|
|
|
describe('unified guide stop detail adapter', () => {
|
|
it('preserves snowflake IDs, synthesizes stable track codes, and ignores images marked missing', () => {
|
|
const textVariants = languages.map((languageCode) => ({
|
|
version: 'standard',
|
|
languageCode,
|
|
text: `standard-${languageCode}`
|
|
}))
|
|
const audioTracks = languages.flatMap((languageCode) => (
|
|
languageCode === 'yue-HK'
|
|
? [{ version: 'standard', languageCode, gender: 'female', playUrl: `/standard-${languageCode}-female.mp3` }]
|
|
: ['female', 'male'].map((gender) => ({ version: 'standard', languageCode, gender, playUrl: `/standard-${languageCode}-${gender}.mp3` }))
|
|
))
|
|
const detail = toGuideStopDetail({
|
|
id: '865546647764037632',
|
|
version: 'standard',
|
|
outlineId: '7467940240901013505',
|
|
linkedExhibits: [{ id: '865546647764037633', name: '关联展品' }],
|
|
name: '青铜神树',
|
|
coverImageUrl: '/should-not-be-used.webp',
|
|
galleryUrls: '["/should-not-be-used-gallery.webp"]',
|
|
imageStatus: 'MISSING',
|
|
recommendedTrackCode: 'standard.zh-CN.female',
|
|
textVariants,
|
|
audioTracks,
|
|
textVariantCount: 3,
|
|
audioTrackCount: 5
|
|
})
|
|
|
|
expect(detail.id).toBe('865546647764037632')
|
|
expect(detail.version).toBe('standard')
|
|
expect(detail.outlineId).toBe('7467940240901013505')
|
|
expect(detail.linkedExhibits[0]?.id).toBe('865546647764037633')
|
|
expect(detail.coverImageUrl).toBeUndefined()
|
|
expect(detail.galleryUrls).toEqual([])
|
|
expect(detail.textVariants).toHaveLength(3)
|
|
expect(detail.audioTracks).toHaveLength(5)
|
|
expect(detail.recommendedTrackCode).toBe('standard.zh-CN.female')
|
|
expect(detail.audioTracks.find((track) => track.channelCode === 'standard.zh-CN.female')?.playUrl)
|
|
.toBe('/standard-zh-CN-female.mp3')
|
|
})
|
|
|
|
it('drops unusable tracks while retaining a Chinese text variant for Cantonese fallback', () => {
|
|
const detail = toGuideStopDetail({
|
|
id: 'stop-1',
|
|
version: 'extended',
|
|
name: '测试',
|
|
imageStatus: 'READY',
|
|
textVariants: [{ version: 'extended', languageCode: 'zh-CN', text: '普通话正文' }],
|
|
audioTracks: [
|
|
{ version: 'extended', languageCode: 'yue-HK', gender: 'female', playUrl: '/cantonese.mp3' },
|
|
{ version: 'extended', languageCode: 'zh-CN', gender: 'female' }
|
|
]
|
|
})
|
|
|
|
expect(detail.version).toBe('extended')
|
|
expect(detail.textVariants[0]?.text).toBe('普通话正文')
|
|
expect(detail.audioTracks).toEqual([expect.objectContaining({
|
|
channelCode: 'extended.yue-HK.female',
|
|
gender: 'female'
|
|
})])
|
|
})
|
|
})
|