import test from 'node:test' import assert from 'node:assert/strict' import { readSource } from './helpers.ts' import { validateShopGroupForm } from '../src/pages/account/shop-group-model.ts' // module 13 task 253:数据权限分组页面对齐(新建/编辑/删除 + 组员展示 + 组长锁定)。 test('test_task_253_group_list_normal_primary_path', () => { const page = readSource('src/pages/account/GroupsPage.vue') assert.match(page, /新建分组/, '需有新建分组入口') assert.match(page, /GroupEditorDialog/, '需挂载分组编辑器') assert.match(page, /组员/, '列表需含组员列') assert.match(page, /memberUsernames/, '组员列读 memberUsernames') }) test('test_task_253_group_list_normal_variant_input', () => { // 组长不可改、仅组长/超管可编辑删除。 const page = readSource('src/pages/account/GroupsPage.vue') assert.match(page, /canEditOf/, '需有可编辑判定') assert.match(page, /leaderUserId/, '判定依赖组长 leaderUserId') const editor = readSource('src/pages/account/GroupEditorDialog.vue') assert.match(editor, /组长/, '编辑弹窗含组长展示') assert.match(editor, /当前登录用户/, '新建时组长只读为当前登录用户') }) test('test_task_253_group_list_normal_repeated_operation_is_idempotent', () => { // 分组名校验幂等。 assert.deepEqual(validateShopGroupForm(''), { groupName: '请输入分组名称' }) assert.deepEqual(validateShopGroupForm(' '), { groupName: '请输入分组名称' }) assert.deepEqual(validateShopGroupForm('A组'), {}) }) test('test_task_253_group_list_boundary_empty_input', () => { const page = readSource('src/pages/account/GroupsPage.vue') assert.match(page, /删除成功/, '删除成功提示') assert.match(page, /openAdminConfirm/, '删除确认走统一确认组件') const editor = readSource('src/pages/account/GroupEditorDialog.vue') assert.match(editor, /更新成功/, '更新成功提示') assert.match(editor, /创建成功/, '创建成功提示') }) test('test_task_253_group_list_boundary_single_item', () => { // 单组:无组员显示“无”;组员 chips 全量渲染(对齐 admin.js 全量 chips,不再收 +N)。 const page = readSource('src/pages/account/GroupsPage.vue') assert.match(page, /member-none|无/, '无组员占位') assert.doesNotMatch(page, /slice\(0,\s*10\)/, '组员全量渲染') }) test('test_task_253_group_list_boundary_limit_or_missing_field', () => { // 边界上限:编辑器含 分组名称/组长(创建人)/组员 选择。 const editor = readSource('src/pages/account/GroupEditorDialog.vue') assert.match(editor, /groupName/, '含分组名称字段') assert.match(editor, /memberIds/, '含组员选择') assert.match(editor, /fetchUserList/, '成员候选来自用户列表') }) test('test_task_253_group_list_invalid_input_rejected', () => { // 异常:空名不可保存。 const editor = readSource('src/pages/account/GroupEditorDialog.vue') assert.match(editor, /validateShopGroupForm/, '保存前走分组名校验') }) test('test_task_253_group_list_dependency_failure_returns_actionable_message', () => { // 依赖:CRUD 走 /api/admin/shop-manages/groups;模型解析 member/leader ids。 const api = readSource('src/pages/account/shop-group-api.ts') assert.match(api, /shop-manages\/groups/, '分组端点真实') assert.match(api, /deleteShopGroup/, '含删除适配') const model = readSource('src/pages/account/shop-group-model.ts') assert.match(model, /leaderUserId/, '模型需解析组长 id') assert.match(model, /memberUserIds/, '模型需解析成员 id') })