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.settings.FederalState;
import org.synyx.urlaubsverwaltung.core.workingtime.PublicHolidaysService;
import org.synyx.urlaubsverwaltung.core.workingtime.WorkingTimeService;
import org.synyx.urlaubsverwaltung.test.TestDataCreator;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
* @author Timo Eifler - eifler@synyx.de
*/
public class HolidayAbsenceProviderTest {
private HolidayAbsenceProvider holidayAbsenceProvider;
private SickDayAbsenceProvider sickDayAbsenceProvider;
private WorkingTimeService workingTimeService;
private PublicHolidaysService publicHolidaysService;
private TimedAbsenceSpans emptyTimedAbsenceSpans;
private Person testPerson;
private DateMidnight newYearsDay;
private DateMidnight standardWorkingDay;
@Before
public void setUp() {
emptyTimedAbsenceSpans = new TimedAbsenceSpans(new ArrayList<>());
testPerson = TestDataCreator.createPerson();
newYearsDay = new DateMidnight(2016, 1, 1);
standardWorkingDay = new DateMidnight(2016, 1, 4);
sickDayAbsenceProvider = Mockito.mock(SickDayAbsenceProvider.class);
setupWorkingTimeServiceMock();
setupHolidayServiceMock();
holidayAbsenceProvider = new HolidayAbsenceProvider(sickDayAbsenceProvider, publicHolidaysService,
workingTimeService);
}
private void setupWorkingTimeServiceMock() {
workingTimeService = Mockito.mock(WorkingTimeService.class);
Mockito.when(workingTimeService.getFederalStateForPerson(Mockito.any(Person.class),
Mockito.any(DateMidnight.class)))
.thenReturn(FederalState.BADEN_WUERTTEMBERG);
}
private void setupHolidayServiceMock() {
publicHolidaysService = Mockito.mock(PublicHolidaysService.class);
Mockito.when(publicHolidaysService.getWorkingDurationOfDate(newYearsDay, FederalState.BADEN_WUERTTEMBERG))
.thenReturn(new BigDecimal(0));
Mockito.when(publicHolidaysService.getWorkingDurationOfDate(standardWorkingDay,
FederalState.BADEN_WUERTTEMBERG))
.thenReturn(new BigDecimal(1));
}
@Test
public void ensurePersonIsNotAvailableOnHoliDays() {
TimedAbsenceSpans updatedTimedAbsenceSpans = holidayAbsenceProvider.addAbsence(emptyTimedAbsenceSpans,
testPerson, newYearsDay);
List<TimedAbsence> absencesList = updatedTimedAbsenceSpans.getAbsencesList();
Assert.assertEquals("wrong number of absences in list", 1, absencesList.size());
Assert.assertEquals("wrong absence type", TimedAbsence.Type.HOLIDAY, 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() {
holidayAbsenceProvider.checkForAbsence(emptyTimedAbsenceSpans, testPerson, newYearsDay);
Mockito.verifyNoMoreInteractions(sickDayAbsenceProvider);
}
@Test
public void ensureCallsSickDayAbsenceProviderIfNotAbsentForHoliday() {
holidayAbsenceProvider.checkForAbsence(emptyTimedAbsenceSpans, testPerson, standardWorkingDay);
Mockito.verify(sickDayAbsenceProvider, Mockito.times(1))
.checkForAbsence(emptyTimedAbsenceSpans, testPerson, standardWorkingDay);
}
}