'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; });