Files
docs/悦/货代SAAS平台后台/tests/verify-customer-account-deduction.cjs
T
2026-08-21 09:20:26 +08:00

72 lines
3.2 KiB
JavaScript

const assert = require('node:assert/strict');
const fs = require('node:fs');
const path = require('node:path');
const vm = require('node:vm');
const root = path.resolve(__dirname, '..');
const moduleHtml = fs.readFileSync(path.join(root, 'prototype-src/modules/08-finance.html'), 'utf8');
const overlays = fs.readFileSync(path.join(root, 'prototype-src/overlays.html'), 'utf8');
const appJs = fs.readFileSync(path.join(root, 'prototype-src/app.js'), 'utf8');
assert.ok(appJs.includes("showCustomerDeduction(\\'"), '客户账户列表缺少扣款入口');
assert.ok(moduleHtml.includes('id="ca-detail-deduction-btn"'), '账户详情缺少手动扣款按钮');
[
'modal-customer-deduction',
'ca-deduction-id',
'ca-deduction-customer',
'ca-deduction-current',
'ca-deduction-available',
'ca-deduction-amount',
'ca-deduction-type',
'ca-deduction-date',
'ca-deduction-order',
'ca-deduction-remark'
].forEach(id => assert.ok(overlays.includes(`id="${id}"`), `扣款弹窗缺少字段 ${id}`));
assert.ok(overlays.includes('onclick="saveCustomerDeduction()"'), '扣款弹窗确认按钮未接通');
function loadFunction(name, nextName) {
const start = appJs.indexOf(`function ${name}`);
const end = appJs.indexOf(`\nfunction ${nextName}`, start);
assert.ok(start >= 0 && end > start, `缺少可测试函数 ${name}`);
const sandbox = {};
vm.runInNewContext(`${appJs.slice(start, end)}\nresult=${name};`, sandbox);
return sandbox.result;
}
const validate = loadFunction('validateCustomerDeduction', 'applyCustomerDeduction');
const apply = loadFunction('applyCustomerDeduction', 'showCustomerDeduction');
const normalize = value => JSON.parse(JSON.stringify(value));
assert.equal(validate({status:'正常', balance:100, frozen:20}, 80), '');
assert.equal(validate({status:'正常', balance:100, frozen:20}, 80.01), '扣款金额不能超过可用余额');
assert.equal(validate({status:'冻结', balance:100, frozen:0}, 10), '当前账户状态不允许扣款');
assert.equal(validate({status:'停用', balance:100, frozen:0}, 10), '当前账户状态不允许扣款');
assert.equal(validate({status:'正常', balance:100, frozen:0}, 0), '请输入大于0的扣款金额');
const account = {status:'正常', balance:100, frozen:20, lastChange:'2026-08-01 08:00'};
const transactions = [];
const transaction = apply(account, transactions, {
amount:35.5,
type:'仓储费用',
time:'2026-08-15 10:20',
no:'AC2026081512345678',
order:'OUT20260815001',
remark:''
});
assert.equal(account.balance, 64.5);
assert.equal(account.frozen, 20);
assert.equal(account.lastChange, '2026-08-15 10:20');
assert.deepEqual(normalize(transaction), {
no:'AC2026081512345678', time:'2026-08-15 10:20', type:'仓储费用',
order:'OUT20260815001', income:0, expense:35.5, balance:64.5,
operator:'当前用户', remark:'手动扣款'
});
assert.equal(transactions[0], transaction);
const saveStart = appJs.indexOf('function saveCustomerDeduction');
const saveEnd = appJs.indexOf('\nfunction ', saveStart + 10);
assert.ok(saveStart >= 0 && saveEnd > saveStart, '缺少扣款保存函数');
assert.ok(appJs.slice(saveStart, saveEnd).includes('validateCustomerDeduction'), '保存函数缺少二次业务校验');
console.log('客户账户手动扣款回归校验通过');