align(数字人版本): 分页(前端20/页)、上传进度(正在上传N%)、状态三态(草稿/已发布/已废弃)、文件大小固定两位MB、说明50字截断、RELEASED恒显下载点击取链接、确认文案/按钮名/仅zip校验/弹窗描述对齐(对齐 admin.js loadDigitalHumanVersions/downloadDigitalHumanVersion/上传段)

This commit is contained in:
2026-09-05 23:28:41 +08:00
parent 207f48f7d8
commit 553aca34f7
13 changed files with 251 additions and 58 deletions
@@ -0,0 +1,71 @@
import test from 'node:test'
import assert from 'node:assert/strict'
import { readSource } from './helpers.ts'
import {
digitalHumanChangelogShort,
digitalHumanVersionFileSizeText,
normalizeDigitalHumanStatus,
} from '../src/pages/records/digitalhuman-dto.ts'
import { digitalHumanStatusDisplay } from '../src/pages/records/digitalhuman-status-display.ts'
import { releaseDigitalHumanConfirmText } from '../src/pages/records/digitalhuman-release.ts'
import { setLatestDigitalHumanConfirmText } from '../src/pages/records/digitalhuman-latest.ts'
import { validateDigitalHumanUpload } from '../src/pages/records/digitalhuman-upload-model.ts'
/** 对齐 admin.js:6331-6358/6520-6550:三态、固定两位MB、50字符说明、下载按钮条件、确认文案、zip 校验、上传进度。 */
test('align_digital_human_status_three_states', () => {
assert.equal(normalizeDigitalHumanStatus('DRAFT'), 'DRAFT')
assert.equal(normalizeDigitalHumanStatus('RELEASED'), 'RELEASED')
assert.equal(normalizeDigitalHumanStatus('DEPRECATED'), 'DEPRECATED')
assert.equal(normalizeDigitalHumanStatus('unknown'), 'DEPRECATED')
assert.equal(normalizeDigitalHumanStatus(''), 'DEPRECATED')
assert.deepEqual(digitalHumanStatusDisplay('DRAFT'), { text: '草稿', tag: 'info' })
assert.deepEqual(digitalHumanStatusDisplay('RELEASED'), { text: '已发布', tag: 'success' })
assert.deepEqual(digitalHumanStatusDisplay('DEPRECATED'), { text: '已废弃', tag: 'danger' })
})
test('align_digital_human_file_size_fixed_two_decimals_mb', () => {
assert.equal(digitalHumanVersionFileSizeText(2 * 1024 * 1024), '2.00 MB')
assert.equal(digitalHumanVersionFileSizeText(1.5 * 1024 * 1024), '1.50 MB')
assert.equal(digitalHumanVersionFileSizeText(undefined), '-')
assert.equal(digitalHumanVersionFileSizeText(0), '-')
})
test('align_digital_human_changelog_50_char_truncate', () => {
assert.equal(digitalHumanChangelogShort(''), '-')
assert.equal(digitalHumanChangelogShort('短说明'), '短说明')
const long = 'x'.repeat(60)
assert.equal(digitalHumanChangelogShort(long), 'x'.repeat(50) + '...')
})
test('align_digital_human_confirm_texts', () => {
assert.equal(releaseDigitalHumanConfirmText('1.0.1'), '确认发布版本 1.0.1 吗?')
assert.equal(setLatestDigitalHumanConfirmText('1.0.1'), '确认将版本 1.0.1 设为最新吗?客户端会自动检测更新。')
})
test('align_digital_human_upload_zip_only', () => {
// 仅 zip + 对应错误文案(对齐 admin.js:6520-6523)。
const { errors } = validateDigitalHumanUpload({ version: '1.0.1', file: { name: 'pkg.rar', size: 100 } })
assert.equal(errors.file, '仅支持 .zip 格式')
assert.equal(validateDigitalHumanUpload({ version: '1.0.1', file: { name: 'pkg.zip', size: 100 } }).valid, true)
})
test('align_digital_human_api_download_url', () => {
const api = readSource('src/pages/records/digitalhuman-api.ts')
assert.match(api, /download-url/, '含下载链接端点')
assert.match(api, /onUploadProgress/, '上传带进度回调')
})
test('align_digital_human_page_wiring', () => {
const page = readSource('src/pages/records/RecordsDigitalHumanVersionPage.vue')
assert.match(page, /pageSize\s*=\s*20|:page-size="20"/, '分页大小 20')
assert.match(page, /el-pagination/, '分页组件')
assert.match(page, /设为最新/, '按钮名对齐“设为最新”')
assert.match(page, /上传(草稿状态)/, '上传按钮名对齐')
assert.match(page, /上传数字人程序 ZIP 包,系统会自动计算 MD5 并存储到 OSS。上传后状态为草稿,需要手动发布/, '上传弹窗描述对齐')
assert.match(page, /正在上传/, '上传进度文案')
assert.match(page, /digitalHumanDeleteConfirmText/, '删除确认文案走对齐模型')
assert.match(page, /downloadUrl|fetchDigitalHumanDownloadUrl/, 'RELEASED 下载按钮点击取链接')
assert.match(page, /已废弃/, '状态三态接入')
assert.match(page, /digitalHumanChangelogShort/, '更新说明 50 字符截断')
})
+9 -9
View File
@@ -11,9 +11,9 @@ test('test_task_131_dh_version_dto_normal_primary_path', () => {
})
test('test_task_131_dh_version_dto_normal_variant_input', () => {
// 正常变体:未知状态回 DRAFT
assert.equal(normalizeDigitalHumanStatus('weird'), 'DRAFT')
assert.equal(normalizeDigitalHumanStatus(''), 'DRAFT')
// 正常变体:未知状态回 已废弃(对齐 admin.js:6337 三态)
assert.equal(normalizeDigitalHumanStatus('weird'), 'DEPRECATED')
assert.equal(normalizeDigitalHumanStatus(''), 'DEPRECATED')
})
test('test_task_131_dh_version_dto_repeated_is_idempotent', () => {
@@ -22,8 +22,8 @@ test('test_task_131_dh_version_dto_repeated_is_idempotent', () => {
})
test('test_task_131_dh_version_dto_boundary_empty_input', () => {
// 边界空值:非字符串按 DRAFT
assert.equal(normalizeDigitalHumanStatus(null as unknown as string), 'DRAFT')
// 边界空值:非字符串按 已废弃
assert.equal(normalizeDigitalHumanStatus(null as unknown as string), 'DEPRECATED')
})
test('test_task_131_dh_version_dto_boundary_single_item', () => {
@@ -32,14 +32,14 @@ test('test_task_131_dh_version_dto_boundary_single_item', () => {
})
test('test_task_131_dh_version_dto_boundary_limit_or_missing_field', () => {
// 边界上限/缺字段:版本类型定义里 status 为受控枚举。
// 边界上限/缺字段:版本类型定义里 status 为三态受控枚举。
const mod = readSource('src/pages/records/digitalhuman-dto.ts')
assert.match(mod, /'DRAFT' \| 'RELEASED'/)
assert.match(mod, /'DRAFT' \| 'RELEASED' \| 'DEPRECATED'/)
})
test('test_task_131_dh_version_dto_invalid_input_rejected', () => {
// 异常输入:非受控状态被拒绝为 DRAFT
assert.equal(normalizeDigitalHumanStatus(1 as unknown as string), 'DRAFT')
// 异常输入:非受控状态归为 已废弃(对齐 admin.js 三态兜底)
assert.equal(normalizeDigitalHumanStatus(1 as unknown as string), 'DEPRECATED')
})
test('test_task_131_dh_version_dto_dependency_failure_returns_actionable_message', () => {
+4 -4
View File
@@ -20,8 +20,8 @@ test('test_task_134_dh_status_display_repeated_is_idempotent', () => {
})
test('test_task_134_dh_status_display_boundary_empty_input', () => {
// 边界空值:非受控状态按草稿展示
assert.deepEqual(digitalHumanStatusDisplay(''), { text: '草稿', tag: 'info' })
// 边界空值:非受控状态按 已废弃 展示(对齐 admin.js 三态)
assert.deepEqual(digitalHumanStatusDisplay(''), { text: '已废弃', tag: 'danger' })
})
test('test_task_134_dh_status_display_boundary_single_item', () => {
@@ -35,8 +35,8 @@ test('test_task_134_dh_status_display_boundary_limit_or_missing_field', () => {
})
test('test_task_134_dh_status_display_invalid_input_rejected', () => {
// 异常输入:非字符串按草稿
assert.deepEqual(digitalHumanStatusDisplay(null as unknown as string), { text: '草稿', tag: 'info' })
// 异常输入:非字符串按 已废弃
assert.deepEqual(digitalHumanStatusDisplay(null as unknown as string), { text: '已废弃', tag: 'danger' })
})
test('test_task_134_dh_status_display_dependency_failure_returns_actionable_message', () => {
+1 -1
View File
@@ -6,7 +6,7 @@ import { canReleaseDigitalHumanVersion, releaseDigitalHumanConfirmText } from '.
test('test_task_135_dh_release_normal_primary_path', () => {
// 正常主路径:草稿版本可发布并给出确认文案。
assert.equal(canReleaseDigitalHumanVersion('DRAFT'), true)
assert.equal(releaseDigitalHumanConfirmText('1.0.0'), '确发布数字人版本 1.0.0 吗?')
assert.equal(releaseDigitalHumanConfirmText('1.0.0'), '确发布版本 1.0.0 吗?')
})
test('test_task_135_dh_release_normal_variant_input', () => {
+1 -1
View File
@@ -6,7 +6,7 @@ import { canSetLatestDigitalHumanVersion, setLatestDigitalHumanConfirmText } fro
test('test_task_136_dh_set_latest_normal_primary_path', () => {
// 正常主路径:已发布版本可设为最新并给确认文案。
assert.equal(canSetLatestDigitalHumanVersion('RELEASED'), true)
assert.equal(setLatestDigitalHumanConfirmText('2.0.0'), '确定将数字人版本 2.0.0 设为最新吗?')
assert.equal(setLatestDigitalHumanConfirmText('2.0.0'), '确认将版本 2.0.0 设为最新吗?客户端会自动检测更新。')
})
test('test_task_136_dh_set_latest_normal_variant_input', () => {
+11 -8
View File
@@ -32,29 +32,32 @@ test('test_task_261_dh_normal_repeated_operation_is_idempotent', () => {
test('test_task_261_dh_boundary_empty_input', () => {
assert.equal(latestBadgeText(true), '最新')
assert.equal(latestBadgeText(false), '')
assert.equal(digitalHumanStatusDisplay('').text, '草稿', '未知状态归一草稿')
// 未知状态归一 已废弃(对齐 admin.js 三态)。
assert.equal(digitalHumanStatusDisplay('').text, '已废弃')
})
test('test_task_261_dh_boundary_single_item', () => {
const page = readSource('src/pages/records/RecordsDigitalHumanVersionPage.vue')
assert.match(page, /formatFileSize/, '文件大小走共享格式化')
assert.match(page, /md5Short/, 'MD5 截展示')
assert.match(page, /digitalHumanVersionFileSizeText/, '文件大小固定两位 MB(对齐 admin')
assert.match(page, /substring\(0, 12\)/, 'MD5 截 12 位展示')
assert.match(page, /canReleaseDigitalHumanVersion/, '发布按钮按状态显隐')
})
test('test_task_261_dh_boundary_limit_or_missing_field', () => {
// 边界上限:文件大小格式化(复用了版本页 formatFileSize)。
const fmt = readSource('src/pages/records/version-format.ts')
assert.match(fmt, /formatFileSize/)
// 边界上限:文件大小固定 (bytes/1024/1024).toFixed(2)+' MB'(对齐 admin.js:6340)。
const dto = readSource('src/pages/records/digitalhuman-dto.ts')
assert.match(dto, /1024 \/ 1024\)\.toFixed\(2\)/, '固定两位小数 MB')
})
test('test_task_261_dh_invalid_input_rejected', () => {
// 异常:删除需二次确认;删除走后端 DELETE;删除失败有兜底。
// 异常:删除需二次确认(对齐 admin.js:6356 文案);删除走后端 DELETE;删除失败有兜底。
const page = readSource('src/pages/records/RecordsDigitalHumanVersionPage.vue')
assert.match(page, /此操作不可恢复/, '删除需危险二次确认')
assert.match(page, /digitalHumanDeleteConfirmText/, '删除确认文案走对齐模型')
assert.match(page, /删除失败/, '删除失败有兜底文案')
const api = readSource('src/pages/records/digitalhuman-api.ts')
assert.match(api, /http\.delete/, '删除调用 DELETE 适配')
const dto = readSource('src/pages/records/digitalhuman-dto.ts')
assert.match(dto, /确认删除版本 .* 吗?该操作会删除对应文件,无法恢复/, '删除文案对齐 admin')
})
test('test_task_261_dh_dependency_failure_returns_actionable_message', () => {