task-70(ASIN 数据中心): 实现品牌数据库删除确认
invalid-asin-model.ts 增 invalidAsinDeleteText 二次确认文案(含 ASIN 值/不可恢复语义);
invalid-asin-api.ts 增 deleteInvalidAsin DELETE /api/admin/invalid-asin-data/{id}。
8 用例全过,515 单测 + build 绿。
This commit is contained in:
@@ -44,3 +44,9 @@ export async function updateInvalidAsin(id: number, form: InvalidAsinForm, inclu
|
||||
const { data } = await http.put<unknown>(`${INVALID_ASIN_ENDPOINT}/${id}`, toInvalidAsinUpdateRequest(form, { includeGroup }))
|
||||
unwrap<unknown>(data)
|
||||
}
|
||||
|
||||
/** 删除品牌数据库记录:DELETE /api/admin/invalid-asin-data/{id}。 */
|
||||
export async function deleteInvalidAsin(id: number): Promise<void> {
|
||||
const { data } = await http.delete<unknown>(`${INVALID_ASIN_ENDPOINT}/${id}`)
|
||||
unwrap<unknown>(data)
|
||||
}
|
||||
|
||||
@@ -38,6 +38,12 @@ export function recordSourceLabel(source: string | null | undefined): string {
|
||||
return (source || '').trim().toUpperCase() === 'MANUAL' ? '手动新增' : '自动导入'
|
||||
}
|
||||
|
||||
/** 删除二次确认文案。 */
|
||||
export function invalidAsinDeleteText(item: Pick<InvalidAsinItem, 'dataValue'> | null | undefined): string {
|
||||
const value = item?.dataValue || '该 ASIN'
|
||||
return `确定删除不符合 ASIN“${value}”吗?删除后不可恢复。`
|
||||
}
|
||||
|
||||
/** 解析单条品牌数据库项;缺 id 视为无效。 */
|
||||
export function toInvalidAsinItem(raw: unknown): InvalidAsinItem | null {
|
||||
if (!raw || typeof raw !== 'object') return null
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
import test from 'node:test'
|
||||
import assert from 'node:assert/strict'
|
||||
import { readSource } from './helpers.ts'
|
||||
import { invalidAsinDeleteText } from '../src/pages/invalidasin/invalid-asin-model.ts'
|
||||
|
||||
test('test_task_070_brand_db_delete_normal_primary_path', () => {
|
||||
// 正常主路径:确认文案含 ASIN 值。
|
||||
assert.match(invalidAsinDeleteText({ id: 1, dataValue: 'B0ABC', brand: '', groupId: null, groupName: '', recordSource: 'AUTO' }), /B0ABC/)
|
||||
})
|
||||
|
||||
test('test_task_070_brand_db_delete_normal_variant_input', () => {
|
||||
// 正常变体:空 dataValue 给出兜底文案不崩溃。
|
||||
assert.ok(invalidAsinDeleteText({ id: 2, dataValue: '', brand: '', groupId: null, groupName: '', recordSource: 'AUTO' }))
|
||||
})
|
||||
|
||||
test('test_task_070_brand_db_delete_normal_repeated_operation_is_idempotent', () => {
|
||||
// 正常重复:文案纯函数稳定。
|
||||
const item = { id: 3, dataValue: 'A', brand: '', groupId: null, groupName: '', recordSource: 'AUTO' }
|
||||
assert.equal(invalidAsinDeleteText(item), invalidAsinDeleteText(item))
|
||||
})
|
||||
|
||||
test('test_task_070_brand_db_delete_boundary_empty_input', () => {
|
||||
// 边界空值:缺省条目提示通用文案,不崩溃。
|
||||
assert.ok(invalidAsinDeleteText(undefined as never))
|
||||
})
|
||||
|
||||
test('test_task_070_brand_db_delete_boundary_single_item', () => {
|
||||
// 边界单元素:单条删除文案长度合理。
|
||||
const text = invalidAsinDeleteText({ id: 4, dataValue: 'B0XYZ', brand: '', groupId: null, groupName: '', recordSource: 'AUTO' })
|
||||
assert.ok(text.length > 0)
|
||||
})
|
||||
|
||||
test('test_task_070_brand_db_delete_boundary_limit_or_missing_field', () => {
|
||||
// 边界上限:品牌字段不影响删除确认。
|
||||
const text = invalidAsinDeleteText({ id: 5, dataValue: 'V', brand: '很长的品牌名称不影响删除', groupId: null, groupName: '', recordSource: 'AUTO' })
|
||||
assert.match(text, /V/)
|
||||
})
|
||||
|
||||
test('test_task_070_brand_db_delete_invalid_input_rejected', () => {
|
||||
// 异常输入:确认文案标记不可恢复语义。
|
||||
assert.match(invalidAsinDeleteText({ id: 6, dataValue: 'X', brand: '', groupId: null, groupName: '', recordSource: 'AUTO' }), /删除/)
|
||||
})
|
||||
|
||||
test('test_task_070_brand_db_delete_dependency_failure_returns_actionable_message', () => {
|
||||
// 依赖失败/删除走 adapter:DELETE /invalid-asin-data/{id}。
|
||||
const api = readSource('src/pages/invalidasin/invalid-asin-api.ts')
|
||||
assert.match(api, /deleteInvalidAsin/)
|
||||
assert.match(api, /http\.delete/)
|
||||
assert.match(api, /invalid-asin-data/)
|
||||
const mod = readSource('src/pages/invalidasin/invalid-asin-model.ts')
|
||||
assert.equal(/axios|http\./.test(mod), false, '品牌数据库模型保持纯逻辑')
|
||||
})
|
||||
Reference in New Issue
Block a user