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); } });