import test from 'node:test' import assert from 'node:assert/strict' import { readSource } from './helpers.ts' import { parseShopGroupList, shopGroupSummary } from '../src/pages/account/shop-group-model.ts' test('test_task_059_data_group_list_normal_primary_path', () => { // 正常主路径:解析 Java ShopManageGroupItemVo(camel) 为展示项。 const groups = parseShopGroupList({ success: true, data: [ { id: 1, groupName: '华东组', leaderUsername: '张伟恒', memberUserIds: [2, 3], memberUsernames: ['李四', '王五'], memberCount: 2, createdAt: '2026-01-01T00:00:00', }, ], }) assert.equal(groups.length, 1) assert.equal(groups[0].name, '华东组') assert.equal(groups[0].leaderUsername, '张伟恒') assert.equal(groups[0].memberCount, 2) assert.deepEqual(groups[0].memberUsernames, ['李四', '王五']) }) test('test_task_059_data_group_list_normal_variant_input', () => { // 正常变体:缺组长/组员给空默认;memberCount 缺失按列表长度回退。 const groups = parseShopGroupList([{ id: 2, groupName: '组B', memberUsernames: ['a', 'b'] }]) assert.equal(groups[0].leaderUsername, '') assert.equal(groups[0].memberCount, 2) }) test('test_task_059_data_group_list_normal_repeated_operation_is_idempotent', () => { // 正常重复:解析不改输入、结果稳定。 const payload = [{ id: 3, groupName: 'G', memberCount: 1 }] assert.deepEqual(parseShopGroupList(payload), parseShopGroupList(payload)) assert.equal(payload[0].memberCount, 1) }) test('test_task_059_data_group_list_boundary_empty_input', () => { // 边界空值:空负载/空数组回空列表;空摘要计数为 0。 assert.deepEqual(parseShopGroupList({}), []) assert.deepEqual(shopGroupSummary([]), { groupCount: 0, memberTotal: 0 }) }) test('test_task_059_data_group_list_boundary_single_item', () => { // 边界单元素:单分组摘要统计正确。 const groups = parseShopGroupList([{ id: 4, groupName: 'A', memberCount: 3 }]) assert.deepEqual(shopGroupSummary(groups), { groupCount: 1, memberTotal: 3 }) }) test('test_task_059_data_group_list_boundary_limit_or_missing_field', () => { // 边界上限/缺字段:多分组汇总组员总数;memberCount 缺失按 0。 const groups = parseShopGroupList([ { id: 1, groupName: 'A', memberCount: 2 }, { id: 2, groupName: 'B', memberCount: 5 }, ]) assert.deepEqual(shopGroupSummary(groups), { groupCount: 2, memberTotal: 7 }) }) test('test_task_059_data_group_list_invalid_input_rejected', () => { // 异常输入:success=false 抛后端 message;非数组负载回空。 assert.throws(() => parseShopGroupList({ success: false, message: '无权限查看分组' }), /无权限查看分组/) assert.deepEqual(parseShopGroupList('garbage'), []) }) test('test_task_059_data_group_list_dependency_failure_returns_actionable_message', () => { // 依赖失败/加载走 adapter:GET shop-manages/groups,页面用 fetch + 摘要,不内联 http。 const mod = readSource('src/pages/account/shop-group-model.ts') assert.equal(/axios|http\./.test(mod), false, '分组模型保持纯逻辑') const api = readSource('src/pages/account/shop-group-api.ts') assert.match(api, /shop-manages\/groups/) assert.match(api, /parseShopGroupList/) const page = readSource('src/pages/account/GroupsPage.vue') assert.match(page, /shop-group-api|fetchShopGroups/, '页面走分组适配接口') assert.match(page, /filterKeyword|filterLeader/, '分组列表已加名称/组长筛选') assert.equal(/http\.(get|post)|unwrap\(/.test(page), false, '页面不内联请求') })