文件
Henglianshutong/tests/verify_rate_realtime_and_precision_spec.js

111 行
4.5 KiB
JavaScript

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

const fs = require('fs');
const path = require('path');
let passed = 0;
let failed = 0;
function assert(condition, testName, detail = '') {
if (condition) {
console.log(` [PASS] ${testName}`);
passed++;
} else {
console.error(` [FAIL] ${testName} - ${detail}`);
failed++;
}
}
console.log("========================================================");
console.log(" dmepa实时动态汇率、首单步进对齐与精度自适应自动化测试");
console.log("========================================================\n");
// 1. RateService 实时汇率与缓存解耦验证
const rateServicePath = path.resolve(__dirname, '../addons/shopro/service/partner/RateService.php');
assert(fs.existsSync(rateServicePath), 'RateService.php 文件存在');
const rateServiceContent = fs.readFileSync(rateServicePath, 'utf-8');
assert(
!rateServiceContent.includes("RateLog::order('id', 'desc')->find()"),
'currentRate() 已移除日结历史快照死锁逻辑,不再永久返回旧汇率'
);
assert(
rateServiceContent.includes('currentRate($forceRefresh = false)'),
'currentRate() 支持 $forceRefresh 参数穿透短缓存实时重算'
);
assert(
rateServiceContent.includes('public static function clearCache()'),
'RateService 包含 clearCache() 静态方法支持外部主动刷新'
);
assert(
rateServiceContent.includes('$multiple = max(1, floor($n / $step))'),
'calcRate() 算法严谨保留起步下限保底与线性步进'
);
// 2. 订单支付监听器联动验证
const listenerPath = path.resolve(__dirname, '../addons/shopro/listener/Partner.php');
assert(fs.existsSync(listenerPath), 'Partner.php 监听器存在');
const listenerContent = fs.readFileSync(listenerPath, 'utf-8');
assert(
listenerContent.includes('RateService::clearCache()'),
'合格订单支付成功后自动调用 RateService::clearCache() 触发实时汇率联动'
);
// 3. IdentityService dmepa格式化与精度优化验证
const identityPath = path.resolve(__dirname, '../addons/shopro/service/partner/IdentityService.php');
assert(fs.existsSync(identityPath), 'IdentityService.php 存在');
const identityContent = fs.readFileSync(identityPath, 'utf-8');
assert(
identityContent.includes("number_format((float) $value, 0, '.', '')"),
'formatMadow() 保持历史纯整数输出契约'
);
assert(
identityContent.includes('$floatVal > 0 && $floatVal < 1'),
'formatMadow() 具备小于 1 枚的小数自适应保留能力,杜绝分润到账显示为 0 枚'
);
// 4. 用户端 madow.vue 界面精度与兜底验证
const madowVuePath = path.resolve(__dirname, '../uniapp/pages/commission/madow.vue');
assert(fs.existsSync(madowVuePath), 'madow.vue 存在');
const madowVueContent = fs.readFileSync(madowVuePath, 'utf-8');
assert(
madowVueContent.includes('formatInt') && madowVueContent.includes('num > 0 && num < 1'),
'madow.vue 中的 formatInt 支持微量小数自适应显示'
);
assert(
madowVueContent.includes('&lt;0.01') || madowVueContent.includes('state.info.madow_value') || madowVueContent.includes('formatInt'),
'madow.vue 对微小市值(<0.01元)具备友好的 <0.01 优雅兜底展示'
);
// 5. 纯算法逻辑与数值模拟测试
function calcRateSim(n, base = 0.00000075, step = 1) {
const multiple = Math.max(1, Math.floor(n / step));
return Number((base * multiple).toFixed(10));
}
assert(calcRateSim(0) === 0.00000075, '模拟测试:N=0 单时保底输出基准汇率 0.00000075');
assert(calcRateSim(1) === 0.00000075, '模拟测试:N=1 单时等于 0.00000075');
assert(calcRateSim(2) === 0.0000015, '模拟测试:N=2 单时递增至 0.00000150');
assert(calcRateSim(10000) === 0.0075, '模拟测试:N=10,000 单时精确达到 0.0075 元/枚');
function formatMadowSim(val) {
const num = parseFloat(val) || 0;
if (num > 0 && num < 1) {
return parseFloat(num.toFixed(4)).toString();
}
return String(Math.floor(num));
}
assert(formatMadowSim(0.85) === '0.85', '模拟测试:0.85 枚自适应显示为 0.85');
assert(formatMadowSim(0.005) === '0.005', '模拟测试:0.005 枚自适应显示为 0.005');
assert(formatMadowSim(100) === '100', '模拟测试:100 枚整洁显示为 100');
assert(formatMadowSim(0) === '0', '模拟测试:0 枚整洁显示为 0');
console.log("\n--------------------------------------------------------");
console.log(`测试执行结果: 通过 ${passed} 项, 失败 ${failed} 项`);
console.log("========================================================\n");
if (failed > 0) {
process.exit(1);
}