/* * Copyright (C) 2013-2017 NTT DATA Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied. See the License for the specific language * governing permissions and limitations under the License. */ package org.terasoluna.tourreservation.app.managereservation; import static org.hamcrest.core.IsNull.notNullValue; import static org.junit.Assert.fail; import static org.mockito.Matchers.anyObject; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.flash; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.Locale; import org.dozer.DozerBeanMapper; import org.dozer.Mapper; import org.hamcrest.core.IsNull; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import org.springframework.security.web.method.annotation.AuthenticationPrincipalArgumentResolver; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.terasoluna.gfw.common.codelist.i18n.I18nCodeList; import org.terasoluna.gfw.common.exception.BusinessException; import org.terasoluna.tourreservation.domain.model.Reserve; import org.terasoluna.tourreservation.domain.service.reserve.ReservationUpdateInput; import org.terasoluna.tourreservation.domain.service.reserve.ReservationUpdateOutput; import org.terasoluna.tourreservation.domain.service.reserve.ReserveService; import org.terasoluna.tourreservation.domain.service.userdetails.ReservationUserDetails; public class ManageReservationControllerTest { MockMvc mockMvc; ManageReservationController manageReservationController; ManageReservationHelper manageReservationHelper; ReserveService reserveService; Mapper beanMapper; ReservationUserDetails userDetails; @Before public void setupForm() { // instantiate the controller to test manageReservationController = new ManageReservationController(); // other members instantiation and assignment manageReservationHelper = mock(ManageReservationHelper.class); manageReservationHelper.existenceCodeList = mock(I18nCodeList.class); beanMapper = new DozerBeanMapper(); reserveService = mock(ReserveService.class); userDetails = mock(ReservationUserDetails.class); manageReservationController.manageReservationHelper = manageReservationHelper; manageReservationController.beanMapper = beanMapper; manageReservationController.reserveService = reserveService; // build mockMvc = MockMvcBuilders.standaloneSetup(manageReservationController) .setCustomArgumentResolvers( new AuthenticationPrincipalArgumentResolver()).build(); } @Test public void testManageReservationListSuccess() { // Prepare get request MockHttpServletRequestBuilder getRequest = MockMvcRequestBuilders .get("/reservations/me"); // Set mock behavior for helper method when(manageReservationHelper.list(userDetails)).thenReturn( new ArrayList<ReserveRowOutput>()); try { ResultActions results = mockMvc.perform(getRequest); results.andExpect(status().isOk()); results.andExpect(view().name("managereservation/list")); results.andExpect(model().attribute("rows", notNullValue())); return; } catch (Exception e) { e.printStackTrace(); } fail(); // FAIL when exception is thrown } @Test public void testManageReservationDetailSuccess() { // Prepare get request MockHttpServletRequestBuilder getRequest = MockMvcRequestBuilders .get("/reservations/123"); // Set mock behavior for helper method when(manageReservationHelper.findDetail("123")).thenReturn( new ReservationDetailOutput()); try { ResultActions results = mockMvc.perform(getRequest); results.andExpect(status().isOk()); results.andExpect(view().name("managereservation/detailForm")); results.andExpect(model().attribute("output", notNullValue())); return; } catch (Exception e) { e.printStackTrace(); } fail(); // FAIL when exception is thrown } @Test public void testManageReservationUpdateFormSuccess() { // Prepare get request MockHttpServletRequestBuilder getRequest = MockMvcRequestBuilders.get( "/reservations/123/update").param("form", ""); // Set mock behavior for service method when(reserveService.findOneWithTourInfo("123")).thenReturn( new Reserve()); try { ResultActions results = mockMvc.perform(getRequest); results.andExpect(status().isOk()); results.andExpect(view().name("managereservation/updateForm")); results.andExpect(model().attribute("reserve", notNullValue())); return; } catch (Exception e) { e.printStackTrace(); } fail(); // FAIL when exception is thrown } @Test public void testManageReservationRedoSuccess() { // Prepare post request MockHttpServletRequestBuilder postRequest = MockMvcRequestBuilders .post("/reservations/123/update").param("redo", ""); // Set mock behavior for service method when(reserveService.findOneWithTourInfo("123")).thenReturn( new Reserve()); try { ResultActions results = mockMvc.perform(postRequest); results.andExpect(status().isOk()); results.andExpect(view().name("managereservation/updateForm")); results.andExpect(model().attribute("reserve", notNullValue())); return; } catch (Exception e) { e.printStackTrace(); } fail(); // FAIL when exception is thrown } @Test public void testManageReservationUpdateConfirmSuccess() { // Prepare post request MockHttpServletRequestBuilder postRequest = MockMvcRequestBuilders .post("/reservations/123/update").param("confirm", ""); // Set mock behavior for helper method when( manageReservationHelper.findDetail(eq("123"), (ManageReservationForm) anyObject())).thenReturn( new ReservationDetailOutput()); // Set form data to pass @Validated check postRequest.param("reserveNo", "123"); postRequest.param("adultCount", "1"); postRequest.param("childCount", "2"); try { ResultActions results = mockMvc.perform(postRequest); results.andExpect(status().isOk()); results.andExpect(view().name("managereservation/updateConfirm")); results.andExpect(model().attribute("output", notNullValue())); return; } catch (Exception e) { e.printStackTrace(); } fail(); // FAIL when exception is thrown } @Test public void testManageReservationUpdateConfirmFail() { // Prepare post request MockHttpServletRequestBuilder postRequest = MockMvcRequestBuilders .post("/reservations/123/update").param("confirm", ""); // Set mock behavior for helper method when(reserveService.findOneWithTourInfo("123")).thenReturn( new Reserve()); // Set form data to fail the @Validated check postRequest.param("reserveNo", "123"); postRequest.param("adultCount", "10"); // Error postRequest.param("childCount", "10"); // Error try { ResultActions results = mockMvc.perform(postRequest); results.andExpect(status().isOk()); results.andExpect(view().name("managereservation/updateForm")); results.andExpect(model().attribute("reserve", notNullValue())); results.andExpect(model().hasErrors()); results.andExpect(model().attributeErrorCount( "manageReservationForm", 2)); return; } catch (Exception e) { e.printStackTrace(); } fail(); // FAIL when exception is thrown } @Test public void testManageReservationUpdateSuccess() { // Prepare post request MockHttpServletRequestBuilder postRequest = MockMvcRequestBuilders .post("/reservations/123/update"); // Set mock behavior for helper method when(reserveService.update((ReservationUpdateInput) anyObject())) .thenReturn(new ReservationUpdateOutput()); // Set form data to pass @Validated check postRequest.param("reserveNo", "123"); postRequest.param("adultCount", "1"); postRequest.param("childCount", "2"); try { ResultActions results = mockMvc.perform(postRequest); // check redirect success results.andExpect(status().isFound()); results.andExpect(view().name( "redirect:/reservations/{reserveNo}/update?complete")); results.andExpect(flash().attribute("output", notNullValue())); return; } catch (Exception e) { e.printStackTrace(); } fail(); // FAIL when exception is thrown } @Test public void testManageReservationUpdateFail() { // Prepare post request MockHttpServletRequestBuilder postRequest = MockMvcRequestBuilders .post("/reservations/123/update"); // Set mock behavior for helper method // Set mock behavior for service method when(reserveService.findOneWithTourInfo("123")).thenReturn( new Reserve()); // Set form data to pass @Validated check postRequest.param("reserveNo", "123"); postRequest.param("adultCount", "10"); postRequest.param("childCount", "20"); try { ResultActions results = mockMvc.perform(postRequest); results.andExpect(status().isOk()); results.andExpect(view().name("managereservation/updateForm")); results.andExpect(model().attribute("reserve", notNullValue())); results.andExpect(model().hasErrors()); results.andExpect(model().attributeErrorCount( "manageReservationForm", 2)); return; } catch (Exception e) { e.printStackTrace(); } fail(); // FAIL when exception is thrown } @Test public void testManageReservationComplete() { // Prepare get request MockHttpServletRequestBuilder getRequest = MockMvcRequestBuilders.get( "/reservations/123/update").param("complete", ""); // No Logic testing here // this will just test the request mapping part try { ResultActions results = mockMvc.perform(getRequest); results.andExpect(status().isOk()); results.andExpect(view().name("managereservation/updateComplete")); return; } catch (Exception e) { e.printStackTrace(); } fail(); // FAIL when exception is thrown } @Test public void testManageReservationDownloadPDF() { // Prepare get request MockHttpServletRequestBuilder getRequest = MockMvcRequestBuilders .get("/reservations/123/pdf"); // Set mock behavior for helper method when(manageReservationHelper.createPDF("123", Locale.ENGLISH)) .thenReturn(new DownloadPDFOutput()); when(manageReservationHelper.existenceCodeList.asMap(Locale.ENGLISH)) .thenReturn(new LinkedHashMap<String, String>() { { put("0", "No"); put("1", "Yes"); } }); // No Logic testing here // this will just test the request mapping part try { ResultActions results = mockMvc.perform(getRequest); results.andExpect(status().isOk()); results.andExpect(view().name("managereservation/report")); results.andExpect(model().attribute("downloadPDFOutputList", IsNull.notNullValue())); return; } catch (Exception e) { e.printStackTrace(); } fail(); // FAIL when exception is thrown } @Test public void testManageReservationCancelComplete() { // Prepare get request MockHttpServletRequestBuilder getRequest = MockMvcRequestBuilders.get( "/reservations/123/cancel").param("complete", ""); // No Logic testing here // this will just test the request mapping part try { ResultActions results = mockMvc.perform(getRequest); results.andExpect(status().isOk()); results.andExpect(view().name("managereservation/cancelComplete")); return; } catch (Exception e) { e.printStackTrace(); } fail(); // FAIL when exception is thrown } @Test public void testManageReservationBackList() { // Prepare get request MockHttpServletRequestBuilder getRequest = MockMvcRequestBuilders.post( "/reservations/123/cancel").param("backTolist", ""); // No Logic testing here // this will just test the request mapping part try { ResultActions results = mockMvc.perform(getRequest); // Test Redirect results.andExpect(status().isFound()); results.andExpect(view().name("redirect:/reservations/me")); return; } catch (Exception e) { e.printStackTrace(); } fail(); // FAIL when exception is thrown } @Test public void testManageReservationUpdateBackList() { // Prepare post request MockHttpServletRequestBuilder postRequest = MockMvcRequestBuilders .post("/reservations/123/update").param("backTolist", ""); // No Logic testing here // this will just test the request mapping part try { ResultActions results = mockMvc.perform(postRequest); // Test Redirect results.andExpect(status().isFound()); results.andExpect(view().name("redirect:/reservations/me")); return; } catch (Exception e) { e.printStackTrace(); } fail(); // FAIL when exception is thrown } @Test public void testManageReservationCancelConfirm() { // Prepare post request MockHttpServletRequestBuilder postRequest = MockMvcRequestBuilders.get( "/reservations/123/cancel").param("confirm", ""); // Set mock behavior for helper method when(manageReservationHelper.findDetail("123")).thenReturn( new ReservationDetailOutput()); try { ResultActions results = mockMvc.perform(postRequest); results.andExpect(status().isOk()); results.andExpect(view().name("managereservation/cancelConfirm")); results.andExpect(model().attribute("output", notNullValue())); return; } catch (Exception e) { e.printStackTrace(); } fail(); // FAIL when exception is thrown } @Test public void testManageReservationCancelSuccess() { // Prepare post request MockHttpServletRequestBuilder postRequest = MockMvcRequestBuilders .post("/reservations/123/cancel"); // Set mock behavior for service method Mockito.doNothing().when(reserveService).cancel("123"); try { ResultActions results = mockMvc.perform(postRequest); // Test Redirect results.andExpect(status().isFound()); results.andExpect(view().name( "redirect:/reservations/{reserveNo}/cancel?complete")); return; } catch (Exception e) { e.printStackTrace(); } fail(); // FAIL when exception is thrown } @Test public void testManageReservationCancelFailByBusinessException() { // Prepare post request MockHttpServletRequestBuilder postRequest = MockMvcRequestBuilders .post("/reservations/123/cancel"); // Set mock behavior for service and helper method Mockito.doThrow(new BusinessException("")).when(reserveService).cancel( "123"); when(manageReservationHelper.findDetail("123")).thenReturn( new ReservationDetailOutput()); try { ResultActions results = mockMvc.perform(postRequest); results.andExpect(status().isOk()); results.andExpect(view().name("managereservation/cancelConfirm")); results.andExpect(model().attribute("output", notNullValue())); // Exception message existence check results.andExpect(model().attribute("resultMessages", notNullValue())); return; } catch (Exception e) { e.printStackTrace(); } fail(); // FAIL when exception is thrown } }