56 lines
3.0 KiB
JavaScript
56 lines
3.0 KiB
JavaScript
|
|
import assert from 'node:assert/strict'
|
||
|
|
import { readFile } from 'node:fs/promises'
|
||
|
|
import { fileURLToPath } from 'node:url'
|
||
|
|
import path from 'node:path'
|
||
|
|
import { parse as parseSfc } from '@vue/compiler-sfc'
|
||
|
|
|
||
|
|
const scriptDir = path.dirname(fileURLToPath(import.meta.url))
|
||
|
|
const sourceRoot = path.resolve(scriptDir, '../src')
|
||
|
|
const [detailSource, listSource, routerSource] = await Promise.all([
|
||
|
|
readFile(path.join(sourceRoot, 'views/data-process/DataProcessDetailView.vue'), 'utf8'),
|
||
|
|
readFile(path.join(sourceRoot, 'views/data-process/DataProcessListView.vue'), 'utf8'),
|
||
|
|
readFile(path.join(sourceRoot, 'router/index.ts'), 'utf8'),
|
||
|
|
])
|
||
|
|
|
||
|
|
const { descriptor, errors } = parseSfc(detailSource, { filename: 'DataProcessDetailView.vue' })
|
||
|
|
assert.equal(errors.length, 0, `数据处理详情页无法解析:${errors[0]}`)
|
||
|
|
assert.ok(descriptor.template?.content.trim(), '数据处理详情页缺少可渲染模板')
|
||
|
|
|
||
|
|
assert.match(routerSource, /path:\s*['"]data-process\/:id['"]/, '缺少数据处理详情动态路由')
|
||
|
|
assert.match(routerSource, /name:\s*['"]data-process-detail['"]/, '数据处理详情路由缺少名称')
|
||
|
|
assert.match(routerSource, /DataProcessDetailView\.vue/, '数据处理详情路由未加载详情页面')
|
||
|
|
assert.match(routerSource, /title:\s*['"]数据处理详情['"]/, '数据处理详情路由标题不正确')
|
||
|
|
|
||
|
|
assert.match(listSource, /name:\s*['"]data-process-detail['"]/, '列表详情按钮未使用详情命名路由')
|
||
|
|
assert.match(listSource, /params:\s*\{\s*id:\s*taskId\s*\}/, '列表详情按钮未传递任务 ID')
|
||
|
|
assert.doesNotMatch(listSource, /查看详情功能开发中/, '详情按钮仍保留开发中提示')
|
||
|
|
|
||
|
|
for (const requiredCopy of [
|
||
|
|
'处理耗时',
|
||
|
|
'开始时间',
|
||
|
|
'完成时间',
|
||
|
|
'输入数据',
|
||
|
|
'输出结果',
|
||
|
|
'处理统计',
|
||
|
|
'处理配置',
|
||
|
|
'结果明细',
|
||
|
|
]) {
|
||
|
|
assert.match(detailSource, new RegExp(requiredCopy), `详情页缺少必要信息:${requiredCopy}`)
|
||
|
|
}
|
||
|
|
|
||
|
|
for (const status of ['completed', 'running', 'pending', 'failed']) {
|
||
|
|
assert.match(detailSource, new RegExp(`status:\\s*['"]${status}['"]`), `详情 Mock 缺少 ${status} 状态`)
|
||
|
|
}
|
||
|
|
|
||
|
|
assert.match(detailSource, /const completedResults:\s*ResultRow\[\]/, '完成任务缺少结果明细 Mock')
|
||
|
|
assert.match(detailSource, /:data="paginatedResults"/, '结果表格未绑定分页后的处理结果')
|
||
|
|
assert.match(detailSource, /v-model="keyword"/, '结果明细缺少搜索能力')
|
||
|
|
assert.match(detailSource, /v-model="statusFilter"/, '结果明细缺少状态筛选')
|
||
|
|
assert.match(detailSource, /router\.push\(`\/dataset\/\$\{detail\.outputDatasetId\}\/preview`\)/, '输出数据集未接入预览入口')
|
||
|
|
assert.match(detailSource, /未找到数据处理任务/, '未知任务 ID 缺少明确空状态')
|
||
|
|
assert.match(detailSource, /width:\s*100%/, '详情页没有铺满内容区域')
|
||
|
|
assert.doesNotMatch(detailSource, /^\s*max-width:\s*\d+px/m, '详情页不应使用固定最大宽度')
|
||
|
|
assert.doesNotMatch(detailSource, /\b(?:password|secret|token)\b/i, '详情页不得展示敏感凭据字段')
|
||
|
|
|
||
|
|
console.log('数据处理任务详情 UI 回归检查通过')
|