package org.synyx.urlaubsverwaltung.web.settings;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.springframework.validation.Errors;
import org.synyx.urlaubsverwaltung.core.settings.*;
/**
* @author Daniel Hammann - <hammann@synyx.de>
* @author Aljona Murygina - <murygina@synyx.de>
*/
public class SettingsValidatorTest {
private SettingsValidator settingsValidator;
@Before
public void setUp() throws Exception {
settingsValidator = new SettingsValidator();
}
// Supported class -------------------------------------------------------------------------------------------------
@Test
public void ensureSettingsClassIsSupported() throws Exception {
Assert.assertTrue("Should return true for Settings class.", settingsValidator.supports(Settings.class));
}
@Test
public void ensureOtherClassThanSettingsIsNotSupported() throws Exception {
Assert.assertFalse("Should return false for other classes than Settings.",
settingsValidator.supports(Object.class));
}
@Test(expected = IllegalArgumentException.class)
public void ensureThatValidateFailsWithOtherClassThanSettings() throws Exception {
Object o = new Object();
Errors mockError = Mockito.mock(Errors.class);
settingsValidator.validate(o, mockError);
}
// Working time settings: Public holidays --------------------------------------------------------------------------
@Test
public void ensureWorkingTimeSettingsCanNotBeNull() throws Exception {
Settings settings = new Settings();
WorkingTimeSettings workingTimeSettings = settings.getWorkingTimeSettings();
workingTimeSettings.setFederalState(null);
workingTimeSettings.setWorkingDurationForChristmasEve(null);
workingTimeSettings.setWorkingDurationForNewYearsEve(null);
workingTimeSettings.setMaximumOvertime(null);
Errors mockError = Mockito.mock(Errors.class);
settingsValidator.validate(settings, mockError);
Mockito.verify(mockError).rejectValue("workingTimeSettings.federalState", "error.entry.mandatory");
Mockito.verify(mockError)
.rejectValue("workingTimeSettings.workingDurationForChristmasEve", "error.entry.mandatory");
Mockito.verify(mockError)
.rejectValue("workingTimeSettings.workingDurationForNewYearsEve", "error.entry.mandatory");
}
// Working time settings: Overtime settings ------------------------------------------------------------------------
@Test
public void ensureOvertimeSettingsAreMandatoryIfOvertimeManagementIsActive() {
Settings settings = new Settings();
WorkingTimeSettings workingTimeSettings = settings.getWorkingTimeSettings();
workingTimeSettings.setOvertimeActive(true);
workingTimeSettings.setMaximumOvertime(null);
workingTimeSettings.setMinimumOvertime(null);
Errors mockError = Mockito.mock(Errors.class);
settingsValidator.validate(settings, mockError);
Mockito.verify(mockError).rejectValue("workingTimeSettings.maximumOvertime", "error.entry.mandatory");
Mockito.verify(mockError).rejectValue("workingTimeSettings.minimumOvertime", "error.entry.mandatory");
}
@Test
public void ensureOvertimeSettingsAreNotMandatoryIfOvertimeManagementIsInactive() {
Settings settings = new Settings();
WorkingTimeSettings workingTimeSettings = settings.getWorkingTimeSettings();
workingTimeSettings.setOvertimeActive(false);
workingTimeSettings.setMaximumOvertime(null);
workingTimeSettings.setMinimumOvertime(null);
Errors mockError = Mockito.mock(Errors.class);
settingsValidator.validate(settings, mockError);
Mockito.verifyZeroInteractions(mockError);
}
@Test
public void ensureMaximumOvertimeCanNotBeNegative() {
Settings settings = new Settings();
WorkingTimeSettings workingTimeSettings = settings.getWorkingTimeSettings();
workingTimeSettings.setOvertimeActive(true);
workingTimeSettings.setMaximumOvertime(-1);
Errors mockError = Mockito.mock(Errors.class);
settingsValidator.validate(settings, mockError);
Mockito.verify(mockError).rejectValue("workingTimeSettings.maximumOvertime", "error.entry.invalid");
}
@Test
public void ensureMinimumOvertimeCanNotBeNegative() {
Settings settings = new Settings();
WorkingTimeSettings workingTimeSettings = settings.getWorkingTimeSettings();
workingTimeSettings.setOvertimeActive(true);
workingTimeSettings.setMinimumOvertime(-1);
Errors mockError = Mockito.mock(Errors.class);
settingsValidator.validate(settings, mockError);
Mockito.verify(mockError).rejectValue("workingTimeSettings.minimumOvertime", "error.entry.invalid");
}
// Absence settings ------------------------------------------------------------------------------------------------
@Test
public void ensureAbsenceSettingsCanNotBeNull() {
Settings settings = new Settings();
AbsenceSettings absenceSettings = settings.getAbsenceSettings();
absenceSettings.setMaximumAnnualVacationDays(null);
absenceSettings.setMaximumMonthsToApplyForLeaveInAdvance(null);
absenceSettings.setMaximumSickPayDays(null);
absenceSettings.setDaysBeforeEndOfSickPayNotification(null);
absenceSettings.setDaysBeforeRemindForWaitingApplications(null);
Errors mockError = Mockito.mock(Errors.class);
settingsValidator.validate(settings, mockError);
Mockito.verify(mockError).rejectValue("absenceSettings.maximumAnnualVacationDays", "error.entry.mandatory");
Mockito.verify(mockError)
.rejectValue("absenceSettings.maximumMonthsToApplyForLeaveInAdvance", "error.entry.mandatory");
Mockito.verify(mockError).rejectValue("absenceSettings.maximumSickPayDays", "error.entry.mandatory");
Mockito.verify(mockError)
.rejectValue("absenceSettings.daysBeforeEndOfSickPayNotification", "error.entry.mandatory");
Mockito.verify(mockError)
.rejectValue("absenceSettings.daysBeforeRemindForWaitingApplications", "error.entry.mandatory");
}
@Test
public void ensureAbsenceSettingsCanNotBeNegative() {
Settings settings = new Settings();
AbsenceSettings absenceSettings = settings.getAbsenceSettings();
absenceSettings.setMaximumAnnualVacationDays(-1);
absenceSettings.setMaximumMonthsToApplyForLeaveInAdvance(-1);
absenceSettings.setMaximumSickPayDays(-1);
absenceSettings.setDaysBeforeEndOfSickPayNotification(-1);
absenceSettings.setDaysBeforeRemindForWaitingApplications(-1);
Errors mockError = Mockito.mock(Errors.class);
settingsValidator.validate(settings, mockError);
Mockito.verify(mockError).rejectValue("absenceSettings.maximumAnnualVacationDays", "error.entry.invalid");
Mockito.verify(mockError)
.rejectValue("absenceSettings.maximumMonthsToApplyForLeaveInAdvance", "error.entry.invalid");
Mockito.verify(mockError).rejectValue("absenceSettings.maximumSickPayDays", "error.entry.invalid");
Mockito.verify(mockError)
.rejectValue("absenceSettings.daysBeforeEndOfSickPayNotification", "error.entry.invalid");
Mockito.verify(mockError)
.rejectValue("absenceSettings.daysBeforeEndOfSickPayNotification", "error.entry.invalid");
}
@Test
public void ensureThatMaximumMonthsToApplyForLeaveInAdvanceNotZero() throws Exception {
Settings settings = new Settings();
settings.getAbsenceSettings().setMaximumMonthsToApplyForLeaveInAdvance(0);
Errors mockError = Mockito.mock(Errors.class);
settingsValidator.validate(settings, mockError);
Mockito.verify(mockError)
.rejectValue("absenceSettings.maximumMonthsToApplyForLeaveInAdvance", "error.entry.invalid");
}
@Test
public void ensureThatMaximumAnnualVacationDaysSmallerThanAYear() throws Exception {
Settings settings = new Settings();
settings.getAbsenceSettings().setMaximumAnnualVacationDays(367);
Errors mockError = Mockito.mock(Errors.class);
settingsValidator.validate(settings, mockError);
Mockito.verify(mockError).rejectValue("absenceSettings.maximumAnnualVacationDays", "error.entry.invalid");
}
@Test
public void ensureThatAbsenceSettingsAreSmallerOrEqualsThanMaxInt() throws Exception {
Settings settings = new Settings();
AbsenceSettings absenceSettings = settings.getAbsenceSettings();
absenceSettings.setDaysBeforeEndOfSickPayNotification(Integer.MAX_VALUE + 1);
absenceSettings.setMaximumAnnualVacationDays(Integer.MAX_VALUE + 1);
absenceSettings.setMaximumMonthsToApplyForLeaveInAdvance(Integer.MAX_VALUE + 1);
absenceSettings.setMaximumSickPayDays(Integer.MAX_VALUE + 1);
Errors mockError = Mockito.mock(Errors.class);
settingsValidator.validate(settings, mockError);
Mockito.verify(mockError)
.rejectValue("absenceSettings.daysBeforeEndOfSickPayNotification", "error.entry.invalid");
Mockito.verify(mockError).rejectValue("absenceSettings.maximumAnnualVacationDays", "error.entry.invalid");
Mockito.verify(mockError)
.rejectValue("absenceSettings.maximumMonthsToApplyForLeaveInAdvance", "error.entry.invalid");
Mockito.verify(mockError).rejectValue("absenceSettings.maximumSickPayDays", "error.entry.invalid");
}
@Test
public void ensureThatDaysBeforeEndOfSickPayNotificationIsSmallerThanMaximumSickPayDays() throws Exception {
Settings settings = new Settings();
AbsenceSettings absenceSettings = settings.getAbsenceSettings();
absenceSettings.setDaysBeforeEndOfSickPayNotification(11);
absenceSettings.setMaximumSickPayDays(10);
Errors mockError = Mockito.mock(Errors.class);
settingsValidator.validate(settings, mockError);
Mockito.verify(mockError)
.rejectValue("absenceSettings.daysBeforeEndOfSickPayNotification",
"settings.sickDays.daysBeforeEndOfSickPayNotification.error");
}
// Mail settings ---------------------------------------------------------------------------------------------------
@Test
public void ensureMailSettingsAreNotMandatoryIfDeactivated() {
Settings settings = new Settings();
MailSettings mailSettings = new MailSettings();
settings.setMailSettings(mailSettings);
mailSettings.setActive(false);
mailSettings.setHost(null);
mailSettings.setPort(null);
mailSettings.setAdministrator(null);
mailSettings.setFrom(null);
mailSettings.setBaseLinkURL(null);
Errors mockError = Mockito.mock(Errors.class);
settingsValidator.validate(settings, mockError);
Mockito.verifyZeroInteractions(mockError);
}
@Test
public void ensureMandatoryMailSettingsAreMandatoryIfActivated() {
Settings settings = new Settings();
MailSettings mailSettings = new MailSettings();
settings.setMailSettings(mailSettings);
mailSettings.setActive(true);
mailSettings.setHost(null);
mailSettings.setPort(null);
mailSettings.setAdministrator(null);
mailSettings.setFrom(null);
mailSettings.setBaseLinkURL(null);
Errors mockError = Mockito.mock(Errors.class);
settingsValidator.validate(settings, mockError);
Mockito.verify(mockError).rejectValue("mailSettings.host", "error.entry.mandatory");
Mockito.verify(mockError).rejectValue("mailSettings.port", "error.entry.mandatory");
Mockito.verify(mockError).rejectValue("mailSettings.administrator", "error.entry.mandatory");
Mockito.verify(mockError).rejectValue("mailSettings.from", "error.entry.mandatory");
Mockito.verify(mockError).rejectValue("mailSettings.baseLinkURL", "error.entry.mandatory");
}
@Test
public void ensureFromAndAdministratorMailAddressesMustBeValid() {
Settings settings = new Settings();
MailSettings mailSettings = new MailSettings();
settings.setMailSettings(mailSettings);
mailSettings.setActive(true);
mailSettings.setAdministrator("foo");
mailSettings.setFrom("bar");
Errors mockError = Mockito.mock(Errors.class);
settingsValidator.validate(settings, mockError);
Mockito.verify(mockError).rejectValue("mailSettings.administrator", "error.entry.mail");
Mockito.verify(mockError).rejectValue("mailSettings.from", "error.entry.mail");
}
@Test
public void ensureMailPortMustBeNotNegative() {
Settings settings = new Settings();
MailSettings mailSettings = new MailSettings();
settings.setMailSettings(mailSettings);
mailSettings.setActive(true);
mailSettings.setPort(-1);
Errors mockError = Mockito.mock(Errors.class);
settingsValidator.validate(settings, mockError);
Mockito.verify(mockError).rejectValue("mailSettings.port", "error.entry.invalid");
}
@Test
public void ensureMailPortMustBeGreaterThanZero() {
Settings settings = new Settings();
MailSettings mailSettings = new MailSettings();
settings.setMailSettings(mailSettings);
mailSettings.setActive(true);
mailSettings.setPort(0);
Errors mockError = Mockito.mock(Errors.class);
settingsValidator.validate(settings, mockError);
Mockito.verify(mockError).rejectValue("mailSettings.port", "error.entry.invalid");
}
// Calendar settings -----------------------------------------------------------------------------------------------
@Test
public void ensureCalendarSettingsAreMandatory() {
Settings settings = new Settings();
CalendarSettings calendarSettings = settings.getCalendarSettings();
calendarSettings.setWorkDayBeginHour(null);
calendarSettings.setWorkDayEndHour(null);
Errors mockError = Mockito.mock(Errors.class);
settingsValidator.validate(settings, mockError);
Mockito.verify(mockError).rejectValue("calendarSettings.workDayBeginHour", "error.entry.mandatory");
Mockito.verify(mockError).rejectValue("calendarSettings.workDayEndHour", "error.entry.mandatory");
}
@Test
public void ensureCalendarSettingsAreInvalidIfWorkDayBeginAndEndHoursAreSame() {
Settings settings = new Settings();
CalendarSettings calendarSettings = settings.getCalendarSettings();
calendarSettings.setWorkDayBeginHour(8);
calendarSettings.setWorkDayEndHour(8);
Errors mockError = Mockito.mock(Errors.class);
settingsValidator.validate(settings, mockError);
Mockito.verify(mockError).rejectValue("calendarSettings.workDayBeginHour", "error.entry.invalid");
Mockito.verify(mockError).rejectValue("calendarSettings.workDayEndHour", "error.entry.invalid");
}
@Test
public void ensureCalendarSettingsAreInvalidIfWorkDayBeginHourIsGreaterThanEndHour() {
Settings settings = new Settings();
CalendarSettings calendarSettings = settings.getCalendarSettings();
calendarSettings.setWorkDayBeginHour(17);
calendarSettings.setWorkDayEndHour(8);
Errors mockError = Mockito.mock(Errors.class);
settingsValidator.validate(settings, mockError);
Mockito.verify(mockError).rejectValue("calendarSettings.workDayBeginHour", "error.entry.invalid");
Mockito.verify(mockError).rejectValue("calendarSettings.workDayEndHour", "error.entry.invalid");
}
@Test
public void ensureCalendarSettingsAreInvalidIfWorkDayBeginOrEndHoursAreNegative() {
Settings settings = new Settings();
CalendarSettings calendarSettings = settings.getCalendarSettings();
calendarSettings.setWorkDayBeginHour(-1);
calendarSettings.setWorkDayEndHour(-2);
Errors mockError = Mockito.mock(Errors.class);
settingsValidator.validate(settings, mockError);
Mockito.verify(mockError).rejectValue("calendarSettings.workDayBeginHour", "error.entry.invalid");
Mockito.verify(mockError).rejectValue("calendarSettings.workDayEndHour", "error.entry.invalid");
}
@Test
public void ensureCalendarSettingsAreInvalidIfWorkDayBeginOrEndHoursAreZero() {
Settings settings = new Settings();
CalendarSettings calendarSettings = settings.getCalendarSettings();
calendarSettings.setWorkDayBeginHour(0);
calendarSettings.setWorkDayEndHour(0);
Errors mockError = Mockito.mock(Errors.class);
settingsValidator.validate(settings, mockError);
Mockito.verify(mockError).rejectValue("calendarSettings.workDayBeginHour", "error.entry.invalid");
Mockito.verify(mockError).rejectValue("calendarSettings.workDayEndHour", "error.entry.invalid");
}
@Test
public void ensureCalendarSettingsAreInvalidIfWorkDayBeginOrEndHoursAreGreaterThan24() {
Settings settings = new Settings();
CalendarSettings calendarSettings = settings.getCalendarSettings();
calendarSettings.setWorkDayBeginHour(25);
calendarSettings.setWorkDayEndHour(42);
Errors mockError = Mockito.mock(Errors.class);
settingsValidator.validate(settings, mockError);
Mockito.verify(mockError).rejectValue("calendarSettings.workDayBeginHour", "error.entry.invalid");
Mockito.verify(mockError).rejectValue("calendarSettings.workDayEndHour", "error.entry.invalid");
}
@Test
public void ensureCalendarSettingsAreValidIfValidWorkDayBeginAndEndHours() {
Settings settings = new Settings();
CalendarSettings calendarSettings = settings.getCalendarSettings();
calendarSettings.setWorkDayBeginHour(10);
calendarSettings.setWorkDayEndHour(18);
Errors mockError = Mockito.mock(Errors.class);
settingsValidator.validate(settings, mockError);
Mockito.verifyZeroInteractions(mockError);
}
// Exchange calendar settings --------------------------------------------------------------------------------------
@Test
public void ensureExchangeCalendarSettingsAreNotMandatoryIfDeactivated() {
Settings settings = new Settings();
ExchangeCalendarSettings exchangeCalendarSettings = settings.getCalendarSettings()
.getExchangeCalendarSettings();
exchangeCalendarSettings.setActive(false);
exchangeCalendarSettings.setEmail(null);
exchangeCalendarSettings.setPassword(null);
exchangeCalendarSettings.setCalendar(null);
Errors mockError = Mockito.mock(Errors.class);
settingsValidator.validate(settings, mockError);
Mockito.verifyZeroInteractions(mockError);
}
@Test
public void ensureExchangeCalendarSettingsAreMandatoryIfActivated() {
Settings settings = new Settings();
ExchangeCalendarSettings exchangeCalendarSettings = settings.getCalendarSettings()
.getExchangeCalendarSettings();
exchangeCalendarSettings.setActive(true);
exchangeCalendarSettings.setEmail(null);
exchangeCalendarSettings.setPassword(null);
exchangeCalendarSettings.setCalendar(null);
Errors mockError = Mockito.mock(Errors.class);
settingsValidator.validate(settings, mockError);
Mockito.verify(mockError)
.rejectValue("calendarSettings.exchangeCalendarSettings.email", "error.entry.mandatory");
Mockito.verify(mockError)
.rejectValue("calendarSettings.exchangeCalendarSettings.password", "error.entry.mandatory");
Mockito.verify(mockError)
.rejectValue("calendarSettings.exchangeCalendarSettings.calendar", "error.entry.mandatory");
}
@Test
public void ensureExchangeCalendarEmailMustHaveValidFormat() {
Settings settings = new Settings();
ExchangeCalendarSettings exchangeCalendarSettings = settings.getCalendarSettings()
.getExchangeCalendarSettings();
exchangeCalendarSettings.setActive(true);
exchangeCalendarSettings.setEmail("synyx");
exchangeCalendarSettings.setPassword("top-secret");
exchangeCalendarSettings.setCalendar("Urlaub");
Errors mockError = Mockito.mock(Errors.class);
settingsValidator.validate(settings, mockError);
Mockito.verify(mockError).rejectValue("calendarSettings.exchangeCalendarSettings.email", "error.entry.mail");
}
// To be continued ----------------------------------------------------------------------------------------------
}