d9b1b980ca
POST /api/admin/skip-price-asins/import、/delete-import(file+group_id 必填) 启动 + GET 进度轮询, 复用新增通用导入进度模型(含 deletedCount), 8 个契约测试。
86 lines
3.8 KiB
TypeScript
86 lines
3.8 KiB
TypeScript
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', () => {
|
||
// 依赖失败/轮询走 adapter:import 与 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/)
|
||
})
|