Files
past-go/weapp/tests/subscribe.test.cjs
T
Blizzard 8be6d9b1ab feat: add account deletion, announcements and subscription renewal
Support personal records and persistent smoking visibility. Add upload quota preflight, file cleanup, privacy entry, image caching and revision-based page refresh across the backend, admin and mini program.
2026-11-03 22:06:47 +08:00

42 lines
2.9 KiB
JavaScript

const test=require('node:test');
const assert=require('node:assert/strict');
const path=require('node:path');
const template='K_iQMwE_jre0j6QDVL78DZz7wiR1SKVY5h2YJCK6uPU';
function setup(save){
const storage={coupleId:10},calls=[];
const wx={getStorageSync:key=>storage[key],setStorageSync:(key,v)=>storage[key]=v,requestSubscribeMessage:o=>calls.push(o)};
const load=require('./load-module.cjs')({wx,console:{warn(){},error(){}}},{'./request':{api:{subscribeTemplate:save}}});
return {helper:load(path.join(__dirname,'../utils/subscribe.js')),storage,calls};
}
test('authorization is immediate and concurrent calls share one prompt until persistence finishes',async()=>{
let complete,saves=0;const e=setup(()=>{saves++;return new Promise(resolve=>complete=resolve)});
const first=e.helper.requestSubscribe('notify');assert.equal(e.calls.length,1);
assert.equal(e.helper.requestSubscribe('notify'),first);
e.calls[0].success({[template]:'accept'});
let finished=false;first.then(()=>finished=true);await Promise.resolve();
assert.equal(finished,false);assert.equal(e.storage.subscribed_notify,undefined);
complete({success:true});const result=await first;assert.equal(result.notify,true);assert.equal(saves,1);assert.equal(e.storage.subscribed_notify,true);
});
test('failed persistence never reports successful subscription and a later tap can retry',async()=>{
let fail=true;const e=setup(async()=>{if(fail)throw Error('offline');return {success:true}});
let pending=e.helper.requestSubscribe('notify');e.calls[0].success({[template]:'accept'});
await assert.rejects(pending,/offline/);assert.equal(e.storage.subscribed_notify,undefined);
fail=false;pending=e.helper.requestSubscribe('notify');assert.equal(e.calls.length,2);e.calls[1].success({[template]:'accept'});
assert.equal((await pending).notify,true);
});
test('manual renewal requests authorization again without disabling existing notifications',async()=>{
let page, calls=0, cancelled=0, complete;
const loader=require('./load-module.cjs')({Page:p=>page=p,wx:{showToast(){}}},{
'../../utils/layout':{getLayout:()=>({})},
'../../utils/request':{api:{unsubscribeTemplate:()=>cancelled++}},
'../../utils/subscribe':{requestSubscribe:()=>{calls++;return new Promise(resolve=>complete=resolve)},getSubscribeStatus:async()=>({notify:true})}
});
loader(path.join(__dirname,'../pages/settings/settings.js'));
const instance={data:{subscribeChecked:true},setData(v){Object.assign(this.data,v)}};
let pending=page.renewSubscribe.call(instance);
assert.equal(calls,1);await page.renewSubscribe.call(instance);assert.equal(calls,1);
complete({notify:true});await pending;assert.equal(instance.data.subscribeChecked,true);assert.equal(cancelled,0);
pending=page.renewSubscribe.call(instance);assert.equal(calls,2);complete({notify:false});await pending;
assert.equal(instance.data.subscribeChecked,true);assert.equal(instance._subscribing,false);
});