package org.synyx.urlaubsverwaltung.restapi.workday;
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.period.DayLength;
import org.synyx.urlaubsverwaltung.core.person.Person;
import org.synyx.urlaubsverwaltung.core.person.PersonService;
import org.synyx.urlaubsverwaltung.core.workingtime.WorkDaysService;
import org.synyx.urlaubsverwaltung.restapi.ApiExceptionHandlerControllerAdvice;
import org.synyx.urlaubsverwaltung.restapi.workday.WorkDayController;
import org.synyx.urlaubsverwaltung.test.TestDataCreator;
import java.math.BigDecimal;
import java.util.Optional;
import static org.hamcrest.Matchers.is;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
/**
* @author Aljona Murygina - murygina@synyx.de
*/
public class WorkDayControllerTest {
private MockMvc mockMvc;
private PersonService personServiceMock;
private WorkDaysService workDaysServiceMock;
@Before
public void setUp() {
personServiceMock = Mockito.mock(PersonService.class);
workDaysServiceMock = Mockito.mock(WorkDaysService.class);
mockMvc = MockMvcBuilders.standaloneSetup(new WorkDayController(personServiceMock, workDaysServiceMock))
.setControllerAdvice(new ApiExceptionHandlerControllerAdvice())
.build();
}
@Test
public void ensureReturnsWorkDays() throws Exception {
Person person = TestDataCreator.createPerson();
Mockito.when(personServiceMock.getPersonByID(Mockito.anyInt())).thenReturn(Optional.of(person));
Mockito.when(workDaysServiceMock.getWorkDays(Mockito.any(DayLength.class), Mockito.any(DateMidnight.class),
Mockito.any(DateMidnight.class), Mockito.any(Person.class)))
.thenReturn(BigDecimal.ONE);
mockMvc.perform(get("/api/workdays").param("from", "2016-01-04")
.param("to", "2016-01-04")
.param("length", "FULL")
.param("person", "23"))
.andExpect(status().isOk())
.andExpect(content().contentType("application/json;charset=UTF-8"))
.andExpect(jsonPath("$.response").exists())
.andExpect(jsonPath("$.response.workDays").exists())
.andExpect(jsonPath("$.response.workDays", is("1")));
Mockito.verify(personServiceMock).getPersonByID(23);
Mockito.verify(workDaysServiceMock)
.getWorkDays(DayLength.FULL, new DateMidnight(2016, 1, 4), new DateMidnight(2016, 1, 4), person);
}
@Test
public void ensureBadRequestForMissingFromParameter() throws Exception {
mockMvc.perform(get("/api/workdays").param("to", "2016-01-06").param("length", "FULL").param("person", "23"))
.andExpect(status().isBadRequest());
}
@Test
public void ensureBadRequestForInvalidFromParameter() throws Exception {
mockMvc.perform(get("/api/workdays").param("from", "foo")
.param("to", "2016-01-06")
.param("length", "FULL")
.param("person", "23"))
.andExpect(status().isBadRequest());
}
@Test
public void ensureBadRequestForMissingToParameter() throws Exception {
mockMvc.perform(get("/api/workdays").param("from", "2016-01-01").param("length", "FULL").param("person", "23"))
.andExpect(status().isBadRequest());
}
@Test
public void ensureBadRequestForInvalidToParameter() throws Exception {
mockMvc.perform(get("/api/workdays").param("from", "2016-01-01")
.param("to", "foo")
.param("length", "FULL")
.param("person", "23"))
.andExpect(status().isBadRequest());
}
@Test
public void ensureBadRequestForMissingPersonParameter() throws Exception {
mockMvc.perform(get("/api/workdays").param("from", "2016-01-01")
.param("to", "2016-01-06")
.param("length", "FULL"))
.andExpect(status().isBadRequest());
}
@Test
public void ensureBadRequestForInvalidPersonParameter() throws Exception {
mockMvc.perform(get("/api/workdays").param("from", "2016-01-01")
.param("to", "2016-01-06")
.param("length", "FULL")
.param("person", "foo"))
.andExpect(status().isBadRequest());
}
@Test
public void ensureBadRequestIfThereIsNoPersonForGivenID() throws Exception {
Mockito.when(personServiceMock.getPersonByID(Mockito.anyInt())).thenReturn(Optional.empty());
mockMvc.perform(get("/api/workdays").param("from", "2016-01-01")
.param("to", "2016-01-06")
.param("length", "FULL")
.param("person", "23"))
.andExpect(status().isBadRequest());
Mockito.verify(personServiceMock).getPersonByID(23);
}
@Test
public void ensureBadRequestForMissingLengthParameter() throws Exception {
mockMvc.perform(get("/api/workdays").param("from", "2016-01-01")
.param("to", "2016-01-06")
.param("person", "23"))
.andExpect(status().isBadRequest());
}
@Test
public void ensureBadRequestForInvalidLengthParameter() throws Exception {
Person person = TestDataCreator.createPerson("muster");
Mockito.when(personServiceMock.getPersonByID(Mockito.anyInt())).thenReturn(Optional.of(person));
mockMvc.perform(get("/api/workdays").param("from", "2016-01-01")
.param("to", "2016-01-06")
.param("length", "FOO")
.param("person", "23"))
.andExpect(status().isBadRequest());
}
@Test
public void ensureBadRequestForInvalidPeriod() throws Exception {
mockMvc.perform(get("/api/workdays").param("from", "2016-01-01")
.param("to", "2015-01-06")
.param("length", "FULL")
.param("person", "23"))
.andExpect(status().isBadRequest());
}
}