72 lines
3.2 KiB
JavaScript
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('客户账户手动扣款回归校验通过');
|