feat: refine login flows and integrate tiangong worship audio

This commit is contained in:
zhouzhibo committed 2026-10-18 23:35:28 +08:00
1 parent bc7bbc52c8
commit 38fc4187ea
49 files changed
+1786 -224

No files matched your search

+13 -13
View File
@@ -7,6 +7,10 @@ const ts = require('typescript')
const root = path.resolve(__dirname, '..')
const filename = path.join(root, 'src/utils/tiangongMock.ts')
const loaded = new Module(filename, module)
const ritualFilename = path.join(root, 'src/utils/incenseRitual.ts')
const ritual = new Module(ritualFilename, module)
ritual._compile(ts.transpileModule(fs.readFileSync(ritualFilename, 'utf8'), { compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2019 } }).outputText, ritualFilename)
loaded.require = id => id === './incenseRitual' ? ritual.exports : Module.prototype.require.call(loaded, id)
loaded._compile(ts.transpileModule(fs.readFileSync(filename, 'utf8'), { compilerOptions: { module: ts.ModuleKind.CommonJS, target: ts.ScriptTarget.ES2019 } }).outputText, filename)
const { createTiangongMock, DEITY_IDS, isDeityId, hasBoundDeity } = loaded.exports
@@ -15,7 +19,7 @@ test('天宫仅财神初始已恭请,五位神仙独立且状态快照隔离',
const first = mock.snapshot()
assert.equal(DEITY_IDS.length, 5)
assert.deepEqual(DEITY_IDS.filter(id => first.deities[id].unlocked), ['wealth'])
assert.equal(first.balance, 100)
assert.equal('balance' in first, false)
first.deities.wealth.incenseCount = 999
assert.equal(mock.snapshot().deities.wealth.incenseCount, 59)
assert.equal(isDeityId('not-a-god'), false)
@@ -25,8 +29,7 @@ test('上香点亮供桌次数+1,不猜测爱心扣减与功德奖励', () =>
const state = mock.incense('wealth')
assert.equal(state.deities.wealth.incenseCount, 60)
assert.equal(state.deities.wealth.lit, true)
assert.equal(state.deities.wealth.merit, 99)
assert.equal(state.balance, 100)
assert.equal('merit' in state.deities.wealth, false)
assert.throws(() => mock.incense('fortune'), /未恭请/)
})
test('模拟恭请和送神只改变指定神仙,返回列表状态可同步', () => {
@@ -38,16 +41,14 @@ test('模拟恭请和送神只改变指定神仙,返回列表状态可同步',
assert.equal(mock.snapshot().deities.fortune.unlocked, false)
assert.equal(mock.snapshot().deities.fortune.lit, false)
assert.equal(mock.snapshot().deities.wealth.unlocked, true)
assert.equal(mock.snapshot().balance, 100)
})
test('档位、非法金额与余额不足可以验证,但不执行任何真实扣款', () => {
test('本期无功德、余额、捐款接口或入口', () => {
const mock = createTiangongMock()
assert.equal(mock.offering('wealth', 99).insufficient, false)
assert.equal(mock.offering('wealth', 168).insufficient, true)
assert.equal(mock.snapshot().balance, 100)
for (const value of [0, -1, 1.5, NaN, Infinity]) assert.throws(() => mock.offering('wealth', value), /正整数/)
mock.setDemoBalance(0)
assert.equal(mock.offering('wealth', 9).insufficient, true)
assert.equal(mock.offering, undefined)
assert.equal(mock.setDemoBalance, undefined)
for (const page of ['fortune', 'tiangong-detail']) {
assert.doesNotMatch(fs.readFileSync(path.join(root, `src/pages/${page}/index.tsx`), 'utf8'), /功德|爱心|充值|balance|merit/)
}
})
test('祈愿/回向校验空值,不持久化姓名或祝愿;重置还原样例', () => {
const mock = createTiangongMock()
@@ -59,9 +60,8 @@ test('祈愿/回向校验空值,不持久化姓名或祝愿;重置还原样
mock.invite('fortune')
mock.reset()
assert.equal(mock.snapshot().deities.fortune.unlocked, false)
assert.equal(mock.snapshot().balance, 100)
})
test('未知神仙不回退为财神,页面只导入Mock;预留契约不被调用', () => {
test('未知神仙不回退为财神,页面通过服务层调用,未接入契约不被调用', () => {
const service = fs.readFileSync(path.join(root, 'src/services/tiangong.ts'), 'utf8')
assert.ok(!service.includes("id || 'wealth'"))
for (const page of ['fortune', 'tiangong-detail']) {