package org.synyx.urlaubsverwaltung.restapi.availability; import org.joda.time.DateMidnight; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.synyx.urlaubsverwaltung.core.person.Person; import org.synyx.urlaubsverwaltung.core.person.PersonService; import org.synyx.urlaubsverwaltung.restapi.ApiExceptionHandlerControllerAdvice; import org.synyx.urlaubsverwaltung.test.TestDataCreator; import java.util.Optional; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; /** * @author Timo Eifler - eifler@synyx.de */ public class AvailabilityControllerTest { private MockMvc mockMvc; private PersonService personServiceMock; private AvailabilityService availabilityServiceMock; private Person testPerson; private String loginName; @Before public void setUp() { loginName = "login"; preparePersonServiceMock(); availabilityServiceMock = Mockito.mock(AvailabilityService.class); mockMvc = MockMvcBuilders.standaloneSetup(new AvailabilityController(availabilityServiceMock, personServiceMock)).setControllerAdvice(new ApiExceptionHandlerControllerAdvice()).build(); } private void preparePersonServiceMock() { personServiceMock = Mockito.mock(PersonService.class); testPerson = TestDataCreator.createPerson("testPerson"); Mockito.when(personServiceMock.getPersonByLogin(Mockito.anyString())).thenReturn(Optional.of(testPerson)); } @Test public void ensureFetchesAvailabilitiesForGivenPersonIfProvided() throws Exception { mockMvc.perform(get("/api/availabilities").param("from", "2016-01-01") .param("to", "2016-01-31") .param("person", loginName)) .andExpect(status().isOk()); Mockito.verify(personServiceMock).getPersonByLogin(loginName); Mockito.verify(availabilityServiceMock) .getPersonsAvailabilities(Mockito.eq(new DateMidnight(2016, 1, 1)), Mockito.eq(new DateMidnight(2016, 01, 31)), Mockito.eq(testPerson)); } @Test public void ensureRequestsAreOnlyAllowedForADateRangeOfMaxOneMonth() throws Exception { mockMvc.perform(get("/api/availabilities").param("from", "2016-01-01") .param("to", "2016-02-01") .param("person", loginName)) .andExpect(status().isBadRequest()); } @Test public void ensureBadRequestForMissingPersonParameter() throws Exception { mockMvc.perform(get("/api/availabilities").param("to", "2016-12-31").param("to", "2016-12-31")) .andExpect(status().isBadRequest()); } @Test public void ensureBadRequestForMissingFromParameter() throws Exception { mockMvc.perform(get("/api/availabilities").param("to", "2016-12-31").param("person", loginName)) .andExpect(status().isBadRequest()); } @Test public void ensureBadRequestForInvalidFromParameter() throws Exception { mockMvc.perform(get("/api/availabilities").param("from", "foo") .param("to", "2016-12-31") .param("person", loginName)) .andExpect(status().isBadRequest()); } @Test public void ensureBadRequestForMissingToParameter() throws Exception { mockMvc.perform(get("/api/availabilities").param("from", "2016-01-01").param("person", loginName)) .andExpect(status().isBadRequest()); } @Test public void ensureBadRequestForInvalidToParameter() throws Exception { mockMvc.perform(get("/api/availabilities").param("from", "2016-01-01") .param("to", "foo") .param("person", loginName)) .andExpect(status().isBadRequest()); } @Test public void ensureBadRequestForInvalidPeriod() throws Exception { mockMvc.perform(get("/api/availabilities").param("from", "2016-01-01") .param("to", "2015-01-01") .param("person", loginName)) .andExpect(status().isBadRequest()); } }