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(/{ 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('\n ')); }); 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'); });