// @vitest-environment happy-dom 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' const selectedTarget = ARRIVAL_TARGETS.find((target) => target.type === 'parking')! const mountArrivalPanel = (overrides: Record = {}) => mount(ArrivalPanel, { props: { visible: true, mode: 'browse', activeType: null, targets: [], selectedTargetId: '', selectedTarget: null, loading: false, error: '', ...overrides } }) describe('来馆目的地选择', () => { it('初始只显示分类入口,默认不选中也不请求或展示附近点位', async () => { const wrapper = mountArrivalPanel() const tabs = wrapper.findAll('.arrival-tab') expect(tabs.every((tab) => !tab.classes('active'))).toBe(true) expect(wrapper.find('.arrival-target-row').exists()).toBe(false) await tabs[0].trigger('tap') 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.find('.arrival-close').exists()).toBe(false) expect(wrapper.find('.arrival-collapse').exists()).toBe(false) }) it('展开分类结果后可收起到初始分类栏', async () => { const wrapper = mountArrivalPanel({ activeType: selectedTarget.type, targets: [selectedTarget] }) await wrapper.get('.arrival-collapse').trigger('tap') expect(wrapper.emitted('collapse')).toHaveLength(1) }) it('服务异常时提供原位重试,不展示失真的静态结果', async () => { const wrapper = mountArrivalPanel({ activeType: selectedTarget.type, error: '周边点位暂时无法加载' }) expect(wrapper.text()).toContain('周边点位暂时无法加载') await wrapper.get('.arrival-retry').trigger('tap') expect(wrapper.emitted('retry')).toHaveLength(1) }) })