Files
mgm-daylight-mcrm-mobile-ios/tests/bookingSubmissionMigration.test.mjs
T
2026-09-16 10:43:59 +08:00

74 lines
4.4 KiB
JavaScript

import test from 'node:test';
import assert from 'node:assert/strict';
import {readFile} from 'node:fs/promises';
const source=await readFile(new URL('../booking/submitBooking/submitBooking.vue',import.meta.url),'utf8');
const script=source.match(/<script>([\s\S]*?)<\/script>/)[1]
.replace(/import[\s\S]*?from\s+['"][^'"]+['"];?[^\n]*/g,'').replace('export default','return');
function setup(bookType=0) {
const saved=[],logs=[];
const page=new Function('uni','saveBooking','getApprover',script)(
{showLoading(){},hideLoading(){},showToast(){},$u:{throttle(){}}},
async data=>{saved.push(structuredClone(data));return {success:true};},
async()=>({success:true,data:{records:[{approverList:[{employeeId:'7',employeeName:'Approver'}],approvalRoutingMessage:'Route'}]}}));
const vm={$t:k=>k,$set:(o,k,v)=>o[k]=v,writeLog:async(...args)=>logs.push(args)};
Object.assign(vm,page.data.call(vm));
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)});
vm.bookingData={bookType,dateList:[{date:['2026-09-09','2026-09-10'],status:1}],
extendDate:[{date:['2026-09-10','2026-09-11'],status:1}],roomRemark:'',otherRemark:''};
vm.checkList=[0]; vm.playerData={playerId:'80001'};vm.userData={userId:'1'};
return {vm,saved,logs};
}
test('direct Waitlist initializes selected dates for normal and extension booking',()=>{
for(const type of [0,1]) {
const {vm}=setup(type); vm.showWaitlistPop();
assert.equal(vm.unqualifiedDateList[0],type?vm.bookingData.extendDate[0]:vm.bookingData.dateList[0]);
assert.deepEqual(vm.unqualifiedDateCheckboxStates,[[]]);assert.equal(vm.showWaitlistModal,true);
}
});
test('Waitlist room choice is mutually exclusive and can be deselected',()=>{
const {vm}=setup();
vm.onWaitlistRoomRemarkGroupChange(['2nd Room']);
assert.deepEqual(vm.waitlistRoomGroupValue,['2nd Room']);
vm.onWaitlistRoomRemarkGroupChange(['2nd Room','3rd Room']);
assert.deepEqual(vm.waitlistRoomGroupValue,['3rd Room']);
vm.onWaitlistRoomRemarkGroupChange([]);assert.deepEqual(vm.waitlistRoomGroupValue,[]);
});
test('Waitlist remark includes Extend first and preserves date-specific manual text',()=>{
const {vm}=setup();vm.showWaitlistPop();vm.onWaitlistRoomRemarkGroupChange(['2nd Room']);
vm.changeWaitlistOtherRemark(['Extend','Remark']);vm.unqualifiedDateRemarks[0]='Late arrival';
vm.getWaitlistRemark(1,0);
assert.equal(vm.bookingData.dateList[0].remark,'Extend; 2nd Room; Late arrival');
vm.changeWaitlistOtherRemark([]);vm.onWaitlistRoomRemarkGroupChange([]);vm.unqualifiedDateRemarks[0]='';
vm.getWaitlistRemark(1,0);assert.equal(vm.bookingData.dateList[0].remark,'');
});
test('Waitlist date matching survives reconstructed objects',()=>{
const {vm}=setup();vm.showWaitlistPop();vm.changeWaitlistOtherRemark(['Extend','Remark']);
vm.unqualifiedDateRemarks[0]='Date note';
vm.bookingData.dateList[0]=structuredClone(vm.bookingData.dateList[0]);
vm.getWaitlistRemark(1,0);assert.equal(vm.bookingData.dateList[0].remark,'Extend; Date note');
});
test('different existing and manual remarks are both preserved',()=>{
const {vm}=setup();vm.showWaitlistPop();vm.changeWaitlistOtherRemark(['Remark']);
vm.bookingData.dateList[0].remarkText='Existing note';vm.unqualifiedDateRemarks[0]='Additional note';
vm.getWaitlistRemark(1,0);
assert.equal(vm.bookingData.dateList[0].remark,'Existing note; Additional note');
});
test('extension approval submits extendDate remark and approver fields',async()=>{
const {vm,saved,logs}=setup(1);vm.showWaitlistPop();
vm.unqualifiedDateReasons[0]='reason';vm.unqualifiedDateApprovers[0]=['7'];
vm.unqualifiedDateRemarks[0]='Extension note';vm.changeWaitlistOtherRemark(['Extend','Remark']);
vm.selectApproverData=[{value:'7',label:'Approver'}];
await vm.submitApprovalRequest();
assert.equal(logs.length,0);assert.equal(saved.length,1);
assert.equal(saved[0].extendDate[0].remarkText,'Extension note');
assert.equal(saved[0].extendDate[0].approver,'7');assert.equal(saved[0].isApproval,1);
assert.equal(saved[0].extendDate[0].remark,'Extend; Extension note');
assert.equal(saved[0].extendData,undefined);
});
test('approver response retains Daylight records envelope',async()=>{
const {vm}=setup();await vm.getApprover();
assert.equal(vm.selectApproverData[0].value,'7');assert.equal(vm.selectApproverData[0].label,'Approver');
assert.equal(vm.routingResaon,'Route');
});