文件
Henglianshutong/tests/verify_minute_settle_spec.js

88 行
4.3 KiB
JavaScript

const fs = require('fs');
const path = require('path');
const assert = require('assert');
console.log('========================================================');
console.log(' dmepa 1 分钟增量结算与兑换券 1 分钟释放规范自动化测试');
console.log('========================================================\n');
let passCount = 0;
function test(name, fn) {
try {
fn();
console.log(` [PASS] ${name}`);
passCount++;
} catch (err) {
console.error(` [FAIL] ${name}: ${err.message}`);
process.exit(1);
}
}
// 1. VoucherService 验证
const voucherServicePath = path.resolve(__dirname, '../addons/shopro/service/partner/VoucherService.php');
assert(fs.existsSync(voucherServicePath), 'VoucherService.php 文件存在');
const voucherContent = fs.readFileSync(voucherServicePath, 'utf-8');
test('VoucherService 包含 releaseMinute() 分钟级释放方法', () => {
assert(voucherContent.includes('function releaseMinute()'), '必须定义 releaseMinute()');
});
test('VoucherService 包含立即生效起算逻辑', () => {
assert(voucherContent.includes("date('Y-m-d', $this->orderTime($order))"), '起算日期当天立即生效');
});
test('VoucherService 分钟释放使用 NULL 结算日规避唯一索引冲突', () => {
assert(voucherContent.includes("'settle_date' => null"), 'settle_date 必须设为 null 避开 uk_daily_user_type 限制');
assert(voucherContent.includes("$virtualOrderId = -(intval($plan->id) * 1000"), 'order_id 必须使用负数虚拟 ID 避开 uk_order_user_type 限制');
});
// 2. MadowService 验证
const madowServicePath = path.resolve(__dirname, '../addons/shopro/service/partner/MadowService.php');
assert(fs.existsSync(madowServicePath), 'MadowService.php 文件存在');
const madowContent = fs.readFileSync(madowServicePath, 'utf-8');
test('MadowService 包含 shareMinute() 分钟级dmepa分红方法', () => {
assert(madowContent.includes('function shareMinute('), '必须定义 shareMinute()');
});
test('MadowService 分钟分红使用防重虚拟 order_id 与 NULL 结算日', () => {
assert(madowContent.includes("'settle_date' => null"), 'settle_date 必须设为 null');
assert(madowContent.includes("$virtualOrderId = min(-100000,"), '必须保证递减全局虚拟 order_id');
});
// 3. DailySettleService 验证
const dailySettlePath = path.resolve(__dirname, '../addons/shopro/service/partner/DailySettleService.php');
assert(fs.existsSync(dailySettlePath), 'DailySettleService.php 文件存在');
const settleContent = fs.readFileSync(dailySettlePath, 'utf-8');
test('DailySettleService 包含 runMinute() 总调度入口', () => {
assert(settleContent.includes('function runMinute()'), '必须定义 runMinute()');
});
test('DailySettleService runMinute 调度兑换券与dmepa结算', () => {
assert(settleContent.includes('releaseMinute()'), '调用 releaseMinute() 释放兑换券');
assert(settleContent.includes('shareMinute('), '调用 shareMinute() 发放dmepa');
assert(settleContent.includes("'madow_settled'] = 1"), '订单必须打上 madow_settled 标记防止重复均分');
assert(settleContent.includes('partner_settle_minute.lock'), '包含独立互斥锁保障并发安全');
});
// 4. PartnerSettle.php 控制台命令验证
const partnerSettlePath = path.resolve(__dirname, '../addons/shopro/console/PartnerSettle.php');
assert(fs.existsSync(partnerSettlePath), 'PartnerSettle.php 文件存在');
const cmdContent = fs.readFileSync(partnerSettlePath, 'utf-8');
test('PartnerSettle 默认执行 runMinute() 分钟级调度', () => {
assert(cmdContent.includes('runMinute()'), '默认调用 runMinute()');
assert(cmdContent.includes('partner minute settle done'), '输出分钟级执行结果日志');
});
test('PartnerSettle 保留 --date / --rerun / --daily 传统日结兼容', () => {
assert(cmdContent.includes("$input->getOption('date')"), '兼容 -d/--date 参数');
assert(cmdContent.includes("$input->getOption('rerun')"), '兼容 -r/--rerun 参数');
assert(cmdContent.includes("$input->getOption('daily')"), '兼容 --daily 参数');
});
console.log('\n--------------------------------------------------------');
console.log(`测试执行结果: 通过 ${passCount} 项, 失败 0 项`);
console.log('========================================================\n');