Files
crawler-plugin/admin-frontend-vue/tests/task-245.test.ts
T

87 lines
4.2 KiB
TypeScript

import test from 'node:test'
import assert from 'node:assert/strict'
import { readSource } from './helpers.ts'
import {
ADMIN_CONFIRM,
acquireConfirmLock,
confirmMessageFor,
createConfirmPlan,
isConfirmLocked,
releaseConfirmLock,
} from '../src/components/admin-confirm-model.ts'
// module 13 task 245:二次确认共享组件 —— 默认文案规则对齐 admin-interactions
// (优先显式 message;否则「确认删除“X”吗?此操作可能影响已有数据。」;删除类 danger 默认「删除前确认/确认删除」)。
test('test_task_245_confirm_model_normal_primary_path', () => {
// 正常主路径:danger 默认删除确认计划。
const plan = createConfirmPlan({ danger: true, targetName: '店铺A' })
assert.equal(plan.title, ADMIN_CONFIRM.dangerTitle)
assert.equal(plan.confirmText, ADMIN_CONFIRM.confirmDeleteOk)
assert.equal(plan.cancelText, ADMIN_CONFIRM.cancel)
assert.equal(plan.message, '确认删除“店铺A”吗?此操作可能影响已有数据。')
})
test('test_task_245_confirm_model_normal_variant_input', () => {
// 正常变体:显式 message 优先于行名拼接;非危险操作使用默认标题与「确认操作」。
const explicit = createConfirmPlan({ danger: true, targetName: 'X', message: '确定清空该次导入吗?' })
assert.equal(explicit.message, '确定清空该次导入吗?')
const soft = createConfirmPlan({ danger: false })
assert.equal(soft.title, ADMIN_CONFIRM.defaultTitle)
assert.equal(soft.confirmText, ADMIN_CONFIRM.confirmOk)
assert.notEqual(soft.type, 'warning')
})
test('test_task_245_confirm_model_normal_repeated_operation_is_idempotent', () => {
// 正常重复:同一入参产出同一计划(无状态污染)。
const a = createConfirmPlan({ danger: true, targetName: '店铺B' })
const b = createConfirmPlan({ danger: true, targetName: '店铺B' })
assert.deepEqual(a, b)
})
test('test_task_245_confirm_model_boundary_empty_input', () => {
// 边界空:无名称时用「该项」默认文案;空串/空白名称被修剪。
const noName = createConfirmPlan({})
assert.match(noName.message, /确认删除该项吗?/)
const blank = createConfirmPlan({ targetName: ' ' })
assert.match(blank.message, /该项/)
})
test('test_task_245_confirm_model_boundary_single_item', () => {
// 边界单元素:confirmMessageFor 修剪首尾空白,保留内部名称。
assert.equal(confirmMessageFor(' 用户1 '), '确认删除“用户1”吗?此操作可能影响已有数据。')
assert.equal(confirmMessageFor(undefined), '确认删除该项吗?此操作可能影响已有数据。')
})
test('test_task_245_confirm_model_boundary_limit_or_missing_field', () => {
// 边界上限:danger=false 但给 dangerTitle/删除文案仍能被显式覆盖。
const plan = createConfirmPlan({ danger: false, title: '请确认停用', confirmText: '确认停用' })
assert.equal(plan.title, '请确认停用')
assert.equal(plan.confirmText, '确认停用')
})
test('test_task_245_confirm_model_invalid_input_rejected', () => {
// 异常:并发多开被拒绝(acquire 返回 false),释放后可再开。
assert.equal(isConfirmLocked(), false)
assert.equal(acquireConfirmLock(), true)
assert.equal(acquireConfirmLock(), false)
assert.equal(isConfirmLocked(), true)
releaseConfirmLock()
assert.equal(isConfirmLocked(), false)
assert.equal(acquireConfirmLock(), true)
releaseConfirmLock()
})
test('test_task_245_confirm_component_dependency_failure_returns_actionable_message', () => {
// 依赖失败:组件/调用入口真实接入 ElMessageBox,按钮键来自模型。
const imperative = readSource('src/components/admin-confirm.ts')
assert.match(imperative, /ElMessageBox\.confirm/, '打开入口需调用 ElMessageBox.confirm')
assert.match(imperative, /confirmButtonText/)
assert.match(imperative, /cancelButtonText/)
assert.match(imperative, /createConfirmPlan/)
const component = readSource('src/components/AdminConfirm.vue')
assert.match(component, /openAdminConfirm/, '组件需暴露 open 打开入口')
const model = readSource('src/components/admin-confirm-model.ts')
assert.match(model, /此操作可能影响已有数据。/)
})