Files
past-go/weapp/tests/payment.test.cjs
T
Blizzard 4c9708b562 feat: add WeChat Pay, Redis logging, storage tiers and personal albums
Replace virtual payments with WeChat Pay API v3 and verify callbacks and order polling. Cache WeChat access tokens in Redis and write structured Zap logs. Support configurable capacity plans across the API, admin and mini program, with purchase snapshots and quota enforcement. Allow personal albums before binding and share them with the current partner. Update deployment configuration and domain routing.
2026-11-02 23:40:49 +08:00

52 lines
2.7 KiB
JavaScript

const test = require('node:test');
const assert = require('node:assert/strict');
const path = require('node:path');
const createLoader = require('./load-module.cjs');
function setup(statuses) {
let definition, cashier, queries = 0, refreshes = 0;
const toasts = [];
const load = createLoader({Page(p) { definition = p; }, console, Promise, Date,
setTimeout(resolve) { resolve(); },
wx: { requestPayment(o) { cashier = o; }, showToast(o) { toasts.push(o); } }
}, {'../../utils/request': {api: {async storageOrderStatus(number) {
assert.equal(number, 'P12345678');
const result = statuses[Math.min(queries++, statuses.length - 1)];
if (result instanceof Error) throw result;
return result;
}}}});
load(path.join(__dirname,'../pages/storage/storage.js'));
const page = {...definition,data:{paying:true},setData(data){Object.assign(this.data,data);},async loadInfo(){refreshes++;}};
const order = {out_trade_no:'P12345678',payment:{time_stamp:'123',nonce_str:'nonce',package:'prepay_id=123',sign_type:'RSA',pay_sign:'signed'}};
page.callWechatPay(order);
return {page,toasts,get cashier(){return cashier;},get queries(){return queries;},get refreshes(){return refreshes;}};
}
test('JSAPI uses signed fields and only announces membership after server confirmation', async () => {
const e = setup([{status:'pending'},{status:'success'}]);
assert.equal(e.cashier.timeStamp,'123');
assert.equal(e.cashier.nonceStr,'nonce');
assert.equal(e.cashier.package,'prepay_id=123');
assert.equal(e.cashier.signType,'RSA');
assert.equal(e.cashier.paySign,'signed');
assert.equal(e.toasts.length,0);
await e.cashier.success();
assert.equal(e.queries,2);
assert.equal(e.refreshes,1);
assert.equal(e.toasts[0].title,'支付成功,会员已开通');
assert.equal(e.page.data.paying,false);
});
test('cancelled cashier checks for completed payment once, without granting pending orders',async()=>{
const e=setup([{status:'pending'}]);
await e.cashier.fail({errMsg:'requestPayment:fail cancel'});
assert.equal(e.queries,1);assert.equal(e.refreshes,0);
assert.equal(e.toasts[0].title,'已取消支付');assert.equal(e.page.data.paying,false);
const paid=setup([{status:'success'}]);
await paid.cashier.fail({errMsg:'requestPayment:fail'});
assert.equal(paid.refreshes,1);assert.equal(paid.toasts[0].title,'支付成功,会员已开通');
});
test('unknown payment results and network errors never claim success',async()=>{
for(const status of [{status:'pending'},Error('offline')]){
const e=setup([status]);await e.cashier.success();
assert.equal(e.refreshes,0);assert.equal(e.toasts[0].icon,'none');assert.equal(e.page.data.paying,false);
}
});