const test = require('node:test') const assert = require('node:assert') const { useTempDb } = require('./helper') useTempDb() // 必须在 require quota/db 之前 const quota = require('../src/quota') const db = require('../src/db') test('未记录过的用户余额为 0', () => { assert.strictEqual(quota.getBalance('u_new'), 0) }) test('grant 纯累加,不去重', () => { quota.grant('u1', 1) quota.grant('u1', 1) quota.grant('u1', 1) assert.strictEqual(quota.getBalance('u1'), 3) }) test('consume 扣减余额', () => { quota.grant('u2', 5) quota.consume('u2', 2) assert.strictEqual(quota.getBalance('u2'), 3) }) test('consume 不会把余额扣成负数', () => { quota.grant('u3', 1) quota.consume('u3', 10) assert.strictEqual(quota.getBalance('u3'), 0) }) test('reset 把余额归零', () => { quota.grant('u4', 8) quota.reset('u4') assert.strictEqual(quota.getBalance('u4'), 0) }) test('grant 对非法 count 做兜底', () => { quota.grant('u5', 'abc') assert.strictEqual(quota.getBalance('u5'), 1) quota.grant('u5', -5) assert.strictEqual(quota.getBalance('u5'), 2) quota.grant('u5', 9999) assert.strictEqual(quota.getBalance('u5'), 52) // 单次上限 50 }) test('各用户额度互不影响', () => { quota.grant('a', 3) quota.grant('b', 1) assert.strictEqual(quota.getBalance('a'), 3) assert.strictEqual(quota.getBalance('b'), 1) }) test('consume 对从未 grant 过的 openid 也要建行,不丢失 sentTotal', () => { quota.consume('u6', 3) // 仅断言 getBalance 为 0 不足以证明建行了(缺行时本来就返回 0), // 必须直接查表,确认行确实被创建且 sentTotal 记录了这次消费 assert.strictEqual(quota.getBalance('u6'), 0) const row = db.prepare('SELECT * FROM subscribe_quota WHERE openid = ?').get('u6') assert.ok(row, 'u6 对应的记录行应当被创建') assert.strictEqual(row.balance, 0) assert.strictEqual(row.sentTotal, 3) })