Files
crawler-plugin/admin-frontend-vue/tests/task-88.test.ts
T
huangzd1997 42722d0cc6 task-88(店铺中心): 实现店铺列表加载
新增 shop-manage-model.ts(ShopManagePageVo camel 解析,仅保留密码掩码)
与 shop-manage-api.ts(GET /api/admin/shop-manages 加载适配)。

TDD: task-88.test.ts 8 用例先 RED 后 GREEN。
2026-09-05 16:42:34 +08:00

113 lines
4.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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', () => {
// 依赖失败/加载走 adapterGET /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, '店铺列表解析保持纯逻辑')
})