import { createPinia, setActivePinia } from 'pinia' import { readFileSync } from 'node:fs' import { resolve } from 'node:path' import { flushPromises, shallowMount } from '@vue/test-utils' import { beforeEach, describe, expect, it, vi } from 'vitest' import { listPlatformPermissions, type PlatformPermissionResource } from '@/modules/iam/api/platformIam' import { useAuthStore } from '@/core/auth/auth' import PermissionsView from './PermissionsView.vue' const permissionsSource = readFileSync(resolve(process.cwd(), 'src/modules/iam/pages/PermissionsView.vue'), 'utf8') vi.mock('@/modules/iam/api/platformIam', () => ({ changePlatformPermissionStatus: vi.fn(), createPlatformPermission: vi.fn(), deletePlatformPermission: vi.fn(), listPlatformPermissions: vi.fn(), updatePlatformPermission: vi.fn(), })) const permission: PlatformPermissionResource = { id: 5100010, tenantId: 0, appCode: 'PLATFORM', permissionType: 'MENU', parentId: 0, permissionCode: 'platform:customer:list', permissionName: '企业客户', routePath: '/customers', httpMethod: null, sortNo: 10, status: 'ACTIVE', } const allActionPermissions = [ 'platform:permission:list', 'platform:permission:create', 'platform:permission:edit', 'platform:permission:status', 'platform:permission:delete', ] function mountServerView(permissionCodes = ['platform:permission:list', 'platform:permission:create']) { const pinia = createPinia() setActivePinia(pinia) const auth = useAuthStore() auth.isServerSession = true auth.permissions = permissionCodes return shallowMount(PermissionsView, { global: { plugins: [pinia], directives: { loading: () => undefined }, stubs: { AdminPage: { template: '
' }, ListPageLayout: { template: '
' }, FormSection: { template: '
' }, AppDialog: { template: '
' }, LoadErrorState: { props: ['message'], template: '
{{ message }}
' }, DataTable: { props: ['data'], template: '
{{ data.length }}
', }, 'el-alert': { props: ['title'], template: '
{{ title }}
' }, 'el-input': true, 'el-option': true, 'el-select': true, 'el-button': { props: ['disabled'], template: '' }, 'el-dropdown': { template: '' }, 'el-dropdown-menu': { template: '
' }, 'el-dropdown-item': { props: ['disabled'], template: '' }, 'el-table': true, 'el-table-column': true, 'el-input-number': true, 'el-radio-group': true, 'el-radio-button': true, 'el-drawer': { template: '
' }, 'el-form': { template: '
' }, 'el-form-item': { template: '' }, }, }, }) } describe('PermissionsView IAM mode', () => { it('keeps the shared status badge prop defined during table slot initialization', () => { expect(permissionsSource).toContain("(row as Permission).status || '—'") }) it('uses outlined business action buttons while keeping tree view helpers as links', () => { expect(permissionsSource).toContain('size="small" data-tone="neutral" @click="openCreate((row as Permission).id)"') expect(permissionsSource).toContain('size="small" data-tone="neutral" :disabled="rowActionId') expect(permissionsSource).toContain('size="small" :data-tone="(row as Permission).status') expect(permissionsSource).toContain('size="small" data-tone="danger"') expect(permissionsSource).toContain('size="small" :aria-label="moreActionsLabel(row as Permission)"') expect(permissionsSource).toContain('>添加下级') expect(permissionsSource).toContain('>编辑') expect(permissionsSource).toContain(':data-tone=') expect(permissionsSource).toContain('>删除') expect(permissionsSource).toContain('