50 lines
2.6 KiB
JavaScript
50 lines
2.6 KiB
JavaScript
import assert from 'node:assert/strict'
|
|
import test from 'node:test'
|
|
|
|
import {
|
|
classifyCommit,
|
|
makeIdempotencyKey,
|
|
normalizeRepoName,
|
|
selectUniqueProject,
|
|
validateStatusEvidence,
|
|
} from '../../scripts/kaifa-progress-sync.mjs'
|
|
|
|
test('normalizes repository names and builds a stable idempotency key', () => {
|
|
assert.equal(normalizeRepoName('http://git.example.com/team/CaiWuXiTong.git'), 'CaiWuXiTong')
|
|
assert.equal(makeIdempotencyKey('CaiWuXiTong', 'abc123', 'testing'), 'CaiWuXiTong:abc123:testing')
|
|
})
|
|
|
|
test('matches exactly one project and rejects ambiguous matches', () => {
|
|
const project = {
|
|
projectId: 'p1', projectName: '财务系统', department: '财务中心', repoName: 'CaiWuXiTong',
|
|
productionUrl: 'https://218.93.190.75:8442', deploymentName: 'caiwuxitong',
|
|
}
|
|
const identity = {
|
|
projectName: '财务系统', repoName: 'CaiWuXiTong', productionUrl: 'https://218.93.190.75:8442',
|
|
deploymentName: 'caiwuxitong',
|
|
}
|
|
assert.equal(selectUniqueProject([project], identity).projectId, 'p1')
|
|
assert.throws(() => selectUniqueProject([project, { ...project, projectId: 'p2' }], identity), /AMBIGUOUS/)
|
|
})
|
|
|
|
test('assigns one primary feature and stops on ambiguous feature matches', () => {
|
|
assert.equal(classifyCommit('财务经营报表增加安装明细', ['app/Models/Business/InstallationDetail.php']).rule.key, 'installation-details')
|
|
assert.equal(classifyCommit('修复云数据库管理不支持 PostgreSQL 连接', ['app/Http/Controllers/SystemSettings/Databases.php']).rule.key, 'upstream-connections')
|
|
const esign = classifyCommit('feat: add callback-free eSign status polling', ['app/Console/Commands/PollEsignSignatures.php']).rule
|
|
assert.equal(esign.key, 'courier-esign')
|
|
assert.equal(esign.featureName, 'E 签宝无回调状态轮询与归档')
|
|
assert.equal(
|
|
classifyCommit('feat: align taobao reconciliation headers', ['resources/views/store_receivables/zhongcai_reconciliations/partials/embedded-table.blade.php']).rule.key,
|
|
'zhongcai-reconciliation',
|
|
)
|
|
assert.throws(
|
|
() => classifyCommit('chore: shared update', ['app/Utilities/SystemDatabaseConfiguration.php', 'modules/EcommerceFinance/Services/UpstreamOdbcConnection.php']),
|
|
/FEATURE_MATCH_AMBIGUOUS/,
|
|
)
|
|
})
|
|
|
|
test('done requires passed tests and explicit acceptance evidence', () => {
|
|
assert.throws(() => validateStatusEvidence('done', { testStatus: 'passed', acceptanceEvidence: '' }), /DONE_REQUIRES/)
|
|
assert.doesNotThrow(() => validateStatusEvidence('done', { testStatus: 'passed', acceptanceEvidence: 'production SHA verified' }))
|
|
})
|