import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { mount, type VueWrapper } from '@vue/test-utils'; import { defineComponent, h } from 'vue'; import PlatformCompareButton from '../src/views/collection/video/components/platform-compare-button.vue'; import type { PlatformResourceType } from '../src/api/collection/videoPlatform'; const spies = vi.hoisted(() => ({ open: vi.fn(), permissions: new Set() })); vi.mock('/@/utils/authFunction', () => ({ auth: (permission: string) => spies.permissions.has(permission) })); vi.mock('/@/views/collection/video/components/platform-resource-dialog.vue', () => ({ default: { name: 'PlatformResourceDialog', emits: ['changed'], setup: (_: unknown, { expose }: any) => { expose({ open: spies.open }); return () => null; }, }, })); const wrappers: VueWrapper[] = []; const Button = defineComponent({ setup: (_, { slots }) => () => h('button', slots.default?.()) }); const renderButton = (resourceType: PlatformResourceType) => { const wrapper = mount(PlatformCompareButton, { props: { resourceType }, global: { stubs: { ElButton: Button }, } }); wrappers.push(wrapper); return wrapper; }; beforeEach(() => { spies.open.mockClear(); spies.permissions.clear(); }); afterEach(() => wrappers.splice(0).forEach(wrapper => wrapper.unmount())); describe('ICC 数据对比快捷入口', () => { it.each([ ['PERSON', '人员', 'admin_sysPerson_view'], ['CAR', '车辆', 'car_carManage_view'], ['DEVICE', '设备', 'admin_deviceManage_view'], ['CHANNEL', '通道', 'admin_deviceManage_view'], ] as const)('%s 点击后打开相应全量差异弹窗,首次显示列表时不请求对比', async (type, label, permission) => { spies.permissions.add(permission); const wrapper = renderButton(type); expect(spies.open).not.toHaveBeenCalled(); expect(wrapper.get('button').text()).toBe('ICC 数据对比'); expect(wrapper.get('button').attributes('title')).toBe(`对比 ICC 与本地已同步的全部${label}数据`); await wrapper.get('button').trigger('click'); expect(spies.open).toHaveBeenCalledWith(type, 'DIFFERENCE', `ICC ${label}数据对比`); }); it('仅有设备权限时,不展示人员、车辆的对比入口', () => { spies.permissions.add('admin_deviceManage_view'); expect(renderButton('PERSON').find('button').exists()).toBe(false); expect(renderButton('CAR').find('button').exists()).toBe(false); expect(spies.open).not.toHaveBeenCalled(); }); it('差异修复完成后通知列表刷新', () => { spies.permissions.add('admin_sysPerson_view'); const wrapper = renderButton('PERSON'); wrapper.findComponent({ name: 'PlatformResourceDialog' }).vm.$emit('changed'); expect(wrapper.emitted('changed')).toHaveLength(1); }); });