Files
crawler-plugin/admin-frontend-vue/tests/task-51.test.ts
T
huangzd1997 47d1c6bf80 task-51(账号/权限页面): 实现用户删除确认和刷新
新增 user-delete-model.ts 纯模型:deleteConfirmMessage/deleteBlockReason 镜像 Java
deleteUser 约束(不能删自己/超管)、isDeletableUser。users.ts 增 deleteUser DELETE
/api/admin/user/{uid} 并由 unwrap 抛后端 message;UsersPage 删除改走 adapter、二次确认后
刷新列表(超管行直接告警拦截),不再内联 http.delete、不入 session store。
8 用例全过,371 单测 + build 绿。
2026-09-05 15:09:55 +08:00

64 lines
3.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import test from 'node:test'
import assert from 'node:assert/strict'
import { readSource } from './helpers.ts'
import { deleteBlockReason, deleteConfirmMessage, isDeletableUser } from '../src/pages/account/user-delete-model.ts'
import type { AdminUser } from '../src/types/admin.ts'
test('test_task_051_user_delete_normal_primary_path', () => {
// 正常主路径:非超管且非当前登录账号可删除,确认文案带用户名。
const row: AdminUser = { id: 3, username: '运营一', role: 'normal' }
assert.equal(isDeletableUser(row, 1), true)
assert.equal(deleteBlockReason(row, 1), undefined)
assert.match(deleteConfirmMessage(row), /运营一/)
})
test('test_task_051_user_delete_normal_variant_input', () => {
// 正常变体:admin 角色用户亦可删除(仅超管/自己受限)。
assert.equal(isDeletableUser({ id: 4, username: 'mgr', role: 'admin' }, 1), true)
assert.equal(deleteConfirmMessage({ id: 4, username: 'mgr', role: 'admin' }), '确定删除用户“mgr”吗?删除后不可恢复。')
})
test('test_task_051_user_delete_normal_repeated_operation_is_idempotent', () => {
// 正常重复:纯函数结果稳定、不改输入。
const row: AdminUser = { id: 5, username: 'u', role: 'normal' }
assert.equal(deleteBlockReason(row, 1), deleteBlockReason(row, 1))
assert.equal(row.role, 'normal')
})
test('test_task_051_user_delete_boundary_empty_input', () => {
// 边界空值:缺用户行给可操作原因;空用户名不崩溃。
assert.match(deleteBlockReason(null, 1) || '', /用户/)
assert.equal(isDeletableUser(null, 1), false)
})
test('test_task_051_user_delete_boundary_single_item', () => {
// 边界单元素:单条普通用户可删除。
assert.equal(isDeletableUser({ id: 7, username: 'a', role: 'normal' }, 2), true)
})
test('test_task_051_user_delete_boundary_limit_or_missing_field', () => {
// 边界上限/缺当前 id:未带当前 id 时仅超管受限。
assert.equal(isDeletableUser({ id: 8, username: 'b', role: 'normal' }, undefined), true)
assert.match(deleteBlockReason({ id: 9, username: 'root', role: 'super_admin' }, 1) || '', /超级管理员/)
})
test('test_task_051_user_delete_invalid_input_rejected', () => {
// 异常输入:不能删自己、不能删超管。
assert.match(deleteBlockReason({ id: 1, username: 'me', role: 'normal' }, 1) || '', /当前登录/)
assert.equal(isDeletableUser({ id: 1, username: 'me', role: 'normal' }, 1), false)
assert.equal(isDeletableUser({ id: 9, username: 'root', role: 'super_admin' }, 2), false)
})
test('test_task_051_user_delete_dependency_failure_returns_actionable_message', () => {
// 依赖失败/删除走 adapter:页面不再内联 http.deleteusers.ts 负责 DELETE + 解包。
const mod = readSource('src/pages/account/user-delete-model.ts')
assert.equal(/axios|http\./.test(mod), false, '删除模型保持纯逻辑')
const page = readSource('src/pages/account/UsersPage.vue')
assert.match(page, /deleteUser/)
assert.equal(/http\.delete/.test(page), false, '页面不再内联删除请求')
const users = readSource('src/api/users.ts')
assert.match(users, /deleteUser/)
assert.match(users, /http\.delete/)
assert.match(users, /api\/admin\/user/)
})