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.
86 lines
6.7 KiB
JavaScript
86 lines
6.7 KiB
JavaScript
const test = require('node:test');
|
|
const assert = require('node:assert/strict');
|
|
const fs = require('node:fs');
|
|
const vm = require('node:vm');
|
|
const path = require('node:path');
|
|
function load(file, wx) {
|
|
return require('./load-module.cjs')({wx, console, Promise, Date})(path.join(__dirname, '..', file));
|
|
}
|
|
test('GET business parameters and POST bodies use clean paths with auth', async () => {
|
|
const calls=[];
|
|
const {api}=load('utils/request.js', { getStorageSync:()=> 'test-token', hideLoading(){}, request(o){calls.push(o);o.success({statusCode:200,data:{items:[], pageSize:20}});} });
|
|
const response = await api.diaryList({page:2,page_size:20});
|
|
assert.equal(response.page_size,20);
|
|
await api.periodVisibleSet({period_visible:0});
|
|
assert.equal(calls[0].url,require('../config/env').API_BASE+'/diaryList?page=2&pageSize=20');
|
|
assert.equal(calls[0].header.Authorization,'Bearer test-token');
|
|
assert.equal(calls[1].url,require('../config/env').API_BASE+'/periodVisibleSet');
|
|
assert.equal(calls[1].data.periodVisible,0);
|
|
});
|
|
test('multipart upload retains action and token when Android omits headers',async()=>{
|
|
let upload;
|
|
const {uploadFileCompat}=load('utils/request.js',{getStorageSync:()=> 'test-token',getFileInfo(o){o.success({size:100,digest:'a'.repeat(32)});},request(o){o.success({statusCode:200,data:{success:true}});},compressImage(o){o.fail();},uploadFile(o){upload=o;o.success({statusCode:200,data:'{"success":true,"path":"uploads/test.jpg"}'});} });
|
|
await uploadFileCompat({url:'https://we.sundynix.cn/api/uploadPartnerAvatar',filePath:'test.jpg',name:'file',formData:{partner_id:87}});
|
|
assert.equal(upload.url,'https://we.sundynix.cn/api/uploadPartnerAvatar?token=test-token');
|
|
assert.equal(upload.formData.action,'uploadPartnerAvatar');
|
|
assert.equal(upload.formData.token,'test-token');
|
|
assert.equal(upload.formData.partnerId,87);
|
|
assert.equal(upload.formData.partner_id,undefined);
|
|
});
|
|
test('navigation responds to phone statusbar and capsule geometry, with fallback',()=>{
|
|
for(const device of [{status:20,top:24,height:32,width:360,left:263},{status:54,top:58,height:32,width:393,left:285}]){
|
|
const {getLayout}=load('utils/layout.js',{getWindowInfo:()=>({statusBarHeight:device.status,windowWidth:device.width}),getMenuButtonBoundingClientRect:()=>({top:device.top,height:device.height,left:device.left})});
|
|
const layout=getLayout();assert.equal(layout.navHeight,device.status+40);assert.equal(layout.navSide,device.width-device.left+12);
|
|
}
|
|
const {getLayout}=load('utils/layout.js',{});assert.equal(getLayout().navHeight,64);
|
|
});
|
|
test('failed homepage load ends the recent-record spinner',async()=>{
|
|
let definition;
|
|
const api={coupleInfo:async()=>{throw { _statusCode:404 };}};
|
|
vm.runInNewContext(fs.readFileSync(path.join(__dirname,'../pages/index/index.js'),'utf8'),{
|
|
Page(p){definition=p;},require(name){return name.endsWith('/record-access')?{guardRecordEntries:p=>p}:name.endsWith('/list-pagination')?require('../utils/list-pagination'):name.endsWith('/page-cache')?{withDataCache:p=>p}:name.endsWith('/request')?{api,getImageUrl:v=>v}:name.endsWith('/layout')?{getLayout:()=>({})}:{saveScrollPosition(){},getScrollPosition(){return 0;}};},
|
|
wx:{getStorageSync:()=> 'test-token'}, console:{error(){}}, Date, setTimeout
|
|
});
|
|
const page={...definition,data:{...definition.data},setData(data){Object.assign(this.data,data);}};
|
|
await page.loadData();
|
|
assert.equal(page.data.homeError,true);assert.equal(page.data.statsLoading,false);assert.equal(page.data.statsError,true);assert.equal(page._loadingData,false);
|
|
});
|
|
|
|
test('unbound newcomer loads homepage records without requesting couple-only pets',async()=>{
|
|
let definition;let petCalls=0;
|
|
const api={coupleInfo:async()=>({not_bound:true,partner1:{nickname:'新用户'}}),timelineList:async()=>[],albumList:async()=>[],diaryList:async()=>({items:[],total:0}),songsList:async()=>[],checkinList:async()=>({items:[]}),petInfo:async()=>{petCalls++;throw Error('请先绑定情侣');}};
|
|
vm.runInNewContext(fs.readFileSync(path.join(__dirname,'../pages/index/index.js'),'utf8'),{
|
|
Page(p){definition=p;},require(name){return name.endsWith('/record-access')?{guardRecordEntries:p=>p}:name.endsWith('/list-pagination')?require('../utils/list-pagination'):name.endsWith('/page-cache')?{withDataCache:p=>p}:name.endsWith('/request')?{api,getImageUrl:v=>v}:name.endsWith('/layout')?{getLayout:()=>({})}:name.endsWith('/journal')?{diaryEntry:v=>v}:{};},
|
|
wx:{getStorageSync:()=>1,removeStorageSync(){}},console,Date,setTimeout
|
|
});
|
|
const page={...definition,data:{...definition.data,coupleId:99},setData(data){Object.assign(this.data,data);}};
|
|
await page.loadData();
|
|
assert.equal(petCalls,0);assert.equal(page.data.coupleId,null);
|
|
assert.equal(page.data.homeError,false);assert.equal(page.data.statsError,false);assert.equal(page.data.statsLoading,false);
|
|
assert.equal(page.data.recentDiary.length,0);assert.equal(page.data.stats.pet,0);
|
|
});
|
|
|
|
test('smoking visibility page uses the real request adapter and restores the persisted response',async()=>{
|
|
let definition,visible=1;const calls=[];
|
|
const wx={getStorageSync:()=> 'test-token',showToast(){},request(o){
|
|
calls.push(o);
|
|
if(o.url.endsWith('/checkAuth'))o.success({statusCode:200,data:{user:{smokingCardVisible:visible}}});
|
|
else if(o.url.endsWith('/smokingCardVisible')){visible=o.data.visible;o.success({statusCode:200,data:{success:true,cardVisible:visible}});}
|
|
else throw new Error('Unexpected request: '+o.url);
|
|
}};
|
|
require('./load-module.cjs')({wx,console,Date,Promise,Page:p=>definition=p},{'../../utils/page-cache':{withDataCache:p=>p}})(path.join(__dirname,'../pages/settings/settings.js'));
|
|
const makePage=()=>({...definition,data:JSON.parse(JSON.stringify(definition.data)),setData(p){Object.assign(this.data,p);}});
|
|
const page=makePage();await page.loadSmokingPreference();assert.equal(page.data.smokingVisible,true);
|
|
await page.toggleSmoking({detail:{value:false}});assert.equal(visible,0);assert.equal(page.data.smokingVisible,false);
|
|
const save=calls.find(c=>c.url.endsWith('/smokingCardVisible'));assert.equal(save.method,'POST');assert.equal(save.data.visible,0);assert.equal(save.header.Authorization,'Bearer test-token');
|
|
const reopened=makePage();await reopened.loadSmokingPreference();assert.equal(reopened.data.smokingVisible,false);
|
|
await reopened.toggleSmoking({detail:{value:true}});assert.equal(visible,1);assert.equal(reopened.data.smokingVisible,true);
|
|
});
|
|
|
|
test('silent subscription persistence never hides a business spinner or shows a network toast',async()=>{
|
|
const ui=[];
|
|
const {api}=load('utils/request.js',{getStorageSync:()=> 'token',hideLoading:()=>ui.push('hide'),showToast:()=>ui.push('toast'),request:o=>o.fail({errMsg:'offline'})});
|
|
await assert.rejects(api.subscribeTemplate({template_type:'notify',template_id:'template'},{silent:true}));
|
|
assert.equal(ui.length,0);
|
|
});
|