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.delete;users.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/) })