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.
42 lines
2.9 KiB
JavaScript
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);
|
|
});
|