同步移动端源码并修复小程序嵌入标题
Some checks failed
CI / verify (push) Has been cancelled

This commit is contained in:
lyf
2026-07-28 18:37:40 +08:00
parent 06ad609e1f
commit 540bb8627f
62 changed files with 4196 additions and 1410 deletions

View File

@@ -1,84 +1,92 @@
// @vitest-environment happy-dom
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import { describe, expect, it } from 'vitest'
import { mount } from '@vue/test-utils'
import ArrivalPanel from '@/components/navigation/ArrivalPanel.vue'
import { ARRIVAL_TARGETS } from '@/data/arrivalSearchTargets'
import { openExternalNavigation } from '@/services/MapNavigationService'
import { openWechatMiniProgramLocation } from '@/services/WechatMiniProgramBridgeService'
vi.mock('@/services/MapNavigationService', () => ({ openExternalNavigation: vi.fn() }))
vi.mock('@/services/WechatMiniProgramBridgeService', () => ({ openWechatMiniProgramLocation: vi.fn() }))
const selectedTarget = ARRIVAL_TARGETS.find((target) => target.type === 'parking')!
const selectedTarget = ARRIVAL_TARGETS[1]
const defaultUserAgent = window.navigator.userAgent
const mountArrivalPanel = () => mount(ArrivalPanel, {
const mountArrivalPanel = (overrides: Record<string, unknown> = {}) => mount(ArrivalPanel, {
props: {
visible: true,
activeType: selectedTarget.type,
targets: [selectedTarget],
selectedTargetId: selectedTarget.id,
selectedTarget
mode: 'browse',
activeType: null,
targets: [],
selectedTargetId: '',
selectedTarget: null,
loading: false,
error: '',
...overrides
}
})
beforeEach(() => {
vi.mocked(openExternalNavigation).mockResolvedValue(true)
vi.mocked(openWechatMiniProgramLocation).mockResolvedValue({ status: 'not-embedded' })
vi.stubGlobal('uni', { showToast: vi.fn(), showActionSheet: vi.fn() })
window.history.replaceState({}, '', '/#/pages/index/index?tab=guide')
delete (window as Window & { __wxjs_environment?: string }).__wxjs_environment
Object.defineProperty(window.navigator, 'userAgent', { configurable: true, value: 'Mozilla/5.0 (Linux; Android 14)' })
})
describe('来馆目的地选择', () => {
it('初始只显示分类入口,默认不选中也不请求或展示附近点位', async () => {
const wrapper = mountArrivalPanel()
const tabs = wrapper.findAll('.arrival-tab')
afterEach(() => {
Object.defineProperty(window.navigator, 'userAgent', { configurable: true, value: defaultUserAgent })
delete (window as Window & { __wxjs_environment?: string }).__wxjs_environment
vi.clearAllMocks()
vi.unstubAllGlobals()
})
expect(tabs.every((tab) => !tab.classes('active'))).toBe(true)
expect(wrapper.find('.arrival-target-row').exists()).toBe(false)
await tabs[0].trigger('tap')
describe('来馆面板 H5 导航分流', () => {
it('嵌入小程序 web-view 时只向宿主页面导航,且完整传递当前选中目标', async () => {
Object.assign(window, { __wxjs_environment: 'miniprogram' })
Object.defineProperty(window.navigator, 'userAgent', { configurable: true, value: 'Mozilla/5.0 MicroMessenger/8.0.50' })
vi.mocked(openWechatMiniProgramLocation).mockResolvedValue({ status: 'opened' })
expect(wrapper.emitted('typeChange')).toEqual([['bus']])
expect(wrapper.find('.arrival-primary').exists()).toBe(false)
})
it('选择列表点位后向父级交付完整的地图目标', async () => {
const wrapper = mountArrivalPanel({
activeType: selectedTarget.type,
targets: [selectedTarget]
})
await wrapper.get('.arrival-target-row').trigger('tap')
expect(wrapper.emitted('selectTarget')).toEqual([[selectedTarget]])
})
it('详情态不展示冗余标题,关闭后回到分类查询', async () => {
const wrapper = mountArrivalPanel({
mode: 'detail',
selectedTargetId: selectedTarget.id,
selectedTarget
})
expect(wrapper.text()).toContain(selectedTarget.title)
expect(wrapper.text()).not.toContain('目的地详情')
await wrapper.get('.arrival-primary').trigger('tap')
await wrapper.get('.arrival-close').trigger('tap')
expect(wrapper.emitted('navigate')).toEqual([[selectedTarget]])
expect(wrapper.emitted('back')).toHaveLength(1)
})
it('分类查询态不显示关闭按钮', () => {
const wrapper = mountArrivalPanel()
expect(wrapper.get('.arrival-primary-text').text()).toBe('打开地图导航')
await wrapper.get('.arrival-primary').trigger('tap')
expect(openWechatMiniProgramLocation).toHaveBeenCalledTimes(1)
expect(openWechatMiniProgramLocation).toHaveBeenCalledWith({
latitude: selectedTarget.latitude,
longitude: selectedTarget.longitude,
name: selectedTarget.title,
address: selectedTarget.subtitle
})
expect(openExternalNavigation).not.toHaveBeenCalled()
expect((uni as unknown as { showActionSheet: ReturnType<typeof vi.fn> }).showActionSheet).not.toHaveBeenCalled()
expect(wrapper.find('.arrival-close').exists()).toBe(false)
expect(wrapper.find('.arrival-collapse').exists()).toBe(false)
})
it('普通 H5 仅回退至第三方地图,并使用当前选中目标', async () => {
const wrapper = mountArrivalPanel()
expect(wrapper.get('.arrival-primary-text').text()).toBe('第三方导航')
await wrapper.get('.arrival-primary').trigger('tap')
expect(openExternalNavigation).toHaveBeenCalledWith({
latitude: selectedTarget.latitude,
longitude: selectedTarget.longitude,
name: selectedTarget.title,
address: selectedTarget.subtitle
it('展开分类结果后可收起到初始分类栏', async () => {
const wrapper = mountArrivalPanel({
activeType: selectedTarget.type,
targets: [selectedTarget]
})
await wrapper.get('.arrival-collapse').trigger('tap')
expect(wrapper.emitted('collapse')).toHaveLength(1)
})
it('诊断信息默认隐藏,仅在 debug-build=1 时显示构建边界', () => {
const normalWrapper = mountArrivalPanel()
expect(normalWrapper.find('[data-testid="arrival-build-diagnostics"]').exists()).toBe(false)
normalWrapper.unmount()
it('服务异常时提供原位重试,不展示失真的静态结果', async () => {
const wrapper = mountArrivalPanel({
activeType: selectedTarget.type,
error: '周边点位暂时无法加载'
})
window.location.hash = '#/pages/index/index?tab=guide&debug-build=1'
const debugWrapper = mountArrivalPanel()
expect(debugWrapper.get('[data-testid="arrival-build-diagnostics"]').text()).toContain('构建平台h5')
expect(wrapper.text()).toContain('周边点位暂时无法加载')
await wrapper.get('.arrival-retry').trigger('tap')
expect(wrapper.emitted('retry')).toHaveLength(1)
})
})