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.
62 lines
4.7 KiB
JavaScript
62 lines
4.7 KiB
JavaScript
const test = require('node:test');
|
|
const assert = require('node:assert/strict');
|
|
const fs = require('node:fs');
|
|
const path = require('node:path');
|
|
const vm = require('node:vm');
|
|
const {tabForPage, paths} = require('../utils/navigation');
|
|
const root = path.join(__dirname, '..');
|
|
test('native custom tabs retain the three main pages; pages never mount a duplicate tab bar',()=>{
|
|
const config=JSON.parse(fs.readFileSync(path.join(root,'app.json'),'utf8'));
|
|
assert.equal(config.tabBar.custom,true);
|
|
assert.deepEqual(config.tabBar.list.map(tab=>tab.pagePath),Object.values(paths));
|
|
const pages=config.pages;
|
|
for(const page of pages){
|
|
const main=Object.values(paths).includes(page);
|
|
const markup=fs.readFileSync(path.join(root,page+'.wxml'),'utf8');
|
|
const components=JSON.parse(fs.readFileSync(path.join(root,page+'.json'),'utf8')).usingComponents||{};
|
|
assert.equal(/<app-tabbar\b/.test(markup),false,page);
|
|
assert.ok(!components['app-tabbar'],page);
|
|
assert.equal(!!tabForPage(page),main,page);
|
|
if(!main){assert.ok(!components['app-tabbar'],page);assert.ok(markup.includes('app-shell--secondary'),page);}
|
|
}
|
|
assert.equal(tabForPage('/pages/profile/profile?bind=1'),'profile');
|
|
assert.equal(tabForPage('unknown'),'');
|
|
});
|
|
test('component selects the main page, hides on child routes and avoids reloading its current tab',()=>{
|
|
let definition,route='pages/profile/profile',pageData={};const navigations=[];
|
|
vm.runInNewContext(fs.readFileSync(path.join(root,'custom-tab-bar/index.js'),'utf8'),{
|
|
Component:c=>definition=c,require:()=>({tabForPage,paths}),getCurrentPages:()=>[{route,data:pageData}],wx:{switchTab:o=>{navigations.push(o.url);o.complete();},reLaunch(){assert.fail('normal tab switching must retain pages');}}
|
|
});
|
|
const component={...definition.methods,data:{...definition.data},setData(v){Object.assign(this.data,v);}};
|
|
definition.lifetimes.attached.call(component);assert.equal(component.data.active,'profile');
|
|
component.navigate({currentTarget:{dataset:{tab:'profile'}}});assert.equal(navigations.length,0);
|
|
component.navigate({currentTarget:{dataset:{tab:'records'}}});assert.deepEqual(navigations,['/pages/discover/discover']);
|
|
pageData={showEditProfileModal:true};definition.pageLifetimes.show.call(component);assert.equal(component.data.hidden,true);
|
|
pageData={showEditPartnerModal:true};definition.pageLifetimes.show.call(component);assert.equal(component.data.hidden,true);
|
|
pageData={};definition.pageLifetimes.show.call(component);assert.equal(component.data.hidden,false);
|
|
route='pages/settings/settings';definition.pageLifetimes.show.call(component);assert.equal(component.data.active,'');
|
|
const markup=fs.readFileSync(path.join(root,'custom-tab-bar/index.wxml'),'utf8');
|
|
assert.ok(markup.includes('wx:if="{{active && !hidden}}"'));
|
|
});
|
|
|
|
test('profile editing hides tabs until close and reserves a fixed save area outside the scroll view',()=>{
|
|
const createLoader=require('./load-module.cjs');let definition;const visibility=[];
|
|
const load=createLoader({Page:value=>definition=value,wx:{getStorageSync:()=>1},console,Date,setTimeout,clearTimeout,setInterval,clearInterval});
|
|
load(path.join(root,'pages/profile/profile.js'));
|
|
const page={...definition,data:{...definition.data,myNickname:'名字',myInitial:'名',partnerDetail:'20岁'},setData(value){Object.assign(this.data,value);},getTabBar:()=>({setHidden:hidden=>visibility.push(hidden)})};
|
|
page.showEditProfileModal();page.hideEditProfileModal();page.showEditPartnerModal();page.hideEditPartnerModal();
|
|
assert.deepEqual(visibility,[true,false,true,false]);
|
|
const markup=fs.readFileSync(path.join(root,'pages/profile/profile.wxml'),'utf8');
|
|
assert.ok(markup.includes('<scroll-view class="edit-body" scroll-y'));
|
|
assert.ok(markup.includes('</scroll-view>\n <view class="edit-footer">'));
|
|
});
|
|
test('photo memory detail uses light system controls and restores them on exit',()=>{
|
|
const createLoader=require('./load-module.cjs');let definition;const colors=[];let back=0;
|
|
const load=createLoader({Page:value=>definition=value,wx:{setNavigationBarColor:value=>colors.push(value),navigateBack:()=>back++},console,Date},{'../../utils/request':{api:{},getImageUrl:value=>'https://we.sundynix.cn/backend/'+value}});
|
|
load(path.join(root,'pages/timeline-detail/timeline-detail.js'));
|
|
const page={...definition,data:{...definition.data,item:{bg_image:'uploads/memory.jpg'}},setData(value){Object.assign(this.data,value);}};
|
|
page.loadBgImage();assert.equal(colors.at(-1).frontColor,'#ffffff');assert.ok(page.data.bgImageUrl.endsWith('memory.jpg'));
|
|
page.onHide();assert.equal(colors.at(-1).frontColor,'#000000');page.goBack();assert.equal(back,1);
|
|
page.data.item.bg_image='';page.loadBgImage();assert.equal(page.data.bgImageUrl,'');assert.equal(colors.at(-1).frontColor,'#000000');
|
|
});
|