/** * 分配权限抽屉(UserPowerDrawer):头部结构。 * * 数据加载与保存由本组件负责(面板只读展示),测试只锁结构两件事: * 1. 头部常规显示:左侧账号标识标题 + 右侧关闭按钮,页签在内容区顶部; * 2. 三个页签对应三张权限表的内容面板(切换页签不销毁,用 v-show 承载)。 * * 面板自身的规则由 user-power-panel.spec.js 覆盖(含「全授权 / 全禁用」),这里不重复。 */ import { describe, it, expect, beforeEach, vi } from 'vitest' import { mount, flushPromises } from '@vue/test-utils' import UserPowerDrawer from '@/views/system/user/UserPowerDrawer.vue' import { clearMessages } from '@/stores/i18n' vi.mock('@/services/api', () => ({ loadDataApi: vi.fn(), saveObjectApi: vi.fn(() => Promise.resolve({ code: 0, success: true })), })) import { loadDataApi } from '@/services/api' beforeEach(() => { localStorage.clear() sessionStorage.clear() clearMessages() loadDataApi.mockReset() loadDataApi.mockImplementation(() => Promise.resolve({ data: [] })) }) async function mountDrawer() { const wrapper = mount(UserPowerDrawer, { props: { open: true, user: { b_id: '001', b_name: '张三' } }, // Drawer 用 Teleport 到 body;打桩后内容留在原地,选择器才能命中 global: { stubs: { teleport: true } }, }) await flushPromises() return wrapper } describe('分配权限抽屉:头部', () => { it('头部常规显示:账号标识标题 + 关闭按钮,页签在内容区', async () => { const wrapper = await mountDrawer() expect(wrapper.find('.fms-drawer-title').text()).toBe('分配权限 · 张三(001)') expect(wrapper.find('.fms-drawer-close').exists()).toBe(true) // header 让给账号标识:页签不在 header 里,在内容区顶部 expect(wrapper.find('.fms-drawer-header .tabs-nav').exists()).toBe(false) expect(wrapper.find('.power-drawer__nav .tabs-nav').exists()).toBe(true) // 账号级批量按钮不在头部(在功能权限面板的工具栏里) expect(wrapper.find('.fms-drawer-header button.button').exists()).toBe(false) }) it('账号缺名称时标题只回退到编码', async () => { const wrapper = mount(UserPowerDrawer, { props: { open: true, user: { b_id: '001' } }, global: { stubs: { teleport: true } }, }) await flushPromises() expect(wrapper.find('.fms-drawer-title').text()).toBe('分配权限 · 001') }) it('三个页签对应三张权限表的内容面板', async () => { const wrapper = await mountDrawer() expect(wrapper.findAll('.tabs-tab').map((el) => el.text())).toEqual([ '功能权限', '字段权限', '数据范围', ]) expect(wrapper.findAll('.power-pane').map((el) => el.attributes('data-pane'))).toEqual([ 'power', 'field', 'data', ]) }) })