fix(提示语): 失败提示优先展示后端真实原因,修正 10+ 处误导文案
上架/删除品牌/去重/转换/拆分/撤回/查ASIN/产品风险/跟价/巡店/店铺匹配/视频工作台: - 解析失败不再只报通用文案,逐条展示后端文件级 errorMessage(上架新增「店铺未找到」专属弹窗) - 匹配失败不再一律「请检查店铺名」,按 matchStatus 区分 CONFLICT/PENDING - 去重/转换/拆分全失败弹窗优先列各文件真实原因,取不到才回退猜测文案 - dispatch-guard 新增 fileErrors 选项与 collectDistinctErrors 导出
This commit is contained in:
@@ -7,6 +7,7 @@ import {
|
||||
checkParseResult,
|
||||
checkQueuePayload,
|
||||
checkSelectedFiles,
|
||||
collectDistinctErrors,
|
||||
extensionOf,
|
||||
findUnsafeJsonPaths,
|
||||
guardPassed,
|
||||
@@ -165,6 +166,55 @@ test('test_task_101_dispatch_guard_boundary_parse_result_zero_rows_blocked', ()
|
||||
assert.match(emptyFile.message, /没有读到任何数据行/)
|
||||
})
|
||||
|
||||
test('test_task_101_dispatch_guard_parse_result_file_errors_shown_instead_of_empty_file', () => {
|
||||
// 2026-09-17:店铺未录入后台导致文件级失败,用户被「空文件」文案误导反复重传
|
||||
const result = checkParseResult(parseVo({ totalRows: 0, acceptedRows: 0 }), {
|
||||
fileErrors: ['后台店铺管理中未找到店铺:林清斌,请先添加店铺信息'],
|
||||
})
|
||||
assert.equal(result.ok, false)
|
||||
assert.deepEqual(codes(result), ['parse.file-failed'])
|
||||
assert.match(result.message, /林清斌/)
|
||||
assert.ok(!result.message.includes('没有读到任何数据行'), '有具体原因时不展示通用空文件文案')
|
||||
})
|
||||
|
||||
test('test_task_101_dispatch_guard_parse_result_file_errors_dedupe_blank_and_limit', () => {
|
||||
const deduped = checkParseResult(parseVo({ totalRows: 0, acceptedRows: 0 }), {
|
||||
fileErrors: ['店铺未匹配', ' ', '店铺未匹配', '', '第二条原因'],
|
||||
})
|
||||
assert.deepEqual(codes(deduped), ['parse.file-failed'])
|
||||
assert.equal(
|
||||
deduped.message.split('\n').filter((line) => line.startsWith('· ')).length,
|
||||
2,
|
||||
'空串与重复原因不应重复展示',
|
||||
)
|
||||
|
||||
const many = checkParseResult(parseVo({ totalRows: 0, acceptedRows: 0 }), {
|
||||
fileErrors: Array.from({ length: 10 }, (_, index) => `原因 ${index}`),
|
||||
})
|
||||
assert.match(many.message, /另有 2 条不同原因/)
|
||||
})
|
||||
|
||||
test('test_task_101_dispatch_guard_parse_result_blank_file_errors_fallback_to_empty_file', () => {
|
||||
const result = checkParseResult(parseVo({ totalRows: 0, acceptedRows: 0 }), {
|
||||
fileErrors: [' ', ''],
|
||||
})
|
||||
assert.deepEqual(codes(result), ['parse.empty-file'])
|
||||
})
|
||||
|
||||
test('test_task_101_dispatch_guard_collect_distinct_errors', () => {
|
||||
assert.deepEqual(collectDistinctErrors(['a', ' ', 'a', '', 'b']), ['a', 'b'], '去空去重且保持顺序')
|
||||
assert.deepEqual(collectDistinctErrors([' 店铺未找到 ']), ['店铺未找到'], '首尾空白裁剪')
|
||||
assert.deepEqual(collectDistinctErrors([]), [])
|
||||
assert.deepEqual(collectDistinctErrors(undefined), [])
|
||||
assert.deepEqual(collectDistinctErrors([null, 7, undefined]), [], '非字符串项忽略')
|
||||
})
|
||||
|
||||
test('test_task_101_dispatch_guard_parse_result_file_errors_ignored_when_rows_present', () => {
|
||||
const result = checkParseResult(parseVo(), { fileErrors: ['某文件失败'] })
|
||||
assert.equal(result.ok, true)
|
||||
assert.equal(result.needsConfirm, false)
|
||||
})
|
||||
|
||||
test('test_task_101_dispatch_guard_parse_result_zero_rows_allowed_when_not_required', () => {
|
||||
const result = checkParseResult(parseVo({ totalRows: 0, acceptedRows: 0 }), { requireRows: false })
|
||||
assert.equal(result.ok, true)
|
||||
|
||||
Reference in New Issue
Block a user