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, /