77 lines
4.5 KiB
JavaScript
77 lines
4.5 KiB
JavaScript
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>/);
|
|
});
|