Files
baiyue-firstleg/scripts/acceptance-overview.test.mjs
T

90 lines
5.1 KiB
JavaScript
Raw Normal View History

2026-10-21 13:22:35 +08:00
import assert from 'node:assert/strict'
import test from 'node:test'
2026-10-22 14:37:59 +08:00
import { summarizeReport, describeHomepageBusinessCoverage } from './acceptance-overview.mjs'
import { readFileSync } from 'node:fs'
import { describeAcceptanceScope, normalizeModuleOrder } from './admin-test-env-acceptance.mjs'
2026-10-21 13:22:35 +08:00
2026-10-22 14:37:59 +08:00
test('业务覆盖清单逐项对应客户端首页八个入口,未闭环不可标记通过', () => {
const homepage = readFileSync(new URL('../../apps/client-web/src/modules/dashboard/views/DashboardView.vue', import.meta.url), 'utf8')
const actions = [...homepage.matchAll(/\{ title: '([^']+)'[^\n]+route: '([^']+)'/g)]
.map(match => ({ title: match[1], route: match[2] }))
const businesses = describeHomepageBusinessCoverage()
assert.equal(actions.length, 8)
assert.deepEqual(businesses.map(({ title, route }) => ({ title, route })), actions)
const scope = describeAcceptanceScope()
const registered = new Set([...scope.defaultModules, ...scope.optionalModules])
for (const business of businesses) {
assert.ok(business.modules.every(name => registered.has(name)))
assert.deepEqual(business.defaultModules, business.modules, `${business.title}正常链必须默认执行`)
assert.ok(business.modules.every(name => !scope.fixedResourceSkippedModules.includes(name)), `${business.title}不能因固定客户跳过`)
2026-10-22 14:37:59 +08:00
assert.ok(business.additionalModules.every(({ name }) => registered.has(name)))
assert.ok(business.remaining)
assert.equal(business.currentVersionVerified, false)
assert.equal(business.endToEndCoverage, 'INCOMPLETE')
}
assert.ok(businesses.find(item => item.title === '海外采购').modules.includes('phase4-overseas-wallet-and-pallet-cost'))
assert.ok(businesses.find(item => item.title === '退货换标').modules.includes('phase4-overseas-return-followups'))
})
test('八大业务定向执行保留正常履约的直接前置顺序', () => {
const dependencies = [
['phase4-overseas-return-receipt', 'phase4-overseas-return-followups'],
['phase4-overseas-business', 'phase4-overseas-wallet-and-pallet-cost'],
['phase4-overseas-client-services', 'phase4-overseas-dispatch'],
['phase4-overseas-business', 'phase5-overseas-fulfillment'],
['phase4-overseas-dispatch', 'phase5-overseas-fulfillment'],
]
for (const [producer, consumer] of dependencies) {
const planned = normalizeModuleOrder([consumer])
assert.ok(planned.includes(producer), `${consumer}缺少${producer}`)
assert.ok(planned.indexOf(producer) < planned.indexOf(consumer))
assert.equal(planned.filter(name => name === producer).length, 1)
}
2026-10-22 14:37:59 +08:00
})
2026-10-21 13:22:35 +08:00
test('注册表返回独立副本,默认与可选不重复', () => {
const scope = describeAcceptanceScope()
assert.ok(scope.defaultModules.includes('appointment-work'))
2026-10-22 14:37:59 +08:00
assert.ok(scope.defaultModules.includes('phase4-overseas-return-followups'))
2026-10-21 13:22:35 +08:00
assert.ok(scope.optionalModules.every((name) => !scope.defaultModules.includes(name)))
2026-10-22 14:37:59 +08:00
assert.ok(scope.fixedResourceSkippedModules.includes('customers'))
assert.ok(!scope.fixedResourceSkippedModules.includes('suppliers'))
scope.fixedResourceSkippedModules.length = 0
assert.ok(describeAcceptanceScope().fixedResourceSkippedModules.length > 0)
2026-10-21 13:22:35 +08:00
scope.defaultModules.length = 0
assert.ok(describeAcceptanceScope().defaultModules.length > 0)
})
test('旧报告全绿也不推断默认全量或当前版本通过', () => {
const result = summarizeReport({ success: true, steps: [{ module: 'orders', passed: true }] })
assert.equal(result.scope, 'UNKNOWN_LEGACY_REPORT')
assert.equal(result.currentVersionVerified, false)
assert.equal(result.result, 'RECORDED_CHECKS_PASSED')
})
test('跳过、覆盖缺口和未执行模块不能被success掩盖', () => {
const base = { success: true, steps: [{ module: 'orders', passed: true }],
executionScope: { plannedModules: ['orders', 'finance'], defaultModules: ['orders', 'finance'] } }
assert.equal(summarizeReport(base).result, 'INCOMPLETE')
assert.deepEqual(summarizeReport(base).missingPlannedModules, ['finance'])
assert.equal(summarizeReport({ ...base, coverageGaps: [{ blocking: true }] }).result, 'FAILED')
assert.equal(summarizeReport({ steps: [{ passed: true, skipped: true }] }).result, 'INCOMPLETE')
assert.equal(summarizeReport({ steps: [{ passed: true }], modules: [{ name: 'orders', skipped: true }] }).result, 'INCOMPLETE')
})
test('前置退出与接口失败分开统计,输出不携带敏感载荷', () => {
const result = summarizeReport({ success: false, gateway: 'SECRET', steps: [
{ module: 'exports', passed: false, request: { path: 'SECRET' }, message: 'SECRET' },
{ module: 'dependent', passed: false, evidence: 'SECRET' },
] })
assert.equal(result.failed, 2)
assert.equal(result.failuresWithRequest, 1)
assert.equal(result.failuresWithoutRequest, 1)
assert.equal(JSON.stringify(result).includes('SECRET'), false)
})
test('准备数据和局部模式不冒充完整验收,空报告拒绝', () => {
assert.equal(summarizeReport({ fullAcceptance: false, steps: [{ passed: true }] }).result, 'INCOMPLETE')
assert.throws(() => summarizeReport({ success: true, steps: [] }), /steps/)
})