Gate record features and storage entry points with invitation guidance; enforce record access in the backend. Add homepage greetings, right-swipe profile dismissal, and move the smoking switch to settings. Simplify API base configuration and remove the unused legacy tab bar component.
62 lines
4.8 KiB
JavaScript
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('record-access')?{requireRecordAccess:()=>true}: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');
|
|
});
|