import test from 'node:test' import assert from 'node:assert/strict' import { readSource } from './helpers.ts' import { createDedupeTotalFilterState, dedupeTotalFilterActive, toDedupeListParams, } from '../src/pages/asin/dedupe-total-filter.ts' import { ASIN_PAGE_DEFAULT_SIZE } from '../src/pages/asin/asin-filter.ts' test('test_task_063_dedupe_filter_normal_primary_path', () => { // 正常主路径:完整筛选(国家+日期区间)可判定激活并映射到列表参数。 const state = { ...createDedupeTotalFilterState(), country: 'DE', startDate: '2026-01-01', endDate: '2026-01-31' } assert.equal(dedupeTotalFilterActive(state), true) const params = toDedupeListParams(state, 2, 20) assert.equal(params.page, 2) assert.equal(params.pageSize, 20) assert.equal(params.country, 'DE') assert.equal(params.startDate, '2026-01-01') assert.equal(params.endDate, '2026-01-31') }) test('test_task_063_dedupe_filter_normal_variant_input', () => { // 正常变体:仅分组/仅用户名筛选亦激活。 assert.equal(dedupeTotalFilterActive({ ...createDedupeTotalFilterState(), groupId: 3 }), true) assert.equal(dedupeTotalFilterActive({ ...createDedupeTotalFilterState(), username: '张' }), true) }) test('test_task_063_dedupe_filter_normal_repeated_operation_is_idempotent', () => { // 正常重复:映射纯函数不改输入。 const state = createDedupeTotalFilterState() assert.deepEqual(toDedupeListParams(state, 1, 15), toDedupeListParams(state, 1, 15)) }) test('test_task_063_dedupe_filter_boundary_empty_input', () => { // 边界空值:默认过滤态不激活;映射到列表参数为空筛选、带默认分页。 const state = createDedupeTotalFilterState() assert.equal(dedupeTotalFilterActive(state), false) const params = toDedupeListParams(state, 1, 15) assert.equal('country' in params, false) assert.equal('startDate' in params, false) }) test('test_task_063_dedupe_filter_boundary_single_item', () => { // 边界单元素:单国家筛选激活。 const state = { ...createDedupeTotalFilterState(), country: 'UK' } assert.equal(dedupeTotalFilterActive(state), true) assert.equal(toDedupeListParams(state, 1, 15).country, 'UK') }) test('test_task_063_dedupe_filter_boundary_limit_or_missing_field', () => { // 边界上限/缺字段:空白关键字/国家不激活;默认页大小常量透传。 const state = { ...createDedupeTotalFilterState(), keyword: ' ', country: ' ' } assert.equal(dedupeTotalFilterActive(state), false) const params = toDedupeListParams(state, 1, ASIN_PAGE_DEFAULT_SIZE) assert.equal('keyword' in params, false) }) test('test_task_063_dedupe_filter_invalid_input_rejected', () => { // 异常输入:非法 ISO 日期在映射层回 undefined(共享筛选会再校验)。 const state = { ...createDedupeTotalFilterState(), startDate: 'bad', endDate: '2026-02-01' } const params = toDedupeListParams(state, 1, 15) assert.equal(params.startDate, undefined) assert.equal(params.endDate, '2026-02-01') }) test('test_task_063_dedupe_filter_dependency_failure_returns_actionable_message', () => { // 依赖失败/可操作:过滤状态纯逻辑、复用共享筛选类型,不带 http。 const mod = readSource('src/pages/asin/dedupe-total-filter.ts') assert.equal(/axios|http\.|vue/.test(mod), false, '过滤状态保持纯逻辑') assert.match(mod, /asin-filter/) assert.match(mod, /startDate/) assert.match(mod, /country/) })