/*
* 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.reservetour;
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 org.junit.Before;
import org.junit.Test;
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.exception.BusinessException;
import org.terasoluna.tourreservation.domain.model.Customer;
import org.terasoluna.tourreservation.domain.service.reserve.ReserveTourOutput;
import org.terasoluna.tourreservation.domain.service.userdetails.ReservationUserDetails;
public class ReserveTourControllerTest {
ReservationUserDetails userDetails;
MockMvc mockMvc;
ReserveTourHelper reserveTourHelper;
ReserveTourController reserveTourController;
@Before
public void setupForm() {
// instantiate the controller to test
reserveTourController = new ReserveTourController();
// other members instantiation and assignment
userDetails = new ReservationUserDetails(new Customer("xxxx"));
reserveTourHelper = mock(ReserveTourHelper.class);
reserveTourController.reserveTourHelper = reserveTourHelper;
// build
mockMvc = MockMvcBuilders.standaloneSetup(reserveTourController)
.setCustomArgumentResolvers(
new AuthenticationPrincipalArgumentResolver()).build();
}
@Test
public void testReserveFormSuccess() {
// Prepare get request
MockHttpServletRequestBuilder getRequest = MockMvcRequestBuilders.get(
"/tours/123/reserve").param("form", "");
// Set mock behavior for helper method
when(
reserveTourHelper.findTourDetail(
(ReservationUserDetails) anyObject(), eq("123"),
(ReserveTourForm) anyObject())).thenReturn(
new TourDetailOutput());
try {
ResultActions results = mockMvc.perform(getRequest);
results.andExpect(status().isOk());
results.andExpect(view().name("reservetour/reserveForm"));
results.andExpect(model().attribute("output", notNullValue()));
return;
} catch (Exception e) {
e.printStackTrace();
}
fail(); // FAIL when exception is thrown
}
@Test
public void testReadFormSuccess() {
// Prepare get request
MockHttpServletRequestBuilder getRequest = MockMvcRequestBuilders.get(
"/tours/123").param("form", "");
// Set mock behavior for helper method
when(
reserveTourHelper.findTourDetail(
(ReservationUserDetails) anyObject(), eq("123"),
(ReserveTourForm) anyObject())).thenReturn(
new TourDetailOutput());
try {
ResultActions results = mockMvc.perform(getRequest);
results.andExpect(status().isOk());
results.andExpect(view().name("reservetour/reserveForm"));
results.andExpect(model().attribute("output", notNullValue()));
return;
} catch (Exception e) {
e.printStackTrace();
}
fail(); // FAIL when exception is thrown
}
@Test
public void testReserveTourConfirmSuccess() {
// Prepare POST request
MockHttpServletRequestBuilder postRequest = MockMvcRequestBuilders
.post("/tours/123/reserve").param("confirm", "");
// Set mock behavior for helper method
when(
reserveTourHelper.findTourDetail(
(ReservationUserDetails) anyObject(), eq("123"),
(ReserveTourForm) anyObject())).thenReturn(
new TourDetailOutput());
// Set form data
postRequest.param("adultCount", "2");
postRequest.param("childCount", "2");
try {
ResultActions results = mockMvc.perform(postRequest);
results.andExpect(status().isOk());
results.andExpect(model().hasNoErrors());
results.andExpect(model().attribute("output", notNullValue()));
results.andExpect(view().name("reservetour/reserveConfirm"));
return;
} catch (Exception e) {
e.printStackTrace();
}
fail(); // FAIL when exception is thrown
}
@Test
public void testReserveTourConfirmFail() {
// Prepare POST request
MockHttpServletRequestBuilder postRequest = MockMvcRequestBuilders
.post("/tours/123/reserve").param("confirm", "");
// Set mock behavior for helper method
when(
reserveTourHelper.findTourDetail(
(ReservationUserDetails) anyObject(), eq("123"),
(ReserveTourForm) anyObject())).thenReturn(
new TourDetailOutput());
// Do not Set any form data so that form validation will fail
// Just perform the request
try {
ResultActions results = mockMvc.perform(postRequest);
results.andExpect(status().isOk());
results.andExpect(view().name("reservetour/reserveForm"));
results.andExpect(model().hasErrors());
results.andExpect(model().attributeErrorCount("reserveTourForm", 2));
results.andExpect(model().attribute("output", notNullValue()));
return;
} catch (Exception e) {
e.printStackTrace();
}
fail(); // FAIL when exception is thrown
}
@Test
public void testReserveTourReserveSuccess() {
// Prepare POST request
MockHttpServletRequestBuilder postRequest = MockMvcRequestBuilders
.post("/tours/123/reserve");
// Set mock behavior for helper method
when(
reserveTourHelper.reserve((ReservationUserDetails) anyObject(),
eq("123"), (ReserveTourForm) anyObject())).thenReturn(
new ReserveTourOutput());
postRequest.param("adultCount", "2");
postRequest.param("childCount", "2");
try {
ResultActions results = mockMvc.perform(postRequest);
results.andExpect(status().isFound());
results.andExpect(model().hasNoErrors());
results.andExpect(flash().attribute("output", notNullValue()));
results.andExpect(view().name(
"redirect:/tours/{tourCode}/reserve?complete"));
return;
} catch (Exception e) {
e.printStackTrace();
}
fail(); // FAIL when exception is thrown
}
@Test
public void testReserveTourReserveFailByBusinessException() {
// Prepare POST request
MockHttpServletRequestBuilder postRequest = MockMvcRequestBuilders
.post("/tours/123/reserve");
// Set mock behavior for helper method
when(
reserveTourHelper.reserve((ReservationUserDetails) anyObject(),
eq("123"), (ReserveTourForm) anyObject())).thenThrow(
new BusinessException(""));
when(
reserveTourHelper.findTourDetail(
(ReservationUserDetails) anyObject(), eq("123"),
(ReserveTourForm) anyObject())).thenReturn(
new TourDetailOutput());
// Set form data
postRequest.param("adultCount", "2");
postRequest.param("childCount", "2");
try {
ResultActions results = mockMvc.perform(postRequest);
results.andExpect(status().isOk());
results.andExpect(model().hasNoErrors());
results.andExpect(model().attribute("output", notNullValue()));
results.andExpect(model().attribute("resultMessages",
notNullValue()));
results.andExpect(view().name("reservetour/reserveForm"));
return;
} catch (Exception e) {
e.printStackTrace();
}
fail(); // FAIL when exception is thrown
}
@Test
public void testReserveComplete() {
// Prepare get request
MockHttpServletRequestBuilder getRequest = MockMvcRequestBuilders.get(
"/tours/123/reserve").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("reservetour/reserveComplete"));
return;
} catch (Exception e) {
e.printStackTrace();
}
fail(); // FAIL when exception is thrown
}
@Test
public void testReserveRedo() {
// Prepare get request
MockHttpServletRequestBuilder postRequest = MockMvcRequestBuilders
.post("/tours/123/reserve").param("redo", "");
// No Logic testing here
// this will just test the request mapping part
try {
ResultActions results = mockMvc.perform(postRequest);
results.andExpect(status().isOk());
results.andExpect(view().name("reservetour/reserveForm"));
return;
} catch (Exception e) {
e.printStackTrace();
}
fail(); // FAIL when exception is thrown
}
}