refactor(品牌工具页): 历史批量删除抽为 runBatchDelete
16 个品牌页逐字相同的 batchDeleteHistory 循环(逐条删除 + 容忍个别失败计数) 收敛为 shared/utils/batch-delete.ts 的 runBatchDelete;各页仅保留自己的删除调用 与提示文案。补单测 4 例(空列表 / 全成功 / 部分失败继续 / 非 Error 异常)。 净减约 120 行;vue-tsc 构建与 699 个前端单测通过。
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
import { test } from 'node:test'
|
||||
import assert from 'node:assert/strict'
|
||||
import { runBatchDelete } from '../src/shared/utils/batch-delete.ts'
|
||||
|
||||
test('空列表不调用删除并返回 0', async () => {
|
||||
let calls = 0
|
||||
const result = await runBatchDelete([], async () => {
|
||||
calls += 1
|
||||
})
|
||||
|
||||
assert.deepEqual(result, { total: 0, failed: 0 })
|
||||
assert.equal(calls, 0)
|
||||
})
|
||||
|
||||
test('全部成功时 failed 为 0', async () => {
|
||||
const seen: number[] = []
|
||||
const result = await runBatchDelete([1, 2, 3], async (n) => {
|
||||
seen.push(n)
|
||||
})
|
||||
|
||||
assert.deepEqual(result, { total: 3, failed: 0 })
|
||||
assert.deepEqual(seen, [1, 2, 3])
|
||||
})
|
||||
|
||||
test('个别失败继续删其余并计数', async () => {
|
||||
const seen: number[] = []
|
||||
const result = await runBatchDelete([1, 2, 3, 4], async (n) => {
|
||||
seen.push(n)
|
||||
if (n === 2 || n === 4) throw new Error('删除失败')
|
||||
})
|
||||
|
||||
assert.deepEqual(result, { total: 4, failed: 2 })
|
||||
assert.deepEqual(seen, [1, 2, 3, 4], '失败后应继续处理后续条目')
|
||||
})
|
||||
|
||||
test('抛出非 Error 也计入失败', async () => {
|
||||
const result = await runBatchDelete(['a'], async () => {
|
||||
throw 'boom'
|
||||
})
|
||||
|
||||
assert.deepEqual(result, { total: 1, failed: 1 })
|
||||
})
|
||||
Reference in New Issue
Block a user