fix bugs
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
import test from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import {readFile} from 'node:fs/promises';
|
||||
import {createRequire} from 'node:module';
|
||||
const require = createRequire(import.meta.url);
|
||||
const dayjs = require('../uni_modules/uview-ui/libs/util/dayjs.js');
|
||||
const source = await readFile(new URL('../booking/playerRoomCalendar/playerRoomCalendar.vue', import.meta.url), 'utf8');
|
||||
const script = source.match(/<script>([\s\S]*?)<\/script>/)[1]
|
||||
.replace(/import[\s\S]*?from\s+['"][^'"]+['"];?/g, '').replace('export default', 'return');
|
||||
const utility = await readFile(new URL('../common/roomCalendarUi.js', import.meta.url), 'utf8');
|
||||
const ui = await import('data:text/javascript;base64,' + Buffer.from(utility).toString('base64'));
|
||||
function setup({permission=true, player={playerId:'80001'}, metadata, response}={}) {
|
||||
const calls = [], toasts = [];
|
||||
const user = {canViewCalendar:permission};
|
||||
const uni = {getStorageSync:key=>key==='userData'?user:player,
|
||||
showLoading(){},hideLoading(){},$u:{toast:m=>toasts.push(m)}};
|
||||
const page = new Function('uni','dayjs','buildCalendarDateRange','getTodayWeekId',
|
||||
'mapRoomCalendarQualificationRecords','getPropertiesRoomTypes','getPlayerRoomQualification',
|
||||
'requestCalendarSetting',script)(uni,dayjs,ui.buildCalendarDateRange,ui.getTodayWeekId,
|
||||
ui.mapRoomCalendarQualificationRecords,
|
||||
async()=>{calls.push('metadata'); return metadata ?? {propertyList:[
|
||||
{code:'Macau',name:'Macau',roomTypes:[{code:'SUITE',label:'SUITE'}],defaultRoomTypes:['SUITE']}
|
||||
]};},
|
||||
async p=>{calls.push(p);return response ?? {success:true,data:[]};},
|
||||
async()=>{calls.push('settings');return {data:[]};});
|
||||
const vm = {$t:k=>k,$nextTick:fn=>fn()};
|
||||
Object.assign(vm,page.data.call(vm),{playerData:player,userData:user});
|
||||
for (const [k,fn] of Object.entries(page.methods)) vm[k]=fn.bind(vm);
|
||||
for (const [k,fn] of Object.entries(page.computed)) Object.defineProperty(vm,k,{get:fn.bind(vm)});
|
||||
return {vm,page,calls,toasts};
|
||||
}
|
||||
test('denied direct entry and refresh make no requests',async()=>{
|
||||
for (const permission of [false,undefined,'true']) {
|
||||
const {vm,calls}=setup({permission:permission ?? null});
|
||||
await vm.loadPropertiesRoomTypes(); vm.refreshCalendar(); await vm.loadQualificationData();
|
||||
assert.deepEqual(calls,[]); assert.equal(vm.calendarNoPermission,true);
|
||||
}
|
||||
});
|
||||
test('missing player cannot accidentally request the general Calendar',async()=>{
|
||||
const {vm,calls}=setup({player:null});
|
||||
await vm.loadPropertiesRoomTypes(); await vm.loadQualificationData();
|
||||
assert.deepEqual(calls,[]); assert.equal(vm.calendarReady,false);
|
||||
});
|
||||
test('player query carries current player, property, room type and date range',async()=>{
|
||||
const {vm,calls}=setup(); await vm.loadPropertiesRoomTypes();
|
||||
const query=calls.find(c=>typeof c==='object');
|
||||
assert.equal(query.PlayerId,'80001'); assert.equal(query.Property,'Macau');
|
||||
assert.equal(query.RoomType,'SUITE');
|
||||
assert.match(query.StartDate,/^\d{4}-\d{2}-\d{2}$/);
|
||||
assert.ok(query.EndDate>=query.StartDate); assert.equal(vm.calendarReady,true);
|
||||
});
|
||||
test('metadata denial and empty configuration do not call player query',async()=>{
|
||||
for (const metadata of [{success:false,code:'NO_PERMISSION'},{propertyList:[]}]) {
|
||||
const {vm,calls}=setup({metadata}); await vm.loadPropertiesRoomTypes();
|
||||
assert.deepEqual(calls,['settings','metadata']); assert.equal(vm.calendarReady,false);
|
||||
}
|
||||
});
|
||||
test('both denial response formats remain denied after initial load completes',async()=>{
|
||||
for (const key of ['code','errorCode']) {
|
||||
const {vm}=setup({response:{success:false,[key]:'NO_PERMISSION'}});
|
||||
await vm.loadPropertiesRoomTypes();
|
||||
assert.equal(vm.calendarReady,false); assert.equal(vm.calendarNoPermission,true);
|
||||
assert.deepEqual(vm.qualificationMap,{});
|
||||
}
|
||||
});
|
||||
test('booking entry rechecks permission before navigation',async()=>{
|
||||
const booking=await readFile(new URL('../booking/bookingRecord/bookingRecord.vue',import.meta.url),'utf8');
|
||||
const method=booking.match(/navToPlayerRoomCalendar\(\)\{([\s\S]*?)\n\s*\},/)[1];
|
||||
const visits=[];
|
||||
for (const permission of [false,true]) {
|
||||
new Function('uni',method).call({navTo:(...args)=>visits.push(args)},
|
||||
{getStorageSync:()=>({canViewCalendar:permission})});
|
||||
}
|
||||
assert.deepEqual(visits,[['/booking/playerRoomCalendar/playerRoomCalendar',0,false]]);
|
||||
assert.match(booking, /<image\s+v-if="userData && userData\.canViewCalendar === true"\s+@click="navToPlayerRoomCalendar"[^>]*><\/image>\s*<image\s+v-else\s+@click="getDataByPage"[^>]*><\/image>/);
|
||||
});
|
||||
Reference in New Issue
Block a user