Files
crawler-plugin/admin-frontend-vue/tests/task-61.test.ts
T
huangzd1997 53b4cb52f3 task-61(ASIN 数据中心): 定义共享分页和筛选类型
新增 src/pages/asin/asin-filter.ts 纯共享层:AsinListParams 分页+keyword/username/日期区间/
groupId/国家筛选,normalizeAsinPageParams 钳制页码页大小并校验 ISO 日期,toAsinPageQuery
序列化 snake_case(仅下发非空),镜像 DedupeTotalDataController.page 参数契约。
8 用例全过,443 单测 + build 绿。
2026-09-05 15:26:42 +08:00

88 lines
3.6 KiB
TypeScript

import test from 'node:test'
import assert from 'node:assert/strict'
import { readSource } from './helpers.ts'
import {
ASIN_PAGE_DEFAULT_SIZE,
normalizeAsinPageParams,
toAsinPageQuery,
validIsoDateOrUndefined,
} from '../src/pages/asin/asin-filter.ts'
test('test_task_061_asin_shared_filter_normal_primary_path', () => {
// 正常主路径:完整筛选条件归一并序列化为 Java snake_case 查询参数。
const params = normalizeAsinPageParams({
page: 2,
pageSize: 20,
keyword: 'B0ABC',
startDate: '2026-01-01',
endDate: '2026-01-31',
groupId: 3,
country: 'DE',
})
assert.equal(params.page, 2)
const query = toAsinPageQuery(params)
assert.equal(query.page, 2)
assert.equal(query.page_size, 20)
assert.equal(query.keyword, 'B0ABC')
assert.equal(query.start_date, '2026-01-01')
assert.equal(query.end_date, '2026-01-31')
assert.equal(query.group_id, 3)
assert.equal(query.country, 'DE')
})
test('test_task_061_asin_shared_filter_normal_variant_input', () => {
// 正常变体:username 维度可选;空条件不下发字段。
const query = toAsinPageQuery(normalizeAsinPageParams({ page: 1, pageSize: 15, username: ' 张伟恒 ' }))
assert.equal(query.username, '张伟恒')
assert.equal('keyword' in query, false)
})
test('test_task_061_asin_shared_filter_normal_repeated_operation_is_idempotent', () => {
// 正常重复:归一不改输入、结果稳定。
const input = { page: 3, pageSize: 30, keyword: 'K' }
assert.deepEqual(normalizeAsinPageParams(input), normalizeAsinPageParams(input))
assert.equal((input as { keyword: string }).keyword, 'K')
})
test('test_task_061_asin_shared_filter_boundary_empty_input', () => {
// 边界空值:空入参回默认分页(第 1 页/15 条),无其它筛选。
const params = normalizeAsinPageParams({})
assert.equal(params.page, 1)
assert.equal(params.pageSize, ASIN_PAGE_DEFAULT_SIZE)
const query = toAsinPageQuery(params)
assert.deepEqual(Object.keys(query).sort(), ['page', 'page_size'])
})
test('test_task_061_asin_shared_filter_boundary_single_item', () => {
// 边界单元素:country 单筛选保留。
const query = toAsinPageQuery(normalizeAsinPageParams({ page: 1, country: 'UK' }))
assert.equal(query.country, 'UK')
})
test('test_task_061_asin_shared_filter_boundary_limit_or_missing_field', () => {
// 边界上限:页码/页大小钳制;非法 ISO 日期按无日期处理;负 groupId 忽略。
const params = normalizeAsinPageParams({ page: 0, pageSize: 999, startDate: 'not-a-date', groupId: -1 })
assert.equal(params.page, 1)
assert.equal(params.pageSize, 200)
assert.equal(params.startDate, undefined)
assert.equal(params.groupId, null)
assert.equal(validIsoDateOrUndefined('2026-02-01'), '2026-02-01')
})
test('test_task_061_asin_shared_filter_invalid_input_rejected', () => {
// 异常输入:非数字/NaN 回默认;空字符串条件不下发。
const query = toAsinPageQuery(normalizeAsinPageParams({ page: 'x' as never, pageSize: NaN, keyword: ' ' }))
assert.equal(query.page, 1)
assert.equal(query.page_size, ASIN_PAGE_DEFAULT_SIZE)
assert.equal('keyword' in query, false)
})
test('test_task_061_asin_shared_filter_dependency_failure_returns_actionable_message', () => {
// 依赖失败/可操作:共享筛选为纯逻辑、无框架/http,日期与国家可空。
const mod = readSource('src/pages/asin/asin-filter.ts')
assert.equal(/axios|http\.|vue/.test(mod), false, '共享筛选保持纯逻辑')
assert.match(mod, /start_date/)
assert.match(mod, /end_date/)
assert.match(mod, /country/)
})