package org.synyx.urlaubsverwaltung.web.sicknote;
import org.joda.time.DateMidnight;
import org.joda.time.DateTimeConstants;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.springframework.validation.Errors;
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.SickNoteComment;
import org.synyx.urlaubsverwaltung.core.workingtime.OverlapCase;
import org.synyx.urlaubsverwaltung.core.workingtime.OverlapService;
import org.synyx.urlaubsverwaltung.core.workingtime.WorkingTimeService;
import org.synyx.urlaubsverwaltung.test.TestDataCreator;
import java.util.Optional;
/**
* Unit test for {@link SickNoteValidator}.
*
* @author Aljona Murygina - murygina@synyx.de
*/
public class SickNoteValidatorTest {
private SickNoteValidator validator;
private OverlapService overlapService;
private WorkingTimeService workingTimeService;
private SickNote sickNote;
private Errors errors;
@Before
public void setUp() throws Exception {
overlapService = Mockito.mock(OverlapService.class);
workingTimeService = Mockito.mock(WorkingTimeService.class);
validator = new SickNoteValidator(overlapService, workingTimeService);
errors = Mockito.mock(Errors.class);
Mockito.reset(errors);
sickNote = TestDataCreator.createSickNote(TestDataCreator.createPerson(),
new DateMidnight(2013, DateTimeConstants.NOVEMBER, 19),
new DateMidnight(2013, DateTimeConstants.NOVEMBER, 20), DayLength.FULL);
Mockito.when(overlapService.checkOverlap(Mockito.any(SickNote.class))).thenReturn(OverlapCase.NO_OVERLAPPING);
Mockito.when(workingTimeService.getByPersonAndValidityDateEqualsOrMinorDate(Mockito.any(Person.class),
Mockito.any(DateMidnight.class)))
.thenReturn(Optional.of(TestDataCreator.createWorkingTime()));
}
@Test
public void ensureValidDatesHaveNoErrors() {
validator.validate(sickNote, errors);
Mockito.verifyZeroInteractions(errors);
}
@Test
public void ensureDayLengthMayNotBeNull() {
sickNote.setDayLength(null);
validator.validate(sickNote, errors);
Mockito.verify(errors).rejectValue("dayLength", "error.entry.mandatory");
}
@Test
public void ensureStartDateMayNotBeNull() {
sickNote.setStartDate(null);
validator.validate(sickNote, errors);
Mockito.verify(errors).rejectValue("startDate", "error.entry.mandatory");
}
@Test
public void ensureEndDateMayNotBeNull() {
sickNote.setEndDate(null);
validator.validate(sickNote, errors);
Mockito.verify(errors).rejectValue("endDate", "error.entry.mandatory");
}
@Test
public void ensureStartDateMustBeBeforeEndDateToHaveAValidPeriod() {
sickNote.setStartDate(new DateMidnight(2013, DateTimeConstants.DECEMBER, 1));
sickNote.setEndDate(new DateMidnight(2013, DateTimeConstants.NOVEMBER, 19));
validator.validate(sickNote, errors);
Mockito.verify(errors).rejectValue("endDate", "error.entry.invalidPeriod");
}
@Test
public void ensureStartAndEndDateMustBeEqualsDatesForDayLengthNoon() {
sickNote.setDayLength(DayLength.NOON);
sickNote.setStartDate(new DateMidnight(2013, DateTimeConstants.NOVEMBER, 19));
sickNote.setEndDate(new DateMidnight(2013, DateTimeConstants.NOVEMBER, 21));
validator.validate(sickNote, errors);
Mockito.verify(errors).rejectValue("endDate", "sicknote.error.halfDayPeriod");
}
@Test
public void ensureStartAndEndDateMustBeEqualsDatesForDayLengthMorning() {
sickNote.setDayLength(DayLength.MORNING);
sickNote.setStartDate(new DateMidnight(2013, DateTimeConstants.NOVEMBER, 19));
sickNote.setEndDate(new DateMidnight(2013, DateTimeConstants.NOVEMBER, 21));
validator.validate(sickNote, errors);
Mockito.verify(errors).rejectValue("endDate", "sicknote.error.halfDayPeriod");
}
@Test
public void ensureStartDateMustBeBeforeEndDateToHaveAValidPeriodForDayLengthMorning() {
sickNote.setDayLength(DayLength.MORNING);
sickNote.setStartDate(new DateMidnight(2013, DateTimeConstants.NOVEMBER, 21));
sickNote.setEndDate(new DateMidnight(2013, DateTimeConstants.NOVEMBER, 19));
validator.validate(sickNote, errors);
Mockito.verify(errors).rejectValue("endDate", "error.entry.invalidPeriod");
}
@Test
public void ensureStartDateMustBeBeforeEndDateToHaveAValidPeriodForDayLengthNoon() {
sickNote.setDayLength(DayLength.NOON);
sickNote.setStartDate(new DateMidnight(2013, DateTimeConstants.NOVEMBER, 21));
sickNote.setEndDate(new DateMidnight(2013, DateTimeConstants.NOVEMBER, 19));
validator.validate(sickNote, errors);
Mockito.verify(errors).rejectValue("endDate", "error.entry.invalidPeriod");
}
@Test
public void ensureCommentMayNotBeNull() {
validator.validateComment(new SickNoteComment(), errors);
validator.validate(sickNote, errors);
Mockito.verify(errors).rejectValue("text", "error.entry.mandatory");
}
@Test
public void ensureTooLongCommentIsNotValid() {
SickNoteComment comment = new SickNoteComment();
comment.setText("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, "
+ "sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, "
+ "sed diam voluptua. At vero eos et accusam et justo duo dolores bla bla");
validator.validateComment(comment, errors);
validator.validate(sickNote, errors);
Mockito.verify(errors).rejectValue("text", "error.entry.tooManyChars");
}
@Test
public void ensureValidCommentHasNoErrors() {
SickNoteComment comment = new SickNoteComment();
comment.setText("I am a fluffy little comment");
validator.validateComment(comment, errors);
validator.validate(sickNote, errors);
Mockito.verifyZeroInteractions(errors);
}
@Test
public void ensureAUStartDateMustBeBeforeAUEndDateToHaveAValidPeriod() {
sickNote.setAubStartDate(new DateMidnight(2013, DateTimeConstants.NOVEMBER, 20));
sickNote.setAubEndDate(new DateMidnight(2013, DateTimeConstants.NOVEMBER, 19));
validator.validate(sickNote, errors);
Mockito.verify(errors).rejectValue("aubEndDate", "error.entry.invalidPeriod");
}
@Test
public void ensureValidAUPeriodHasNoErrors() {
sickNote.setAubStartDate(new DateMidnight(2013, DateTimeConstants.NOVEMBER, 19));
sickNote.setAubEndDate(new DateMidnight(2013, DateTimeConstants.NOVEMBER, 20));
validator.validate(sickNote, errors);
Mockito.verifyZeroInteractions(errors);
}
@Test
public void ensureAUPeriodMustBeWithinSickNotePeriod() {
sickNote.setAubStartDate(new DateMidnight(2013, DateTimeConstants.DECEMBER, 19));
sickNote.setAubEndDate(new DateMidnight(2013, DateTimeConstants.DECEMBER, 20));
validator.validate(sickNote, errors);
Mockito.verify(errors).rejectValue("aubStartDate", "sicknote.error.aubInvalidPeriod");
Mockito.verify(errors).rejectValue("aubEndDate", "sicknote.error.aubInvalidPeriod");
}
@Test
public void ensureSickNoteMustNotHaveAnyOverlapping() {
sickNote.setStartDate(new DateMidnight(2015, DateTimeConstants.MARCH, 1));
sickNote.setEndDate(new DateMidnight(2015, DateTimeConstants.MARCH, 10));
Mockito.when(overlapService.checkOverlap(Mockito.any(SickNote.class)))
.thenReturn(OverlapCase.FULLY_OVERLAPPING);
validator.validate(sickNote, errors);
Mockito.verify(errors).reject("application.error.overlap");
}
@Test
public void ensureWorkingTimeConfigurationMustExistForPeriodOfSickNote() {
DateMidnight startDate = new DateMidnight(2015, DateTimeConstants.MARCH, 1);
DateMidnight endDate = new DateMidnight(2015, DateTimeConstants.MARCH, 10);
sickNote.setStartDate(startDate);
sickNote.setEndDate(endDate);
Mockito.when(workingTimeService.getByPersonAndValidityDateEqualsOrMinorDate(Mockito.any(Person.class),
Mockito.any(DateMidnight.class)))
.thenReturn(Optional.empty());
validator.validate(sickNote, errors);
Mockito.verify(workingTimeService).getByPersonAndValidityDateEqualsOrMinorDate(sickNote.getPerson(), startDate);
Mockito.verify(errors).reject("sicknote.error.noValidWorkingTime");
}
@Test
public void ensureInvalidPeriodWithValidAUBPeriodIsNotValid() {
DateMidnight startDate = new DateMidnight(2016, DateTimeConstants.MARCH, 16);
DateMidnight endDate = new DateMidnight(2016, DateTimeConstants.MARCH, 14);
DateMidnight aubStartDate = new DateMidnight(2016, DateTimeConstants.MARCH, 14);
DateMidnight aubEndDate = new DateMidnight(2016, DateTimeConstants.MARCH, 16);
sickNote.setStartDate(startDate);
sickNote.setEndDate(endDate);
sickNote.setAubStartDate(aubStartDate);
sickNote.setAubEndDate(aubEndDate);
validator.validate(sickNote, errors);
Mockito.verify(errors).rejectValue("endDate", "error.entry.invalidPeriod");
}
@Test
public void ensureInvalidAUBPeriodWithValidPeriodIsNotValid() {
DateMidnight startDate = new DateMidnight(2016, DateTimeConstants.MARCH, 14);
DateMidnight endDate = new DateMidnight(2016, DateTimeConstants.MARCH, 16);
DateMidnight aubStartDate = new DateMidnight(2016, DateTimeConstants.MARCH, 16);
DateMidnight aubEndDate = new DateMidnight(2016, DateTimeConstants.MARCH, 14);
sickNote.setStartDate(startDate);
sickNote.setEndDate(endDate);
sickNote.setAubStartDate(aubStartDate);
sickNote.setAubEndDate(aubEndDate);
validator.validate(sickNote, errors);
Mockito.verify(errors).rejectValue("aubEndDate", "error.entry.invalidPeriod");
}
}