66 lines
2.4 KiB
JavaScript
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;
|
|
});
|