diff --git a/frontend/src/components/__tests__/admin_next/AdminUserDetail.spec.js b/frontend/src/components/__tests__/admin_next/AdminUserDetail.spec.js new file mode 100644 index 000000000..9fc1ea91f --- /dev/null +++ b/frontend/src/components/__tests__/admin_next/AdminUserDetail.spec.js @@ -0,0 +1,89 @@ +import { describe, expect, it, vi } from 'vitest' +import { flushPromises, mount } from '@vue/test-utils' +import { ElMessage, ElMessageBox } from 'element-plus' +import AdminUserDetail from '@/components/admin_next/users/AdminUserDetail.vue' + +const { deleteUser, fetchUser, routerPush, useFetchApiMock } = vi.hoisted(() => ({ + deleteUser: vi.fn(), + fetchUser: vi.fn(), + routerPush: vi.fn(), + useFetchApiMock: vi.fn() +})) + +vi.mock('element-plus', () => ({ + ElMessage: Object.assign(vi.fn(), { + error: vi.fn(), + success: vi.fn() + }), + ElMessageBox: { + confirm: vi.fn() + } +})) + +vi.mock('vue-router', () => ({ + useRoute: () => ({ params: { id: 'user-uuid' } }), + useRouter: () => ({ push: routerPush }) +})) + +vi.mock('@/components/admin_next/router', () => ({ + BASE_URL: '/admin_panel' +})) + +vi.mock('@/stores/UserStore', () => ({ + default: () => ({ username: 'admin-user' }) +})) + +vi.mock('@/packs/useFetchApi', () => ({ + default: useFetchApiMock +})) + +const createWrapper = () => mount(AdminUserDetail, { + global: { + stubs: { + Container: { template: '
' }, + Card: { template: '
' }, + CsgButton: { + inheritAttrs: false, + props: ['name'], + template: '' + } + } + } +}) + +describe('AdminUserDetail', () => { + it('deletes the user after confirmation and returns to the user list', async () => { + fetchUser.mockResolvedValue({ + data: { + value: { + data: { + uuid: 'user-uuid', + username: 'target-user', + roles: [] + } + } + } + }) + deleteUser.mockResolvedValue({ data: { value: true }, error: { value: null } }) + ElMessageBox.confirm.mockResolvedValue() + useFetchApiMock.mockImplementation((url) => { + if (url === '/user/user-uuid') { + return { json: fetchUser } + } + + return { delete: () => ({ json: deleteUser }) } + }) + + const wrapper = createWrapper() + await flushPromises() + + await wrapper.find('.btn-danger').trigger('click') + await flushPromises() + + expect(ElMessageBox.confirm).toHaveBeenCalledOnce() + expect(useFetchApiMock).toHaveBeenCalledWith('/user/target-user?current_user=admin-user') + expect(deleteUser).toHaveBeenCalledOnce() + expect(ElMessage.success).toHaveBeenCalled() + expect(routerPush).toHaveBeenCalledWith('/admin_panel/users') + }) +}) diff --git a/frontend/src/components/admin_next/users/AdminUserDetail.vue b/frontend/src/components/admin_next/users/AdminUserDetail.vue index 3f9876714..b959f6545 100644 --- a/frontend/src/components/admin_next/users/AdminUserDetail.vue +++ b/frontend/src/components/admin_next/users/AdminUserDetail.vue @@ -37,6 +37,10 @@ @@ -81,13 +85,19 @@