const assert = require('node:assert/strict');
const fs = require('node:fs');
const path = require('node:path');
const test = require('node:test');
const modulePath = path.join(__dirname, '..', 'public', 'js', 'merit-pages.js');
const MeritPages = fs.existsSync(modulePath) ? require(modulePath) : {};
function requireFunction(name) {
assert.equal(typeof MeritPages[name], 'function', `缺少 MeritPages.${name}`);
return MeritPages[name];
}
test('功德录只从 URL 读取安全的真实家谱和功德记录编号', () => {
const getCurrentGenealogyId = requireFunction('getCurrentGenealogyId');
const getCurrentMeritId = requireFunction('getCurrentMeritId');
assert.equal(
getCurrentGenealogyId('?genealogyId=2060000000000000001&meritId=2060000000000000002'),
'2060000000000000001'
);
assert.equal(
getCurrentMeritId('?genealogyId=2060000000000000001&meritId=2060000000000000002'),
'2060000000000000002'
);
assert.equal(getCurrentGenealogyId(''), '');
assert.equal(getCurrentMeritId('?meritId=unsafe'), '');
});
test('功德记录写入只构造 YAML MeritRecordBody 并转换后端时间格式', () => {
const buildMeritRecordBody = requireFunction('buildMeritRecordBody');
assert.deepEqual(buildMeritRecordBody({
donorName: ' 叶明 ',
meritType: 'repair',
meritTitle: ' 修缮宗祠 ',
meritContent: ' 参与修缮 ',
amount: '500.50',
meritTime: '2026-07-26T10:00',
sortOrder: '3',
status: '0',
meritId: 'should-not-send',
appUserId: 'should-not-send',
mediaOssIds: 'should-not-send'
}), {
donorName: '叶明',
meritType: 'repair',
meritTitle: '修缮宗祠',
meritContent: '参与修缮',
amount: 500.5,
meritTime: '2026-07-26 10:00:00',
sortOrder: 3,
status: '0'
});
});
test('功德记录校验必填、枚举、金额精度、时间、排序和可重读状态', () => {
const buildMeritRecordBody = requireFunction('buildMeritRecordBody');
const validateMeritRecordBody = requireFunction('validateMeritRecordBody');
assert.equal(validateMeritRecordBody({ donorName: '', meritTitle: '标题' }), '请填写功德人姓名');
assert.equal(validateMeritRecordBody({ donorName: '叶明', meritTitle: '' }), '请填写功德标题');
assert.equal(
validateMeritRecordBody({ donorName: '叶明', meritTitle: '标题', meritType: 'service' }),
'功德类型无效'
);
assert.equal(
validateMeritRecordBody(buildMeritRecordBody({ donorName: '叶明', meritTitle: '标题', amount: '9007199254740993.01' })),
'功德金额超出浏览器可安全提交的精度'
);
assert.equal(
validateMeritRecordBody({ donorName: '叶明', meritTitle: '标题', meritTime: '2026-02-30 10:00:00' }),
'功德时间格式无效'
);
assert.equal(
validateMeritRecordBody(buildMeritRecordBody({ donorName: '叶明', meritTitle: '标题', sortOrder: '1.5' })),
'排序值必须是安全整数'
);
assert.equal(
validateMeritRecordBody({ donorName: '叶明', meritTitle: '标题', status: '1' }),
'当前 PC 无法重新读取停用功德记录,暂不开放停用'
);
assert.equal(
validateMeritRecordBody({ donorName: '叶明', meritTitle: '标题', meritType: 'public', amount: -500.25, status: '0' }),
''
);
});
test('功德记录响应使用 PC MeritRecordVo 并保留 BigDecimal 字符串', () => {
const normalizeMeritRecord = requireFunction('normalizeMeritRecord');
assert.deepEqual(normalizeMeritRecord({
meritId: '2060000000000000001',
genealogyId: '2060000000000000002',
genealogyNo: 'G20260729001',
genealogyName: '叶氏家谱',
surname: '叶',
appUserId: '2060000000000000003',
appUserNickName: '叶子',
appUserPhone: '19100000000',
donorName: '叶明',
meritType: 'repair',
meritTitle: '修缮宗祠',
meritContent: '参与修缮',
amount: '500.50',
meritTime: '2026-07-26 10:00:00',
sortOrder: 1,
status: '0',
remark: '年度功德'
}), {
meritId: '2060000000000000001',
genealogyId: '2060000000000000002',
genealogyNo: 'G20260729001',
genealogyName: '叶氏家谱',
surname: '叶',
appUserId: '2060000000000000003',
appUserNickName: '叶子',
appUserPhone: '19100000000',
donorName: '叶明',
meritType: 'repair',
meritTitle: '修缮宗祠',
meritContent: '参与修缮',
amount: '500.50',
meritTime: '2026-07-26 10:00:00',
sortOrder: 1,
status: '0',
remark: '年度功德'
});
assert.equal(normalizeMeritRecord({
meritId: Number('2060000000000000001'),
genealogyId: '2',
donorName: '叶明',
meritType: 'donation',
meritTitle: '捐赠',
amount: '1',
status: '0'
}), null);
});
test('功德记录详情转义内容并隐藏手机号和内部编号', () => {
const normalizeMeritRecord = requireFunction('normalizeMeritRecord');
const renderMeritDetail = requireFunction('renderMeritDetail');
const record = normalizeMeritRecord({
meritId: '1',
genealogyId: '2',
appUserId: '3',
appUserNickName: '叶子',
appUserPhone: '19100000000',
donorName: '',
meritType: 'public',
meritTitle: '公益助学',
meritContent: '
资助学生',
amount: '500.50',
meritTime: '2026-07-26 10:00:00',
sortOrder: 1,
status: '0'
});
const html = renderMeritDetail(record);
assert.doesNotMatch(html, /