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 @@