1acb93ff1c
新增 duplicate-import-export.ts:导入结果摘要/导入参数归一与导出查询构建。 TDD: task-119.test.ts 8 用例先 RED 后 GREEN。
71 lines
2.9 KiB
TypeScript
71 lines
2.9 KiB
TypeScript
import test from 'node:test'
|
|
import assert from 'node:assert/strict'
|
|
import { readSource } from './helpers.ts'
|
|
import {
|
|
normalizeImportMode,
|
|
parseDuplicateImportResult,
|
|
toDuplicateExportQuery,
|
|
toDuplicateImportQuery,
|
|
} from '../src/pages/tasks/duplicate-import-export.ts'
|
|
|
|
test('test_task_119_duplicate_import_export_normal_primary_path', () => {
|
|
// 正常主路径:导入结果摘要解析。
|
|
const summary = parseDuplicateImportResult({
|
|
success: true,
|
|
data: { total_rows: 120, asin_count: 45, mode: 'add' },
|
|
})
|
|
assert.equal(summary.totalRows, 120)
|
|
assert.equal(summary.asinCount, 45)
|
|
assert.equal(summary.mode, 'add')
|
|
})
|
|
|
|
test('test_task_119_duplicate_import_export_normal_variant_input', () => {
|
|
// 正常变体:导入参数归一(delete)。
|
|
assert.equal(normalizeImportMode('DEL'), 'delete')
|
|
assert.equal(normalizeImportMode('add'), 'add')
|
|
assert.deepEqual(toDuplicateImportQuery({ mode: 'add', shopName: '店', countryCodes: ['DE', 'UK'] }), {
|
|
mode: 'add',
|
|
shop_name: '店',
|
|
country_codes: 'DE,UK',
|
|
})
|
|
})
|
|
|
|
test('test_task_119_duplicate_import_export_repeated_is_idempotent', () => {
|
|
// 正常重复:导出查询构建稳定、不改输入。
|
|
const filter = { view: 'monitor', asin: 'A', shopName: '', country: 'DE', site: '', dateFrom: '', dateTo: '' }
|
|
assert.deepEqual(toDuplicateExportQuery(filter), toDuplicateExportQuery(filter))
|
|
})
|
|
|
|
test('test_task_119_duplicate_import_export_boundary_empty_input', () => {
|
|
// 边界空值:无模式按 add;空 country 不下发。
|
|
assert.equal(normalizeImportMode(''), 'add')
|
|
const q = toDuplicateImportQuery({ mode: 'x', shopName: '', countryCodes: [] })
|
|
assert.equal(q.mode, 'add')
|
|
assert.equal('country_codes' in q, false)
|
|
})
|
|
|
|
test('test_task_119_duplicate_import_export_boundary_single_item', () => {
|
|
// 边界单元素:单国家导出。
|
|
const query = toDuplicateExportQuery({ view: '', asin: '', shopName: '', country: 'DE', site: '', dateFrom: '', dateTo: '' })
|
|
assert.equal(query.country, 'DE')
|
|
})
|
|
|
|
test('test_task_119_duplicate_import_export_boundary_limit_or_missing_field', () => {
|
|
// 边界上限/缺字段:导入结果缺省字段回 0。
|
|
const summary = parseDuplicateImportResult({ data: {} })
|
|
assert.equal(summary.totalRows, 0)
|
|
assert.equal(summary.asinCount, 0)
|
|
})
|
|
|
|
test('test_task_119_duplicate_import_export_invalid_input_rejected', () => {
|
|
// 异常输入:success=false 抛后端 message。
|
|
assert.throws(() => parseDuplicateImportResult({ success: false, message: '请上传 Excel 文件' }), /请上传 Excel 文件/)
|
|
})
|
|
|
|
test('test_task_119_duplicate_import_export_dependency_failure_returns_actionable_message', () => {
|
|
// 依赖失败/可操作:导入导出纯逻辑;导出走 GET /duplicate-check-export。
|
|
const mod = readSource('src/pages/tasks/duplicate-import-export.ts')
|
|
assert.equal(/axios|http\.|vue/.test(mod), false, '导入导出保持纯逻辑')
|
|
assert.match(mod, /duplicate-check-export/)
|
|
})
|