import test from 'node:test' import assert from 'node:assert/strict' import { readSource } from './helpers.ts' import { parseShopManagePage, toShopSummary } from '../src/pages/shop/shop-manage-model.ts' test('test_task_088_shop_manage_list_load_normal_primary_path', () => { // 正常主路径:Java ShopManagePageVo(camel) 封包解析为前端店铺分页结果。 const page = parseShopManagePage({ success: true, data: { items: [ { id: 5, groupId: 3, groupName: '华东组', shopName: 'BlueWave', mallName: '亚马逊美国站', znUsername: 'robot', account: 'sale@blue.com', password: '******', passwordMasked: '******', createdAt: '2026-01-01T10:00:00', updatedAt: '2026-01-02T11:00:00', }, ], total: 1, page: 1, pageSize: 15, }, }) assert.equal(page.items.length, 1) const item = page.items[0] assert.equal(item.id, 5) assert.equal(item.groupId, 3) assert.equal(item.groupName, '华东组') assert.equal(item.shopName, 'BlueWave') assert.equal(item.mallName, '亚马逊美国站') assert.equal(item.znUsername, 'robot') assert.equal(item.account, 'sale@blue.com') assert.equal(item.passwordMasked, '******') assert.equal('password' in item, false, '列表行不得携带明文字段') assert.equal(page.total, 1) assert.equal(page.pageSize, 15) }) test('test_task_088_shop_manage_list_load_normal_variant_input', () => { // 正常变体:已解包 VO 直传;无分组/缺掩码字段行留空可显示。 const page = parseShopManagePage({ items: [{ id: 6, shopName: 'RedSun', mallName: '亚马逊英国站' }], total: 3, page: 2, pageSize: 20, }) const item = page.items[0] assert.equal(item.groupId, null) assert.equal(item.groupName, '') assert.equal(item.znUsername, '') assert.equal(item.account, '') assert.equal(item.passwordMasked, undefined) assert.equal(page.page, 2) }) test('test_task_088_shop_manage_list_load_repeated_is_idempotent', () => { // 正常重复:解析同一负载结果稳定、不改输入。 const payload = { data: { items: [{ id: 1, shopName: 'A' }], total: 1, page: 1, pageSize: 15 } } assert.deepEqual(parseShopManagePage(payload), parseShopManagePage(payload)) assert.equal((payload as { data: { items: unknown[] } }).data.items.length, 1) }) test('test_task_088_shop_manage_list_load_boundary_empty_input', () => { // 边界空值:空负载回默认分页结果(空列表/total 0/page 1/页大小 15)。 const page = parseShopManagePage({}) assert.deepEqual(page.items, []) assert.equal(page.total, 0) assert.equal(page.page, 1) assert.equal(page.pageSize, 15) }) test('test_task_088_shop_manage_list_load_boundary_single_item', () => { // 边界单元素:单条记录;缺 id 的行被过滤。 const page = parseShopManagePage({ data: { items: [{ id: 7, shopName: 'Z' }, { shopName: 'no-id' }], total: 2, page: 1, pageSize: 15 }, }) assert.equal(page.items.length, 1) assert.equal(page.items[0].id, 7) }) test('test_task_088_shop_manage_list_load_boundary_limit_or_missing_field', () => { // 边界上限/缺字段:缺省字段回默认值;最小行可用。 const minimal = toShopSummary({ id: 3 }) assert.ok(minimal) assert.equal(minimal.id, 3) assert.equal(minimal.shopName, '') assert.equal(minimal.createdAt, undefined) }) test('test_task_088_shop_manage_list_load_invalid_input_rejected', () => { // 异常输入:success=false 抛后端 message;非对象/非数字 id 行不入列表。 assert.throws(() => parseShopManagePage({ success: false, message: '无权访问店铺数据' }), /无权访问/) assert.equal(toShopSummary('garbage'), null) assert.equal(toShopSummary({ shopName: 'no id' }), null) }) test('test_task_088_shop_manage_list_load_dependency_failure_returns_actionable_message', () => { // 依赖失败/加载走 adapter:GET /api/admin/shop-manages + http.get + 解析,页面不内联。 const api = readSource('src/pages/shop/shop-manage-api.ts') assert.match(api, /\/api\/admin\/shop-manages/) assert.match(api, /http\.get/) assert.match(api, /parseShopManagePage/) const model = readSource('src/pages/shop/shop-manage-model.ts') assert.equal(/axios|http\./.test(model), false, '店铺列表解析保持纯逻辑') })