package org.synyx.urlaubsverwaltung.restapi.availability; import org.joda.time.DateMidnight; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import org.synyx.urlaubsverwaltung.core.period.DayLength; import org.synyx.urlaubsverwaltung.core.person.Person; import org.synyx.urlaubsverwaltung.core.sicknote.SickNote; import org.synyx.urlaubsverwaltung.core.sicknote.SickNoteService; import org.synyx.urlaubsverwaltung.test.TestDataCreator; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * @author Timo Eifler - eifler@synyx.de */ public class SickDayAbsenceProviderTest { private SickDayAbsenceProvider sickDayAbsenceProvider; private SickNoteService sickNoteService; private VacationAbsenceProvider vacationAbsenceProvider; private TimedAbsenceSpans emptyTimedAbsenceSpans; private Person testPerson; private SickNote sickNote; private DateMidnight sickDay; private DateMidnight standardWorkingDay; @Before public void setUp() { emptyTimedAbsenceSpans = new TimedAbsenceSpans(new ArrayList<>()); testPerson = TestDataCreator.createPerson(); sickNote = TestDataCreator.createSickNote(testPerson, sickDay, sickDay, DayLength.FULL); sickDay = new DateMidnight(2016, 1, 4); standardWorkingDay = new DateMidnight(2016, 1, 5); setupSickNoteServiceMock(); vacationAbsenceProvider = Mockito.mock(VacationAbsenceProvider.class); sickDayAbsenceProvider = new SickDayAbsenceProvider(vacationAbsenceProvider, sickNoteService); } private void setupSickNoteServiceMock() { sickNoteService = Mockito.mock(SickNoteService.class); Mockito.when(sickNoteService.getByPersonAndPeriod(testPerson, sickDay, sickDay)) .thenReturn(Collections.singletonList(sickNote)); Mockito.when(sickNoteService.getByPersonAndPeriod(testPerson, standardWorkingDay, standardWorkingDay)) .thenReturn(Collections.emptyList()); } @Test public void ensurePersonIsNotAvailableOnSickDay() { TimedAbsenceSpans updatedTimedAbsenceSpans = sickDayAbsenceProvider.checkForAbsence(emptyTimedAbsenceSpans, testPerson, sickDay); List<TimedAbsence> absencesList = updatedTimedAbsenceSpans.getAbsencesList(); Assert.assertEquals("wrong number of absences in list", 1, absencesList.size()); Assert.assertEquals("wrong absence type", TimedAbsence.Type.SICK_NOTE, absencesList.get(0).getType()); Assert.assertEquals("wrong part of day set on absence", DayLength.FULL.name(), absencesList.get(0).getPartOfDay()); Assert.assertTrue("wrong absence ratio", BigDecimal.ONE.compareTo(absencesList.get(0).getRatio()) == 0); } @Test public void ensureDoesNotCallNextProviderIfAlreadyAbsentForWholeDay() { sickDayAbsenceProvider.checkForAbsence(emptyTimedAbsenceSpans, testPerson, sickDay); Mockito.verifyNoMoreInteractions(vacationAbsenceProvider); } @Test public void ensureCallsVacationAbsenceProviderIfNotAbsentForSickDay() { sickDayAbsenceProvider.checkForAbsence(emptyTimedAbsenceSpans, testPerson, standardWorkingDay); Mockito.verify(vacationAbsenceProvider, Mockito.times(1)) .checkForAbsence(emptyTimedAbsenceSpans, testPerson, standardWorkingDay); } }