import test from 'node:test' import assert from 'node:assert/strict' import { readSource } from './helpers.ts' import { DEDUPE_TOTAL_EXPORT_ENDPOINT, buildDedupeExportQuery, toExportUrl, exportStageHint, } from '../src/pages/asin/dedupe-total-export.ts' import { createDedupeTotalFilterState } from '../src/pages/asin/dedupe-total-filter.ts' test('test_task_064_dedupe_export_normal_primary_path', () => { // 正常主路径:完整日期区间+国家生成导出查询串。 const query = buildDedupeExportQuery({ ...createDedupeTotalFilterState(), startDate: '2026-01-01', endDate: '2026-01-31', country: 'DE', }) const params = new URLSearchParams(query) assert.equal(params.get('start_date'), '2026-01-01') assert.equal(params.get('end_date'), '2026-01-31') assert.equal(params.get('country'), 'DE') }) test('test_task_064_dedupe_export_normal_variant_input', () => { // 正常变体:按上传用户名/分组导出。 const query = buildDedupeExportQuery({ ...createDedupeTotalFilterState(), username: ' 张伟恒 ', groupId: 3, }) const params = new URLSearchParams(query) assert.equal(params.get('username'), '张伟恒') assert.equal(params.get('group_id'), '3') }) test('test_task_064_dedupe_export_normal_repeated_operation_is_idempotent', () => { // 正常重复:同一状态生成稳定查询串。 const state = { ...createDedupeTotalFilterState(), country: 'UK' } assert.equal(buildDedupeExportQuery(state), buildDedupeExportQuery(state)) }) test('test_task_064_dedupe_export_boundary_empty_input', () => { // 边界空值:无筛选导出 → 无查询参数但保留端点。 const url = toExportUrl(createDedupeTotalFilterState()) assert.ok(url.startsWith(DEDUPE_TOTAL_EXPORT_ENDPOINT)) assert.equal(url.includes('?'), false) }) test('test_task_064_dedupe_export_boundary_single_item', () => { // 边界单元素:单国家导出。 const query = buildDedupeExportQuery({ ...createDedupeTotalFilterState(), country: 'UK' }) assert.equal(new URLSearchParams(query).get('country'), 'UK') }) test('test_task_064_dedupe_export_boundary_limit_or_missing_field', () => { // 边界上限/缺字段:非法日期与空白条件不下发;negative groupId 忽略。 const query = buildDedupeExportQuery({ ...createDedupeTotalFilterState(), startDate: 'bad', country: ' ', groupId: -1, username: ' ', }) assert.equal(query, '') }) test('test_task_064_dedupe_export_invalid_input_rejected', () => { // 异常输入:导出等待状态文案与运行态语义一致。 assert.ok(exportStageHint('running')) assert.equal(exportStageHint('idle'), undefined) }) test('test_task_064_dedupe_export_dependency_failure_returns_actionable_message', () => { // 依赖失败/可操作:导出走浏览器下载端点 + 等待态提示;URL 构建纯逻辑。 const mod = readSource('src/pages/asin/dedupe-total-export.ts') assert.equal(/axios|http\.|vue/.test(mod), false, '导出 URL/等待模型保持纯逻辑') assert.match(mod, /start_date/) assert.match(mod, /export/) })