Files
2026-09-16 10:43:59 +08:00

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>/);
});