Files
admin-web/src/views/PermissionsView.test.ts
T

84 lines
2.7 KiB
TypeScript
Raw Normal View History

2026-07-30 17:59:43 +08:00
import { createPinia, setActivePinia } from 'pinia'
import { flushPromises, shallowMount } from '@vue/test-utils'
import { beforeEach, describe, expect, it, vi } from 'vitest'
import { listPlatformPermissions, type PlatformPermissionResource } from '@/api/platformIam'
import { useAuthStore } from '@/stores/auth'
import PermissionsView from './PermissionsView.vue'
vi.mock('@/api/platformIam', () => ({
changePlatformPermissionStatus: vi.fn(),
2026-07-30 17:59:43 +08:00
createPlatformPermission: vi.fn(),
deletePlatformPermission: vi.fn(),
2026-07-30 17:59:43 +08:00
listPlatformPermissions: vi.fn(),
updatePlatformPermission: vi.fn(),
2026-07-30 17:59:43 +08:00
}))
const permission: PlatformPermissionResource = {
id: 5100010,
tenantId: 0,
appCode: 'PLATFORM',
permissionType: 'MENU',
parentId: 5100000,
permissionCode: 'platform:customer:list',
permissionName: '企业客户',
routePath: '/customers',
httpMethod: null,
sortNo: 10,
status: 'ACTIVE',
}
function mountServerView() {
const pinia = createPinia()
setActivePinia(pinia)
const auth = useAuthStore()
auth.isServerSession = true
auth.permissions = ['platform:permission:list', 'platform:permission:create']
return shallowMount(PermissionsView, {
global: {
plugins: [pinia],
directives: { loading: () => undefined },
stubs: {
'el-alert': { props: ['title'], template: '<div role="alert">{{ title }}<slot name="title" /></div>' },
'el-input': true,
'el-option': true,
'el-select': true,
'el-button': true,
'el-table': true,
'el-table-column': true,
'el-input-number': true,
'el-radio-group': true,
'el-radio-button': true,
'el-drawer': { template: '<section><slot /><slot name="footer" /></section>' },
'el-form': { template: '<form><slot /></form>' },
'el-form-item': { template: '<label><slot /></label>' },
},
},
})
}
describe('PermissionsView IAM mode', () => {
beforeEach(() => {
vi.mocked(listPlatformPermissions).mockReset()
})
it('loads the platform permission resource tree from IAM', async () => {
vi.mocked(listPlatformPermissions).mockResolvedValue([permission])
const wrapper = mountServerView()
await flushPromises()
expect(listPlatformPermissions).toHaveBeenCalledTimes(1)
2026-08-03 11:45:45 +08:00
expect(wrapper.text()).toContain('权限资源树')
expect(wrapper.text()).toContain('共 1 项')
2026-07-30 17:59:43 +08:00
})
it('shows a recoverable state when the permission list fails', async () => {
vi.mocked(listPlatformPermissions).mockRejectedValue(new Error('IAM unavailable'))
const wrapper = mountServerView()
await flushPromises()
expect(wrapper.findAll('[role="alert"]').map((item) => item.text()).join(' ')).toContain('IAM unavailable')
})
})