适配讲解详情聚合接口

This commit is contained in:
lyf
2026-07-22 19:40:17 +08:00
parent dd29ead041
commit 4d8cc55a5c
10 changed files with 440 additions and 152 deletions

View File

@@ -9,6 +9,7 @@ const mocks = vi.hoisted(() => ({
onHideHandler: null as null | (() => void),
onUnloadHandler: null as null | (() => void),
enterExplainDetail: vi.fn(),
selectExplainDetailLanguage: vi.fn(),
loadExplainDetailText: vi.fn(),
selectAudioForExplainDetail: vi.fn(),
play: vi.fn(),
@@ -43,6 +44,7 @@ vi.mock('@dcloudio/uni-app', () => ({
vi.mock('@/usecases/explainUseCase', () => ({
explainUseCase: {
enterExplainDetail: mocks.enterExplainDetail,
selectExplainDetailLanguage: mocks.selectExplainDetailLanguage,
loadExplainDetailText: mocks.loadExplainDetailText,
selectAudioForExplainDetail: mocks.selectAudioForExplainDetail
}
@@ -110,6 +112,10 @@ describe('讲解详情音频优先布局', () => {
audioState.currentTime.value = 0
audioState.duration.value = 0
mocks.enterExplainDetail.mockResolvedValue(exhibit)
mocks.selectExplainDetailLanguage.mockImplementation((source, lang) => ({
...source,
audioLanguage: lang
}))
mocks.loadExplainDetailText.mockResolvedValue({ available: false })
mocks.selectAudioForExplainDetail.mockResolvedValue({
playable: true,
@@ -191,7 +197,7 @@ describe('讲解详情音频优先布局', () => {
expect(wrapper.find('.detail-language-bar').exists()).toBe(false)
})
it('深链语言不受支持时回退至中文并规范化地址', async () => {
it('深链语言不受支持时本地回退至中文并规范化地址', async () => {
mocks.enterExplainDetail.mockImplementation(async (request: { lang: string }) => ({
...exhibit,
audioLanguage: request.lang,
@@ -205,8 +211,9 @@ describe('讲解详情音频优先布局', () => {
await mocks.onLoadHandler?.({ id: exhibit.id, lang: 'en-US', targetType: 'STOP', targetId: 'stop-1' })
await flushPromises()
expect(mocks.enterExplainDetail).toHaveBeenNthCalledWith(1, expect.objectContaining({ lang: 'en-US' }))
expect(mocks.enterExplainDetail).toHaveBeenNthCalledWith(2, expect.objectContaining({ lang: 'zh-CN' }))
expect(mocks.enterExplainDetail).toHaveBeenCalledTimes(1)
expect(mocks.enterExplainDetail).toHaveBeenCalledWith(expect.objectContaining({ lang: 'en-US' }))
expect(mocks.selectExplainDetailLanguage).toHaveBeenCalledWith(expect.any(Object), 'zh-CN')
expect(wrapper.get('.language-option').classes()).toContain('active')
expect(wrapper.get('.language-option-text').text()).toBe('中文')
expect(replaceState).toHaveBeenCalledWith(null, '', expect.stringContaining('lang=zh-CN'))
@@ -244,6 +251,34 @@ describe('讲解详情音频优先布局', () => {
expect(wrapper.get('.detail-audio-play').attributes('disabled')).toBeDefined()
})
it('切换语言时使用初次详情响应中的变体,不重复请求详情或正文', async () => {
const localizedExhibit = {
...exhibit,
guideText: '粤语通道使用普通话文案。',
audioUrl: '/assets/astrolabe-yue.mp3',
audioDuration: 83,
audioLanguage: 'yue-HK',
audioStatus: 'READY',
audioHasText: true,
supportedLanguages: ['zh-CN', 'yue-HK', 'en-US']
}
mocks.selectExplainDetailLanguage.mockReturnValue(localizedExhibit)
const wrapper = mount(ExhibitDetail, {
global: { stubs: { GuidePageFrame: GuidePageFrameStub } }
})
await mocks.onLoadHandler?.({ id: exhibit.id, lang: 'en-US', targetType: 'STOP', targetId: 'stop-1' })
await flushPromises()
await wrapper.findAll('.language-option').find((node) => node.text() === '粤语')?.trigger('tap')
await flushPromises()
expect(mocks.enterExplainDetail).toHaveBeenCalledTimes(1)
expect(mocks.loadExplainDetailText).not.toHaveBeenCalled()
expect(mocks.selectExplainDetailLanguage).toHaveBeenCalledWith(expect.any(Object), 'yue-HK')
expect(wrapper.get('.section-text').text()).toContain('粤语通道使用普通话文案')
expect(wrapper.get('.detail-audio-subtitle').text()).toContain('粤语')
})
it('无音频时禁用播放按钮并显示原因', async () => {
mocks.enterExplainDetail.mockResolvedValue({
...exhibit,