Files
huangzd1997 ce27161bbb task-66(ASIN 数据中心): 实现去重汇总导入轮询和终态
dedupe-import-model.ts 增 parseDedupeImportProgress(status/计数/errorMessage,缺省 pending、
未知状态不改) + importTaskFinished/importTaskSucceeded 终态判定;dedupe-import-api.ts 增
fetchDedupeImportProgress GET /api/admin/dedupe-total-data/import/{importId}。
8 用例全过,483 单测 + build 绿。
2026-09-05 15:39:29 +08:00

89 lines
3.5 KiB
TypeScript
Raw Permalink 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 {
importTaskFinished,
importTaskSucceeded,
parseDedupeImportProgress,
} from '../src/pages/asin/dedupe-import-model.ts'
test('test_task_066_dedupe_import_poll_normal_primary_path', () => {
// 正常主路径:解析 running 进度(含各计数)。
const progress = parseDedupeImportProgress({
success: true,
data: {
status: 'running',
totalRows: 100,
processedRows: 40,
asinCount: 38,
insertedCount: 20,
skippedCount: 18,
errorMessage: '',
},
})
assert.equal(progress.status, 'running')
assert.equal(progress.totalRows, 100)
assert.equal(progress.processedRows, 40)
assert.equal(progress.insertedCount, 20)
assert.equal(importTaskFinished(progress), false)
})
test('test_task_066_dedupe_import_poll_normal_variant_input', () => {
// 正常变体:success 终态判定成功且不再轮询。
const progress = parseDedupeImportProgress({ success: true, data: { status: 'success', insertedCount: 9 } })
assert.equal(progress.insertedCount, 9)
assert.equal(importTaskSucceeded(progress), true)
assert.equal(importTaskFinished(progress), true)
})
test('test_task_066_dedupe_import_poll_normal_repeated_operation_is_idempotent', () => {
// 正常重复:解析不改输入、结果稳定。
const payload = { success: true, data: { status: 'pending' } }
assert.deepEqual(parseDedupeImportProgress(payload), parseDedupeImportProgress(payload))
})
test('test_task_066_dedupe_import_poll_boundary_empty_input', () => {
// 边界空值:空负载按未开始(pending)处理,不崩溃。
const progress = parseDedupeImportProgress({})
assert.equal(progress.status, 'pending')
assert.equal(importTaskFinished(progress), false)
})
test('test_task_066_dedupe_import_poll_boundary_single_item', () => {
// 边界单元素:缺省计数为 0。
const progress = parseDedupeImportProgress({ success: true, data: { status: 'running' } })
assert.equal(progress.processedRows, 0)
assert.equal(progress.asinCount, 0)
})
test('test_task_066_dedupe_import_poll_boundary_limit_or_missing_field', () => {
// 边界上限/缺字段:failed 终态判定完成但未成功,错误信息可读。
const progress = parseDedupeImportProgress({
success: true,
data: { status: 'failed', errorMessage: '某行 ASIN 格式错误' },
})
assert.equal(importTaskFinished(progress), true)
assert.equal(importTaskSucceeded(progress), false)
assert.match(progress.errorMessage || '', /格式错误/)
})
test('test_task_066_dedupe_import_poll_invalid_input_rejected', () => {
// 异常输入:success=false 抛后端 message;未知状态按未完成处理。
assert.throws(
() => parseDedupeImportProgress({ success: false, message: '无权查看导入进度' }),
/无权查看/,
)
const weird = parseDedupeImportProgress({ success: true, data: { status: 'weird' } })
assert.equal(importTaskFinished(weird), false)
})
test('test_task_066_dedupe_import_poll_dependency_failure_returns_actionable_message', () => {
// 依赖失败/轮询走 adapterGET /import/{importId} 解析进度。
const api = readSource('src/pages/asin/dedupe-import-api.ts')
assert.match(api, /fetchDedupeImportProgress|importProgress/)
assert.match(api, /import\/\$\{?importId|import\/\{importId\}/)
assert.match(api, /parseDedupeImportProgress/)
const mod = readSource('src/pages/asin/dedupe-import-model.ts')
assert.equal(/axios|http\./.test(mod), false, '导入进度模型保持纯逻辑')
})