add calendar module
This commit is contained in:
@@ -0,0 +1,135 @@
|
||||
package com.mgm.mcrm.roomcalendar;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.mgm.mcrm.appsetting.controllers.CfgSettingController;
|
||||
import com.mgm.mcrm.appsetting.models.CfgSettings;
|
||||
import com.mgm.mcrm.appsetting.repositories.SettingDao;
|
||||
import com.mgm.mcrm.appsetting.services.SettingService;
|
||||
import com.mgm.mcrm.authorization.models.SysGroupPermission;
|
||||
import com.mgm.mcrm.authorization.models.SysUserView;
|
||||
import com.mgm.mcrm.authorization.repositories.*;
|
||||
import com.mgm.mcrm.authorization.services.MgmUserService;
|
||||
import com.mgm.mcrm.authorization.services.UserTokenService;
|
||||
import com.mgm.mcrm.basesetting.property.repositories.*;
|
||||
import com.mgm.mcrm.basesetting.team.repositories.*;
|
||||
import com.mgm.mcrm.common.config.WebFilterConfig;
|
||||
import com.mgm.mcrm.common.dtos.http_util.HttpResponseResult;
|
||||
import com.mgm.mcrm.common.services.MGMApiService;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.ValueSource;
|
||||
import org.mockito.InjectMocks;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.jupiter.MockitoExtension;
|
||||
import org.springframework.mock.web.MockHttpServletRequest;
|
||||
import org.springframework.mock.web.MockHttpServletResponse;
|
||||
import org.springframework.test.util.ReflectionTestUtils;
|
||||
import jakarta.servlet.FilterChain;
|
||||
import java.util.*;
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.mockito.Mockito.*;
|
||||
|
||||
@ExtendWith(MockitoExtension.class)
|
||||
class CalendarBootstrapMigrationTest {
|
||||
@Mock MGMApiService esb;
|
||||
@Mock PropertyDao propertyDao;
|
||||
@Mock BlockDao blockDao;
|
||||
@Mock DivisionDao divisionDao;
|
||||
@Mock DepartmentDao departmentDao;
|
||||
@Mock SectionDao sectionDao;
|
||||
@Mock TeamStructureDao teamStructureDao;
|
||||
@Mock SysUserViewDao users;
|
||||
@Mock SysGroupPermissionDao permissions;
|
||||
@InjectMocks MgmUserService userService;
|
||||
|
||||
@ParameterizedTest
|
||||
@ValueSource(strings={"allowed","denied","no-local-user"})
|
||||
void calendarPermissionComesFromLocalGroupAndKeepsBookingPermission(String mode) throws Exception {
|
||||
HttpResponseResult upstream = new HttpResponseResult();
|
||||
upstream.setStatusCode(200);
|
||||
upstream.setResponseContent("{\"StatusCode\":\"OK\",\"Records\":[{\"userId\":\"123\",\"userName\":\"Tester\",\"canViewCalendar\":true}]}");
|
||||
when(esb.invokeGetUserInfo("123","")).thenReturn(upstream);
|
||||
if (!mode.equals("no-local-user")) {
|
||||
SysUserView user = new SysUserView();
|
||||
user.setGroupId(7L); user.setGroupName("test-group");
|
||||
when(users.getByLoginId("123")).thenReturn(user);
|
||||
SysGroupPermission booking = new SysGroupPermission();
|
||||
booking.setPermissionId("10001_01");
|
||||
SysGroupPermission calendar = new SysGroupPermission();
|
||||
calendar.setPermissionId("10001_07");
|
||||
when(permissions.getAllByGroupId(7L)).thenReturn(
|
||||
mode.equals("allowed") ? List.of(booking,calendar) : List.of(booking));
|
||||
}
|
||||
var result = userService.findUserInfoByUserId("123");
|
||||
assertTrue(result.isSuccess(),result.getMessage());
|
||||
var json = new ObjectMapper().valueToTree(result.getData());
|
||||
assertEquals(mode.equals("allowed"),json.get("canViewCalendar").asBoolean());
|
||||
assertEquals(!mode.equals("no-local-user"),result.getData().isCanViewBooking());
|
||||
}
|
||||
|
||||
@ParameterizedTest
|
||||
@ValueSource(booleans={true,false})
|
||||
void mockSwitchOnlyGrantsCalendarWithoutGroupConfiguration(boolean enabled) throws Exception {
|
||||
ReflectionTestUtils.setField(userService,"calendarPermissionMockEnabled",enabled);
|
||||
HttpResponseResult upstream = new HttpResponseResult();
|
||||
upstream.setStatusCode(200);
|
||||
upstream.setResponseContent("{\"StatusCode\":\"OK\",\"Records\":[{\"userId\":\"123\"}]}");
|
||||
when(esb.invokeGetUserInfo("123","")).thenReturn(upstream);
|
||||
var result = userService.findUserInfoByUserId("123");
|
||||
assertTrue(result.isSuccess(),result.getMessage());
|
||||
assertEquals(enabled,result.getData().isCanViewCalendar());
|
||||
assertFalse(result.getData().isCanViewBooking());
|
||||
verifyNoInteractions(permissions);
|
||||
}
|
||||
|
||||
CfgSettings setting(String key,String value) {
|
||||
CfgSettings setting = new CfgSettings();
|
||||
setting.setKeys(key); setting.setKeyValues(value);
|
||||
return setting;
|
||||
}
|
||||
|
||||
@Test void calendarSettingsExposeOnlyFiveExactKeysAndPreserveValues() throws Exception {
|
||||
List<String> keys = List.of("CALENDAR_VIEW_PREVIOUS_DAYS","CALENDAR_VIEW_VISIBLE_DAYS",
|
||||
"CALENDAR_VIEW_YESTERDAY_START","CALENDAR_VIEW_YESTERDAY_END","MAX_SELECTED_ROOM_TYPES");
|
||||
List<CfgSettings> rows = new ArrayList<>();
|
||||
for (String key : keys) rows.add(setting(key,"3"));
|
||||
rows.add(setting("OTHER_SETTING","private"));
|
||||
rows.add(setting("calendar_view_previous_days","wrong-case"));
|
||||
rows.add(setting(null,"missing-key"));
|
||||
rows.add(null);
|
||||
SettingDao dao = mock(SettingDao.class);
|
||||
when(dao.findAll()).thenReturn(rows);
|
||||
SettingService service = new SettingService();
|
||||
ReflectionTestUtils.setField(service,"settingDao",dao);
|
||||
CfgSettingController controller = new CfgSettingController();
|
||||
ReflectionTestUtils.setField(controller,"settingService",service);
|
||||
var result = controller.getCalendarSetting();
|
||||
assertEquals(200,result.getStatusCode().value());
|
||||
assertTrue(result.getBody().isSuccess());
|
||||
assertEquals(keys,result.getBody().getData().stream().map(CfgSettings::getKeys).toList());
|
||||
var json = new ObjectMapper().valueToTree(result.getBody());
|
||||
assertEquals("3",json.get("data").get(0).get("keyValues").asText());
|
||||
}
|
||||
|
||||
@Test void missingSettingsReturnEmptyListWithoutInventedDefaults() {
|
||||
SettingDao dao = mock(SettingDao.class);
|
||||
when(dao.findAll()).thenReturn(List.of());
|
||||
SettingService service = new SettingService();
|
||||
ReflectionTestUtils.setField(service,"settingDao",dao);
|
||||
assertTrue(service.getCalendarSetting().isEmpty());
|
||||
}
|
||||
|
||||
@Test void calendarSettingsRouteRemainsBehindExistingJwtFilter() throws Exception {
|
||||
WebFilterConfig config = new WebFilterConfig();
|
||||
ReflectionTestUtils.setField(config,"secretKey","calendar-test-only-secret");
|
||||
ReflectionTestUtils.setField(config,"userTokenService",mock(UserTokenService.class));
|
||||
var filter = config.jwtAuthFilter().getFilter();
|
||||
var request = new MockHttpServletRequest("POST","/api/app/setting/get_calendar_setting");
|
||||
var response = new MockHttpServletResponse();
|
||||
FilterChain chain = mock(FilterChain.class);
|
||||
filter.doFilter(request,response,chain);
|
||||
assertEquals(401,response.getStatus());
|
||||
verifyNoInteractions(chain);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
package com.mgm.mcrm.roomcalendar;
|
||||
|
||||
import com.mgm.mcrm.roomcalendar.services.*;
|
||||
import com.mgm.mcrm.appsetting.services.SettingService;
|
||||
import com.mgm.mcrm.appsetting.repositories.SettingDao;
|
||||
import com.mgm.mcrm.basesetting.property.repositories.PropertyDao;
|
||||
import com.mgm.mcrm.basesetting.room.repositories.RoomDao;
|
||||
import com.mgm.mcrm.common.services.MGMApiService;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.test.util.ReflectionTestUtils;
|
||||
import java.util.*;
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.mockito.Mockito.*;
|
||||
|
||||
class CalendarMockDataTest {
|
||||
@Test void catalogAndQueriesAgreeForEveryHotelAcrossMonthBoundary() {
|
||||
var catalog = CalendarMockData.metadata().getPropertyList();
|
||||
var hotels = new ArrayList<>(catalog.subList(0,2));
|
||||
hotels.addAll(catalog.get(2).getOtherProperties());
|
||||
assertEquals(6,hotels.size());
|
||||
int count=0;
|
||||
for (var hotel:hotels) {
|
||||
assertTrue(hotel.getName().contains("[MOCK]"));
|
||||
String rooms=String.join(",",hotel.getRoomTypes().stream().map(t->t.getCode()).toList());
|
||||
var rows=CalendarMockData.records("",hotel.getCode(),rooms,"2026-09-28","2026-10-03");
|
||||
assertEquals(hotel.getRoomTypes().size()*6,rows.size());
|
||||
assertTrue(rows.stream().anyMatch(row->row.getDate().equals("2026-10-01")));
|
||||
assertEquals(rows,CalendarMockData.records("",hotel.getCode(),rooms,"2026-09-28","2026-10-03"));
|
||||
count+=rows.size();
|
||||
}
|
||||
assertEquals(96,count);
|
||||
}
|
||||
|
||||
@Test void variedAvailabilityAndPlayerQualificationAreDeterministic() {
|
||||
var rows=CalendarMockData.records("80001","SIM_COTAI","CR,ES","2026-09-01","2026-10-31");
|
||||
assertTrue(rows.stream().anyMatch(r->r.getRoomCount()==0));
|
||||
assertTrue(rows.stream().anyMatch(r->r.getRoomCount()>0));
|
||||
assertEquals(Set.of(0,1),new HashSet<>(rows.stream().map(r->r.getBookingDateQualificationFlag()).toList()));
|
||||
assertNotEquals(rows,CalendarMockData.records("80002","SIM_COTAI","CR,ES","2026-09-01","2026-10-31"));
|
||||
assertEquals(4,CalendarMockData.records("","SIM_MO,SIM_LB","MO_STD,LB_GRAND","2026-09-01","2026-09-02").size());
|
||||
}
|
||||
|
||||
@Test void invalidRequestsFailInsteadOfProducingPlausibleData() {
|
||||
assertThrows(IllegalArgumentException.class,()->CalendarMockData.records("","MC","CR","2026-09-01","2026-09-02"));
|
||||
assertThrows(IllegalArgumentException.class,()->CalendarMockData.records("","SIM_COTAI","GR","2026-09-01","2026-09-02"));
|
||||
assertThrows(IllegalArgumentException.class,()->CalendarMockData.records("","SIM_COTAI","CR","2026-09-02","2026-09-01"));
|
||||
assertThrows(IllegalArgumentException.class,()->CalendarMockData.records("","SIM_COTAI","CR","2026-01-01","2026-12-31"));
|
||||
}
|
||||
|
||||
@Test void enabledMocksDoNotReadDatabaseOrCallEsbAndDisabledSettingsUseDatabase() throws Exception {
|
||||
var service=new RoomCalendarService();
|
||||
var properties=mock(PropertyDao.class); var rooms=mock(RoomDao.class); var esb=mock(MGMApiService.class);
|
||||
ReflectionTestUtils.setField(service,"propertyDao",properties);
|
||||
ReflectionTestUtils.setField(service,"roomDao",rooms);
|
||||
ReflectionTestUtils.setField(service,"mgmApiService",esb);
|
||||
ReflectionTestUtils.setField(service,"calendarDataMockEnabled",true);
|
||||
assertEquals(3,service.getPropertyRoomType().getPropertyList().size());
|
||||
var result=service.getRoomCalendar(Map.of("Property","SIM_COTAI","RoomType","CR",
|
||||
"StartDate","2026-09-01","EndDate","2026-09-03"));
|
||||
assertTrue(result.isSuccess()); assertEquals(3,result.getData().size());
|
||||
assertEquals("CALENDAR_MOCK_DATA",result.getMessage());
|
||||
verifyNoInteractions(properties,rooms,esb);
|
||||
var settings=new SettingService(); var dao=mock(SettingDao.class);
|
||||
ReflectionTestUtils.setField(settings,"settingDao",dao);
|
||||
ReflectionTestUtils.setField(settings,"calendarDataMockEnabled",true);
|
||||
assertEquals("60",settings.getCalendarSetting().stream()
|
||||
.filter(s->s.getKeys().equals("CALENDAR_VIEW_VISIBLE_DAYS")).findFirst().orElseThrow().getKeyValues());
|
||||
verifyNoInteractions(dao);
|
||||
ReflectionTestUtils.setField(settings,"calendarDataMockEnabled",false);
|
||||
when(dao.findAll()).thenReturn(List.of());
|
||||
assertTrue(settings.getCalendarSetting().isEmpty()); verify(dao).findAll();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,249 @@
|
||||
package com.mgm.mcrm.roomcalendar;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.mgm.mcrm.authorization.dtos.LoginUserInfo;
|
||||
import com.mgm.mcrm.authorization.services.SysGroupPermissionService;
|
||||
import com.mgm.mcrm.authorization.utils.JwtTokenUtil;
|
||||
import com.mgm.mcrm.basesetting.property.models.CfgProperties;
|
||||
import com.mgm.mcrm.basesetting.property.repositories.PropertyDao;
|
||||
import com.mgm.mcrm.basesetting.room.models.CfgRooms;
|
||||
import com.mgm.mcrm.basesetting.room.repositories.RoomDao;
|
||||
import com.mgm.mcrm.common.dtos.http_util.HttpResponseResult;
|
||||
import com.mgm.mcrm.common.services.MGMApiService;
|
||||
import com.mgm.mcrm.roomcalendar.controllers.RoomCalendarController;
|
||||
import com.mgm.mcrm.roomcalendar.repositories.RoomCalendarRoomProjection;
|
||||
import com.mgm.mcrm.roomcalendar.services.RoomCalendarService;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.ValueSource;
|
||||
import org.springframework.mock.web.MockHttpServletRequest;
|
||||
import org.springframework.test.util.ReflectionTestUtils;
|
||||
import java.util.*;
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.mockito.Mockito.*;
|
||||
|
||||
class CalendarQueryMigrationTest {
|
||||
PropertyDao properties;
|
||||
RoomDao rooms;
|
||||
MGMApiService esb;
|
||||
RoomCalendarService service;
|
||||
|
||||
@BeforeEach void setup() {
|
||||
properties = mock(PropertyDao.class);
|
||||
rooms = mock(RoomDao.class);
|
||||
esb = mock(MGMApiService.class);
|
||||
service = new RoomCalendarService();
|
||||
ReflectionTestUtils.setField(service, "propertyDao", properties);
|
||||
ReflectionTestUtils.setField(service, "roomDao", rooms);
|
||||
ReflectionTestUtils.setField(service, "mgmApiService", esb);
|
||||
}
|
||||
|
||||
Map<String,Object> request(boolean pascal) {
|
||||
Map<String,Object> result = new HashMap<>();
|
||||
result.put(pascal ? "Property" : "property", "Macau");
|
||||
result.put(pascal ? "RoomType" : "roomType", "SUITE");
|
||||
result.put(pascal ? "StartDate" : "startDate", "2026-09-10");
|
||||
result.put(pascal ? "EndDate" : "endDate", "2026-09-12");
|
||||
return result;
|
||||
}
|
||||
|
||||
CfgProperties property(long id, String name, String category, int order) {
|
||||
CfgProperties p = new CfgProperties();
|
||||
p.setId(id); p.setCalendarName(name); p.setName(name);
|
||||
p.setCode("MO"); p.setCategory(category);
|
||||
p.setCalendarOrder(order); p.setShowCalendar(1);
|
||||
return p;
|
||||
}
|
||||
|
||||
void visible() {
|
||||
when(properties.findByCalendarNameIn(any())).thenReturn(List.of(property(1,"Macau","OPERA",1)));
|
||||
CfgRooms room = new CfgRooms();
|
||||
room.setPropertyId("1"); room.setCalendarName("SUITE"); room.setShowCalendar(1);
|
||||
when(rooms.findByPropertyIdInAndCalendarNameIn(List.of("1"),List.of("SUITE")))
|
||||
.thenReturn(List.of(room));
|
||||
}
|
||||
|
||||
HttpResponseResult response(int status, String body) {
|
||||
HttpResponseResult response = new HttpResponseResult();
|
||||
response.setStatusCode(status); response.setResponseContent(body);
|
||||
return response;
|
||||
}
|
||||
|
||||
@ParameterizedTest @ValueSource(booleans={true,false})
|
||||
void aliasesResolveCalendarNameToEsbCodeAndNormalizeResponse(boolean pascal) throws Exception {
|
||||
visible();
|
||||
when(esb.invokeRequestRoomCalendar("","MO","SUITE","2026-09-10","2026-09-12",0))
|
||||
.thenReturn(response(200,"{\"StatusCode\":\"OK\",\"Records\":[{\"Property\":\"MO\",\"RoomType\":\"SUITE\",\"Date\":\"2026-09-10T00:00:00\",\"RoomCriteria\":\"A\",\"RoomCount\":3,\"PropertyLeader\":\"L\",\"BookingDateQualificationFlag\":1}]}"));
|
||||
var result = service.getRoomCalendar(request(pascal));
|
||||
assertTrue(result.isSuccess());
|
||||
assertEquals("2026-09-10",result.getData().getFirst().getDate());
|
||||
assertEquals(3,result.getData().getFirst().getRoomCount());
|
||||
verify(esb).invokeRequestRoomCalendar("","MO","SUITE","2026-09-10","2026-09-12",0);
|
||||
}
|
||||
|
||||
@Test void missingInputDoesNotCallDatabaseOrEsb() throws Exception {
|
||||
assertFalse(service.getRoomCalendar(Map.of()).isSuccess());
|
||||
verifyNoInteractions(properties,rooms,esb);
|
||||
}
|
||||
|
||||
@Test void hiddenPropertyDoesNotReachRoomLookupOrEsb() throws Exception {
|
||||
CfgProperties p = property(1,"Macau","OPERA",1); p.setShowCalendar(0);
|
||||
when(properties.findByCalendarNameIn(any())).thenReturn(List.of(p));
|
||||
var result = service.getRoomCalendar(request(true));
|
||||
assertEquals("PROPERTYNOSHOW",result.getErrorCode());
|
||||
verifyNoInteractions(rooms,esb);
|
||||
}
|
||||
|
||||
@Test void hiddenRoomDoesNotReachEsb() throws Exception {
|
||||
visible();
|
||||
CfgRooms hidden = new CfgRooms(); hidden.setCalendarName("SUITE"); hidden.setShowCalendar(0);
|
||||
when(rooms.findByPropertyIdInAndCalendarNameIn(anyList(),anyList())).thenReturn(List.of(hidden));
|
||||
assertEquals("ROOMTYPENOSHOW",service.getRoomCalendar(request(true)).getErrorCode());
|
||||
verifyNoInteractions(esb);
|
||||
}
|
||||
|
||||
@ParameterizedTest @ValueSource(ints={200,503})
|
||||
void upstreamFailureIsNotEmptySuccess(int status) throws Exception {
|
||||
visible();
|
||||
when(esb.invokeRequestRoomCalendar(anyString(),anyString(),anyString(),anyString(),anyString(),anyInt()))
|
||||
.thenReturn(response(status,"{\"StatusCode\":\"FAIL\",\"StatusDescription\":\"Rejected\"}"));
|
||||
assertFalse(service.getRoomCalendar(request(true)).isSuccess());
|
||||
}
|
||||
|
||||
RoomCalendarRoomProjection projected(String propertyId,String name,int order) {
|
||||
var row = mock(RoomCalendarRoomProjection.class);
|
||||
when(row.getPropertyId()).thenReturn(propertyId);
|
||||
when(row.getCalendarName()).thenReturn(name);
|
||||
when(row.getCalendarOrder()).thenReturn(order);
|
||||
when(row.getDefaultShowCalendar()).thenReturn(1);
|
||||
return row;
|
||||
}
|
||||
|
||||
@ParameterizedTest @ValueSource(strings={"OPERA","DAYLIGHT"})
|
||||
void metadataOrdersRoomsCapsDefaultsAndGroupsOtherProperties(String category) {
|
||||
CfgProperties hidden = property(3,"Hidden",category,0); hidden.setShowCalendar(0);
|
||||
when(properties.findAll()).thenReturn(new ArrayList<>(List.of(
|
||||
property(2,"Other Hotel","OTHER",2),hidden,property(1,"Macau",category,1))));
|
||||
List<RoomCalendarRoomProjection> projectedRooms = List.of(
|
||||
projected("1","D",4), projected("1","B",2), projected("1","A",1),
|
||||
projected("1","C",3), projected("2","X",1));
|
||||
when(rooms.queryCalendarRoomsByPropertyIds(anyList())).thenReturn(projectedRooms);
|
||||
var result = service.getPropertyRoomType();
|
||||
assertTrue(result.isSuccess());
|
||||
assertEquals(2,result.getPropertyList().size());
|
||||
var macau = result.getPropertyList().getFirst();
|
||||
assertEquals("Macau",macau.getCode());
|
||||
assertEquals(List.of("A","B","C"),macau.getDefaultRoomTypes());
|
||||
var other = result.getPropertyList().get(1);
|
||||
assertEquals("OTHER",other.getCode());
|
||||
assertEquals(List.of("Other Hotel"),other.getDefaultRoomTypes());
|
||||
assertEquals("X",other.getOtherProperties().getFirst().getRoomTypes().getFirst().getCode());
|
||||
verifyNoInteractions(esb);
|
||||
}
|
||||
|
||||
@Test void daylightCalendarUsesConfiguredPropertyCodeAndRoomCalendarName() throws Exception {
|
||||
CfgProperties daylight = property(1090,"Cotai","DAYLIGHT",1);
|
||||
daylight.setCode("configured-daylight-code");
|
||||
when(properties.findByCalendarNameIn(List.of("Cotai"))).thenReturn(List.of(daylight));
|
||||
CfgRooms room = new CfgRooms();
|
||||
room.setPropertyId("1090"); room.setCalendarName("configured-room-name"); room.setShowCalendar(1);
|
||||
when(rooms.findByPropertyIdInAndCalendarNameIn(List.of("1090"),List.of("configured-room-name")))
|
||||
.thenReturn(List.of(room));
|
||||
when(esb.invokeRequestRoomCalendar("","configured-daylight-code","configured-room-name","2026-09-10","2026-09-12",1))
|
||||
.thenReturn(response(200,"{\"StatusCode\":\"OK\",\"Records\":[]}"));
|
||||
var payload = request(true);
|
||||
payload.put("Property","Cotai"); payload.put("RoomType","configured-room-name");
|
||||
assertTrue(service.getRoomCalendar(payload).isSuccess());
|
||||
verify(esb).invokeRequestRoomCalendar("","configured-daylight-code","configured-room-name","2026-09-10","2026-09-12",1);
|
||||
}
|
||||
|
||||
@ParameterizedTest @ValueSource(strings={"","12345"})
|
||||
void esbAdapterUsesAuthenticatedPostAndOptionalPlayer(String player) throws Exception {
|
||||
MGMApiService adapter = spy(new MGMApiService());
|
||||
doReturn("test-token").when(adapter).getAccessToken();
|
||||
HttpResponseResult expected = response(200,"{}");
|
||||
doAnswer(call -> {
|
||||
assertEquals("/RequestRoomCalendar",call.getArgument(1));
|
||||
com.alibaba.fastjson.JSONObject body = call.getArgument(2);
|
||||
assertEquals("MO",body.getString("Property"));
|
||||
assertEquals("SUITE",body.getString("RoomType"));
|
||||
assertEquals("2026-09-10",body.getString("StartDate"));
|
||||
assertEquals("2026-09-12",body.getString("EndDate"));
|
||||
assertEquals(player.isEmpty() ? null : player,body.getString("PlayerId"));
|
||||
assertEquals("POST",call.getArgument(3));
|
||||
assertEquals(Map.of("Authorization","test-token"),call.getArgument(4));
|
||||
return expected;
|
||||
}).when(adapter).invokeESBAPI(anyString(),anyString(),any(),anyString(),anyMap(),anyInt());
|
||||
assertSame(expected,adapter.invokeRequestRoomCalendar(player,"MO","SUITE","2026-09-10","2026-09-12"));
|
||||
}
|
||||
|
||||
@Test void permittedPlayerRequestReachesServiceWithoutLosingPayload() throws Exception {
|
||||
RoomCalendarController controller = new RoomCalendarController();
|
||||
RoomCalendarService queries = mock(RoomCalendarService.class);
|
||||
SysGroupPermissionService permissions = mock(SysGroupPermissionService.class);
|
||||
ReflectionTestUtils.setField(controller,"roomCalendarService",queries);
|
||||
ReflectionTestUtils.setField(controller,"sysGroupPermissionService",permissions);
|
||||
MockHttpServletRequest req = new MockHttpServletRequest();
|
||||
LoginUserInfo user = new LoginUserInfo(); user.setGroupName("calendar-users");
|
||||
when(permissions.checkGroupPermission("calendar-users","10001_07")).thenReturn(true);
|
||||
Map<String,Object> payload = request(true); payload.put("PlayerId","12345");
|
||||
var expected = new com.mgm.mcrm.roomcalendar.dtos.response.RoomCalendarApiResponse<java.util.List<com.mgm.mcrm.roomcalendar.dtos.RoomCalendarQualification>>();
|
||||
expected.setSuccess(true);
|
||||
when(queries.getRoomCalendar(payload)).thenReturn(expected);
|
||||
try (var jwt = mockStatic(JwtTokenUtil.class)) {
|
||||
jwt.when(() -> JwtTokenUtil.parseUserFromRequest(req)).thenReturn(user);
|
||||
assertSame(expected,controller.getPlayerRoomQualification(req,payload));
|
||||
verify(queries).getRoomCalendar(payload);
|
||||
}
|
||||
}
|
||||
|
||||
@ParameterizedTest @ValueSource(booleans={true,false})
|
||||
void mockPermissionAllowsAllCalendarRoutesButStillRequiresUser(boolean loggedIn) throws Exception {
|
||||
RoomCalendarController controller = new RoomCalendarController();
|
||||
RoomCalendarService queries = mock(RoomCalendarService.class);
|
||||
SysGroupPermissionService permissions = mock(SysGroupPermissionService.class);
|
||||
ReflectionTestUtils.setField(controller,"roomCalendarService",queries);
|
||||
ReflectionTestUtils.setField(controller,"sysGroupPermissionService",permissions);
|
||||
ReflectionTestUtils.setField(controller,"calendarPermissionMockEnabled",true);
|
||||
MockHttpServletRequest req = new MockHttpServletRequest();
|
||||
try (var jwt = mockStatic(JwtTokenUtil.class)) {
|
||||
jwt.when(() -> JwtTokenUtil.parseUserFromRequest(req))
|
||||
.thenReturn(loggedIn ? new LoginUserInfo() : null);
|
||||
var general = controller.requestRoomCalendar(req,request(true));
|
||||
var player = controller.getPlayerRoomQualification(req,request(true));
|
||||
var metadata = controller.requestPropertiesRoomTypes(req);
|
||||
if (loggedIn) {
|
||||
verify(queries,times(2)).getRoomCalendar(request(true));
|
||||
verify(queries).getPropertyRoomType();
|
||||
} else {
|
||||
assertEquals("NO_PERMISSION",general.getErrorCode());
|
||||
assertEquals("NO_PERMISSION",player.getErrorCode());
|
||||
assertEquals("NO_PERMISSION",metadata.getErrorCode());
|
||||
verifyNoInteractions(queries);
|
||||
}
|
||||
verifyNoInteractions(permissions);
|
||||
}
|
||||
}
|
||||
|
||||
@Test void allControllerRoutesRejectDeniedGroupAndSerializeCompatibleErrors() throws Exception {
|
||||
RoomCalendarController controller = new RoomCalendarController();
|
||||
RoomCalendarService queries = mock(RoomCalendarService.class);
|
||||
SysGroupPermissionService permissions = mock(SysGroupPermissionService.class);
|
||||
ReflectionTestUtils.setField(controller,"roomCalendarService",queries);
|
||||
ReflectionTestUtils.setField(controller,"sysGroupPermissionService",permissions);
|
||||
MockHttpServletRequest req = new MockHttpServletRequest();
|
||||
LoginUserInfo user = new LoginUserInfo(); user.setGroupName("restricted");
|
||||
try (var jwt = mockStatic(JwtTokenUtil.class)) {
|
||||
jwt.when(() -> JwtTokenUtil.parseUserFromRequest(req)).thenReturn(user);
|
||||
var result = controller.requestRoomCalendar(req,request(true));
|
||||
var json = new ObjectMapper().valueToTree(result);
|
||||
assertEquals("NO_PERMISSION",json.get("code").asText());
|
||||
assertEquals("NO_PERMISSION",json.get("errorCode").asText());
|
||||
assertEquals("NO_PERMISSION",controller.getPlayerRoomQualification(req,request(true)).getErrorCode());
|
||||
assertEquals("NO_PERMISSION",controller.requestPropertiesRoomTypes(req).getErrorCode());
|
||||
verify(permissions,times(3)).checkGroupPermission("restricted","10001_07");
|
||||
verifyNoInteractions(queries);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user