const test = require('node:test') const assert = require('node:assert/strict') const fs = require('node:fs') const path = require('node:path') const vm = require('node:vm') const ts = require('typescript') function harness(respond = async () => ({ id: 1 })) { const calls = [], exports = {} const source = fs.readFileSync(path.join(__dirname, '../src/services/tiangongApi.ts'), 'utf8') vm.runInNewContext(ts.transpileModule(source, { compilerOptions: { module: ts.ModuleKind.CommonJS } }).outputText, { exports, require: () => ({ request: (...args) => { calls.push(JSON.parse(JSON.stringify(args))); return respond(...args) } }) }) return { api: exports.tiangongApi, calls } } test('上香、祈愿、回向按新编码提交,各类型不混传明细或接收账号', async () => { const { api, calls } = harness() await api.offer(726, 1) await api.offer(726, 2, '愿顺遂') await api.dedicate(726, '家人', '平安') await api.dedicate(726, '众生', '') assert.deepEqual(calls, [ ['/api/user/virtual-items/offerings', { method: 'POST', data: { userVirtualItemId: 726, offeringType: 1, incenseCount: 3 } }], ['/api/user/virtual-items/offerings', { method: 'POST', data: { userVirtualItemId: 726, offeringType: 2, prayerContent: '愿顺遂' } }], ['/api/user/virtual-items/dedications', { method: 'POST', data: { userVirtualItemId: 726, dedicationTarget: '家人', dedicationContent: '平安' } }], ['/api/user/virtual-items/dedications', { method: 'POST', data: { userVirtualItemId: 726, dedicationTarget: '众生' } }] ]) }) test('请神送神调用独立生命周期接口', async () => { const { api, calls } = harness() await api.lifecycle(726, 1); await api.lifecycle(726, 2) assert.deepEqual(calls.map(call => call[1].data), [{ userVirtualItemId: 726, actionType: 1 }, { userVirtualItemId: 726, actionType: 2 }]) assert.ok(calls.every(call => call[0] === '/api/user/virtual-items/lifecycle')) }) test('列表通过持有ID和字典ID共同关联状态,不把未绑定或其他资产当作已送神', async () => { const { api } = harness(async url => url.startsWith('/api/tiangong') ? [ { id: 81, holdingId: 726, active: false, incenseCount: 7 }, { id: 82, holdingId: 727, active: false }, { id: 83, active: false } ] : [{ id: 726, virtualItemId: 81, status: 0 }, { id: 727, virtualItemId: 999, status: 0 }]) const rows = await api.load() assert.equal(rows[0].holdingStatus, 0); assert.equal(rows[0].incenseCount, 7) assert.equal(rows[1].holdingStatus, undefined); assert.equal(rows[2].holdingStatus, undefined) }) test('查询保留后端按当前用户和神仙返回的最新祈愿及回向', async () => { const { api } = harness(async url => url.startsWith('/api/tiangong') ? [ { id: 81, holdingId: 726, active: true, latestPrayer: { offeringId: 10, prayerContent: '愿顺遂' }, latestDedication: { offeringId: 11, dedicationTarget: '众生', dedicationContent: null } }, { id: 82, latestPrayer: null, latestDedication: null } ] : [{ id: 726, virtualItemId: 81, status: 1 }]) const rows = await api.load() assert.equal(rows[0].latestPrayer.prayerContent, '愿顺遂') assert.equal(rows[0].latestDedication.dedicationTarget, '众生') assert.equal(rows[0].latestDedication.dedicationContent, null) assert.equal(rows[1].latestPrayer, null) assert.equal(rows[1].latestDedication, null) })