import { describe, expect, it } from 'vitest' import { toGuideStopInfo } from '@/data/adapters/guideStopInfoAdapter' describe('guide stop-info adapter', () => { it('normalizes aggregated language variants and exposes only displayable languages', () => { const result = toGuideStopInfo({ available: true, targetType: 'STOP', targetId: '9001', lang: 'zh-CN', imageStatus: 'READY', coverImageUrl: '/museum-assets/cover.webp', languageVariants: [ { lang: 'zh', enabled: true, playable: true, audioStatus: 'READY', playUrl: '/museum-assets/audio/zh.mp3', duration: '50', audioId: 12, hasText: true, textAvailable: true, text: '普通话讲解词', textLength: '6', textHash: 'zh-hash' }, { lang: 'yue-HK', enabled: true, playable: false, audioStatus: 'MISSING', textAvailable: true, text: '粤语使用普通话文案', reason: 'NO_PUBLISHED_AUDIO' }, { lang: 'en-US', enabled: false, playable: true, playUrl: '/museum-assets/audio/en.mp3' } ] }, { targetType: 'STOP', targetId: '9001', lang: 'zh-CN' }) expect(result.supportedLanguages).toEqual(['zh-CN', 'yue-HK']) expect(result.languageVariants['zh-CN']).toMatchObject({ playable: true, playUrl: '/museum-assets/audio/zh.mp3', duration: 50, audioId: '12', text: '普通话讲解词', textLength: 6 }) expect(result.languageVariants['yue-HK']).toMatchObject({ playable: false, textAvailable: true, reason: 'NO_PUBLISHED_AUDIO' }) }) it('keeps supportedLanguages as the compatibility fallback when variants are absent', () => { const result = toGuideStopInfo({ supportedLanguages: ['zh-CN', 'en-US'] }, { targetType: 'STOP', targetId: '9001', lang: 'zh-CN' }) expect(result.supportedLanguages).toEqual(['zh-CN', 'en-US']) expect(result.languageVariants).toEqual({}) }) it('uses playable audio options as the primary language and voice contract', () => { const result = toGuideStopInfo({ supportedLanguages: ['zh-CN', 'yue-HK'], audioOptions: [ { channelCode: 'standard.zh-CN.male', displayName: '普通话男声', languageCode: 'zh-CN', gender: 'male', playUrl: '/museum-assets/audio/zh-male.mp3', duration: '51', isDefault: false, sortOrder: 11 }, { channelCode: 'standard.en-US.female', displayName: '英文女声', languageCode: 'en-US', gender: 'female', playUrl: '/museum-assets/audio/en-female.mp3', duration: 49, isDefault: true, sortOrder: 20 }, { channelCode: 'standard.zh-CN.female', displayName: '普通话女声', languageCode: 'zh-CN', gender: 'female', playUrl: '/museum-assets/audio/zh-female.mp3', isDefault: true, sortOrder: 10 }, { channelCode: 'invalid', languageCode: 'zh-CN', gender: 'female' } ] }, { targetType: 'STOP', targetId: '9001', lang: 'zh-CN' }) expect(result.supportedLanguages).toEqual(['zh-CN', 'en-US']) expect(result.audioOptions.map((option) => option.channelCode)).toEqual([ 'standard.zh-CN.female', 'standard.zh-CN.male', 'standard.en-US.female' ]) expect(result.audioOptions[0]).toMatchObject({ displayName: '普通话女声', gender: 'female', playUrl: '/museum-assets/audio/zh-female.mp3', isDefault: true }) }) })