// @vitest-environment happy-dom import { describe, expect, it } from 'vitest' import { mount } from '@vue/test-utils' import OutdoorArrivalRoutePanel from '@/components/navigation/OutdoorArrivalRoutePanel.vue' const destination = { title: '深圳自然博物馆[公交站]', address: 'M574路', latitude: 22.69258, longitude: 114.36372 } const start = { name: '我的位置', latitude: 22.688, longitude: 114.359 } const mountPanel = (overrides: Record = {}) => mount(OutdoorArrivalRoutePanel, { props: { visible: true, phase: 'permission-needed', destination, startPoint: null, loading: false, routeError: '', routeDistance: 0, routeDuration: 0, manualSearchResults: [], manualSearchLoading: false, ...overrides } }) describe('来馆路线起点确认', () => { it('定位不可用时提示重新检测或手动选择,而不显示旧馆外导览界面', async () => { const wrapper = mountPanel({ locationMessage: '请在微信小程序的设置中开启位置权限后重试' }) expect(wrapper.text()).toContain('暂未获取实时位置') expect(wrapper.text()).toContain('重新检测') expect(wrapper.text()).toContain('手动选择起点') expect(wrapper.text()).not.toContain('馆外导览') await wrapper.get('.outdoor-route-action.secondary').trigger('tap') await wrapper.get('.outdoor-route-action.primary').trigger('tap') expect(wrapper.emitted('retryLocation')).toHaveLength(1) expect(wrapper.emitted('manualStartRequest')).toHaveLength(1) }) it('浏览器已拒绝位置权限时,重新检测区域会给出明确的设置指引', () => { const wrapper = mountPanel({ locationHelpVisible: true, locationMessage: '当前位置权限已关闭' }) expect(wrapper.text()).toContain('请开启位置权限') expect(wrapper.text()).toContain('微信小程序的设置') expect(wrapper.text()).toContain('重新检测') }) it('手动选择的起点保留确认操作,避免误用地图点位', async () => { const wrapper = mountPanel({ phase: 'confirm-start', startPoint: { ...start, name: '深圳北站' } }) expect(wrapper.text()).toContain('深圳北站') expect(wrapper.text()).toContain('从这里出发') await wrapper.get('.outdoor-route-action.primary').trigger('tap') await wrapper.get('.outdoor-route-text-action').trigger('tap') expect(wrapper.emitted('confirmStart')).toHaveLength(1) expect(wrapper.emitted('manualStartRequest')).toHaveLength(1) }) it('手动起点支持输入地点与地图选点两条路径', async () => { const wrapper = mountPanel({ phase: 'manual-search' }) await wrapper.get('.outdoor-route-switch + .outdoor-route-switch').trigger('tap') expect(wrapper.emitted('manualMapRequest')).toHaveLength(1) await wrapper.setProps({ manualSearchResults: [{ id: 'ping-shan-station', title: '深圳坪山站', address: '深圳市坪山区', category: '火车站', latitude: 22.699, longitude: 114.347 }] }) await wrapper.get('.outdoor-route-search-result').trigger('tap') expect(wrapper.emitted('manualStartConfirm')).toEqual([[expect.objectContaining({ id: 'ping-shan-station', title: '深圳坪山站' })]]) }) it('路线已生成时仅展示路线结果,不重复显示出行方式选择', () => { const wrapper = mountPanel({ phase: 'route', startPoint: start, routeDistance: 1850, routeDuration: 14 }) expect(wrapper.text()).toContain('1.9 公里') expect(wrapper.text()).toContain('约 14 分钟') expect(wrapper.text()).toContain('路线已显示在地图上') expect(wrapper.find('.outdoor-route-mode-list').exists()).toBe(false) }) })