import test from 'node:test' import assert from 'node:assert/strict' import { readSource } from './helpers.ts' import { fillEditUserForm, isEditableUser, toEditUserUpdateRequest, validateEditUserForm, } from '../src/pages/account/user-edit-model.ts' import type { AdminUser } from '../src/types/admin.ts' test('test_task_047_edit_user_fill_normal_primary_path', () => { // 正常主路径:admin 角色行回填出可编辑表单(uid/用户名/角色/空密码/原角色)。 const row: AdminUser = { id: 3, username: '运营一', role: 'admin', createdById: 1 } const form = fillEditUserForm(row) assert.equal(form.uid, 3) assert.equal(form.username, '运营一') assert.equal(form.role, 'admin') assert.equal(form.password, '') assert.deepEqual(form.columnIds, []) assert.equal(form.originalRole, 'admin') assert.equal(validateEditUserForm(form).valid, true) }) test('test_task_047_edit_user_fill_normal_variant_input', () => { // 正常变体:normal/空角色行归一到 normal;超管行可识别但不可编辑。 assert.equal(fillEditUserForm({ id: 4, username: 'a', role: 'normal' }).role, 'normal') assert.equal(fillEditUserForm({ id: 5, username: 'b', role: '' }).role, 'normal') assert.equal(isEditableUser('admin'), true) assert.equal(isEditableUser('super_admin'), false) }) test('test_task_047_edit_user_fill_normal_repeated_operation_is_idempotent', () => { // 正常重复:回填不改输入行、结果稳定。 const row: AdminUser = { id: 6, username: 'ops', role: 'normal' } assert.deepEqual(fillEditUserForm(row), fillEditUserForm(row)) assert.equal(row.role, 'normal') }) test('test_task_047_edit_user_fill_boundary_empty_input', () => { // 边界空值:空密码=不改密码视为合法;空行回填不崩溃。 assert.equal(validateEditUserForm(fillEditUserForm({ id: 1, username: '', role: '' })).valid, true) }) test('test_task_047_edit_user_fill_boundary_single_item', () => { // 边界单元素:最小一行(仅 id+username)即可回填,角色缺省 normal。 const form = fillEditUserForm({ id: 8, username: 'u' }) assert.equal(form.uid, 8) assert.equal(form.role, 'normal') }) test('test_task_047_edit_user_fill_boundary_limit_or_missing_field', () => { // 边界上限/缺字段:密码 5 字符被拒(留空才不改);缺角色归 normal。 const bad = validateEditUserForm({ ...fillEditUserForm({ id: 1, username: 'u' }), password: '12345' }) assert.equal(bad.valid, false) assert.match(bad.errors.password || '', /6/) }) test('test_task_047_edit_user_fill_invalid_input_rejected', () => { // 异常输入:原角色为超管时提交被拒;columnIds 序列化不共享引用。 const superForm = fillEditUserForm({ id: 9, username: 'root', role: 'super_admin' }) assert.throws(() => toEditUserUpdateRequest(superForm), /超级管理员/) const form = fillEditUserForm({ id: 10, username: 'x', role: 'normal' }) form.columnIds = [1, 2] const req = toEditUserUpdateRequest(form) assert.deepEqual(req.columnIds, [1, 2]) form.columnIds.push(3) assert.deepEqual(req.columnIds, [1, 2]) }) test('test_task_047_edit_user_fill_dependency_failure_returns_actionable_message', () => { // 依赖失败/可操作:编辑模型纯逻辑;用户名不可改(请求体不含 username)、空密码字段不下发。 const mod = readSource('src/pages/account/user-edit-model.ts') assert.equal(/axios|http\./.test(mod), false, '编辑回填模型保持纯逻辑') assert.match(mod, /fillEditUserForm/) assert.match(mod, /password/) // 仅回填/校验/可空密码,不强制重置 })