Files
huangzd1997 d9b1b980ca task-76(ASIN 数据中心): 实现最低价 ASIN 导入与删除导入
POST /api/admin/skip-price-asins/import、/delete-import(file+group_id
必填) 启动 + GET 进度轮询, 复用新增通用导入进度模型(含 deletedCount),
8 个契约测试。
2026-09-05 16:12:47 +08:00

86 lines
3.8 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 {
isAllowedExcelImportFile,
parseImportStart,
parseImportProgress,
importFinished,
importSucceeded,
deleteOutcomeText,
} from '../src/pages/asin/import-progress-model.ts'
test('test_task_076_skip_price_import_start_normal_primary_path', () => {
// 正常主路径:导入启动结果解析出任务 id。
assert.equal(parseImportStart({ success: true, data: { importId: 'job_sp_1' } }), 'job_sp_1')
})
test('test_task_076_skip_price_import_progress_normal_deleted_and_running', () => {
// 正常主路径:running 进度统计 deletedCount(删除导入) 与 insertedCount(新增导入)。
const progress = parseImportProgress({
success: true,
data: { status: 'running', totalRows: 50, processedRows: 20, deletedCount: 3, insertedCount: 5, skippedCount: 2 },
})
assert.equal(progress.status, 'running')
assert.equal(progress.deletedCount, 3)
assert.equal(progress.insertedCount, 5)
assert.equal(importFinished(progress), false)
})
test('test_task_076_skip_price_import_success_terminal_and_delete_text', () => {
// 正常终态:success 判定成功;删除文案含删除/跳过条数。
const done = parseImportProgress({
success: true,
data: { status: 'success', deletedCount: 9, skippedCount: 2 },
})
assert.equal(importFinished(done), true)
assert.equal(importSucceeded(done), true)
const text = deleteOutcomeText(done)
assert.match(text, /删除/)
assert.match(text, /9/)
})
test('test_task_076_skip_price_import_file_boundary_single_item', () => {
// 边界单元素:.xlsx/.xls 合法。
assert.equal(isAllowedExcelImportFile('skip.xlsx'), true)
assert.equal(isAllowedExcelImportFile('skip.xls'), true)
})
test('test_task_076_skip_price_import_file_boundary_limit_or_missing_field', () => {
// 边界上限/缺字段:非 Excel 与空文件名被拒。
assert.equal(isAllowedExcelImportFile('data.csv'), false)
assert.equal(isAllowedExcelImportFile(''), false)
assert.equal(isAllowedExcelImportFile(undefined as never), false)
})
test('test_task_076_skip_price_import_progress_boundary_empty_and_failed', () => {
// 边界/失败:空负载按 pending;failed 终态完成但未成功且错误可读。
const empty = parseImportProgress({})
assert.equal(empty.status, 'pending')
assert.equal(importFinished(empty), false)
const failed = parseImportProgress({ success: true, data: { status: 'failed', errorMessage: '导入文件超过大小上限' } })
assert.equal(importFinished(failed), true)
assert.equal(importSucceeded(failed), false)
assert.match(failed.errorMessage || '', /大小上限/)
})
test('test_task_076_skip_price_import_invalid_input_rejected', () => {
// 异常输入:success=false 抛后端 message;缺 importId 抛可读错误。
assert.throws(() => parseImportStart({ success: false, message: '无权访问' }), /无权访问/)
assert.throws(() => parseImportStart({ success: true, data: {} }), /任务/)
assert.throws(() => parseImportProgress({ success: false, message: '导入任务不存在' }), /导入任务不存在/)
})
test('test_task_076_skip_price_import_dependency_failure_returns_actionable_message', () => {
// 依赖失败/轮询走 adapterimport 与 delete-import 均有 POST 启动 + GET 进度,group_id 必填。
const api = readSource('src/pages/asin/skip-price-import-api.ts')
assert.match(api, /skip-price-asins\/import/)
assert.match(api, /skip-price-asins\/delete-import/)
assert.match(api, /http\.post/)
assert.match(api, /http\.get/)
assert.match(api, /FormData/)
assert.match(api, /group_id/)
assert.match(api, /startSkipPriceImport/)
assert.match(api, /fetchSkipPriceImportProgress|fetchSkipPriceDeleteImportProgress/)
})