Files
past-go/weapp/tests/navigation.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

62 lines
4.8 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:name=>name.includes('subscribe')?{tryLoginRenewal(){}}:({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');
});