const test = require('node:test') const assert = require('node:assert') const { useTempDb } = require('./helper') useTempDb() const db = require('../src/db') const { grantQuota, getQuotaStatus } = require('../src/index') const OPENID = 'o_test_1' // 往指定用户名下插一条纪念日 function seed(openid, id, personName, offsetDays, remindDays) { const d = new Date(Date.now() + offsetDays * 86400000) db.prepare(` INSERT OR REPLACE INTO anniversaries (id, openid, personId, personName, type, isLunar, solarYear, solarMonth, solarDay, importance, remindEnabled, remindDays, createTime, updateTime) VALUES (?, ?, 'p1', ?, 'birthday', 0, ?, ?, ?, 'high', 1, ?, 0, 0) `).run(id, openid, personName, d.getFullYear(), d.getMonth() + 1, d.getDate(), remindDays) } seed(OPENID, 'seed1', '张三', 10, 3) test('grant 累加并返回新余额', () => { assert.deepStrictEqual(grantQuota(OPENID, { count: 1 }), { success: true, balance: 1 }) assert.deepStrictEqual(grantQuota(OPENID, { count: 1 }), { success: true, balance: 2 }) }) test('grant 的 data 缺省时按 1 计', () => { const before = getQuotaStatus(OPENID).balance grantQuota(OPENID, undefined) assert.strictEqual(getQuotaStatus(OPENID).balance, before + 1) }) test('get 返回余额与风险信息', () => { const res = getQuotaStatus(OPENID) assert.strictEqual(res.success, true) assert.strictEqual(typeof res.balance, 'number') assert.ok(Array.isArray(res.atRiskNames)) }) test('无纪念日时没有风险', () => { const res = getQuotaStatus('o_empty') assert.strictEqual(res.atRiskCount, 0) assert.deepStrictEqual(res.atRiskNames, []) }) test('纪念日多于余额时报出风险人名', () => { const OP = 'o_test_2' // 造两条近期纪念日,共 4 个提醒事件,但只给 1 点额度 seed(OP, 'x1', '甲', 10, 3) seed(OP, 'x2', '乙', 20, 3) require('../src/quota').grant(OP, 1) const res = getQuotaStatus(OP) assert.ok(res.atRiskCount >= 1, '应当报出风险') assert.ok(res.atRiskNames.includes('乙'), '时间靠后的乙必然有风险') })