Files
go_bt/tests/recharge_reconciler.test.js
T

66 lines
2.4 KiB
JavaScript

'use strict';
const assert = require('assert');
const fs = require('fs');
const os = require('os');
const path = require('path');
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'recharge-reconciler-'));
const Config = require('../src/core/config');
Config.DATA_DIR = tempDir;
Config.DB_PATH = path.join(tempDir, 'accounts.db');
const database = require('../src/core/database');
const { createRechargeReconciler } = require('../src/services/recharge_reconciler');
(async () => {
try {
database.initDB();
const email = 'late-success@example.com';
const operationId = `cardpay-v1-${'c'.repeat(64)}`;
database.upsertAccount({ email, password: 'secret' });
assert.deepStrictEqual(database.claimAccountsForRecharge([{
email,
operationId,
cardKey: 'LATE-SUCCESS-CARD',
}]), { success: true });
database.recordRechargeAttempt(email, operationId, 1, '901', 'pending', 'pending');
database.updateAccountRechargeForOperation(email, operationId, '充值中', '901', 'processing');
database.getDb().prepare(`
UPDATE recharge_attempts
SET last_checked_at = datetime('now', '-2 minutes')
WHERE remote_task_id = '901'
`).run();
let queryCalls = 0;
const reconciler = createRechargeReconciler({
database,
loadCredentials: async () => ({ keyId: 'unit-key', secret: 'unit-secret' }),
createClient: () => ({
async getTask(input) {
queryCalls += 1;
assert.strictEqual(input.taskId, '901');
assert.strictEqual(input.expectedEmail, email);
return { success: true, taskId: '901', status: 'success', failed: false };
},
}),
logger: () => {},
});
const result = await reconciler.runOnce();
assert.strictEqual(result.skipped, false);
assert.strictEqual(result.total, 1);
assert.strictEqual(queryCalls, 1);
const account = database.getAccount(email);
assert.strictEqual(account.recharge_status, '充值成功');
assert.strictEqual(account.recharge_task_id, '901');
assert.strictEqual(account.recharge_message, '充值成功(后台自动对账)');
assert.strictEqual(database.getRechargeAttempts(email, operationId)[0].status, 'success');
console.log('recharge_reconciler.test.js: PASS');
} finally {
try { database.getDb().close(); } catch (_) {}
fs.rmSync(tempDir, { recursive: true, force: true });
}
})().catch(error => {
console.error(error);
process.exitCode = 1;
});