package org.synyx.urlaubsverwaltung.web.person;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.springframework.validation.Errors;
import org.synyx.urlaubsverwaltung.core.application.domain.Application;
import org.synyx.urlaubsverwaltung.core.person.MailNotification;
import org.synyx.urlaubsverwaltung.core.person.Person;
import org.synyx.urlaubsverwaltung.core.person.PersonService;
import org.synyx.urlaubsverwaltung.core.person.Role;
import org.synyx.urlaubsverwaltung.test.TestDataCreator;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Optional;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
/**
* @author Aljona Murygina - murygina@synyx.de
*/
public class PersonValidatorTest {
private PersonValidator validator;
private PersonService personService;
private Person person;
private Errors errors;
@Before
public void setUp() {
personService = Mockito.mock(PersonService.class);
validator = new PersonValidator(personService);
errors = Mockito.mock(Errors.class);
person = TestDataCreator.createPerson();
}
// TEST OF SUPPORTS METHOD
@Test
public void ensureSupportsOnlyPersonClass() {
boolean returnValue;
returnValue = validator.supports(null);
assertFalse(returnValue);
returnValue = validator.supports(Application.class);
assertFalse(returnValue);
returnValue = validator.supports(Person.class);
assertTrue(returnValue);
}
// VALIDATION OF NAME FIELD
@Test
public void ensureNameMustNotBeNull() {
validator.validateName(null, "nameField", errors);
Mockito.verify(errors).rejectValue("nameField", "error.entry.mandatory");
}
@Test
public void ensureNameMustNotBeEmpty() {
validator.validateName("", "nameField", errors);
Mockito.verify(errors).rejectValue("nameField", "error.entry.mandatory");
}
@Test
public void ensureNameMustNotBeTooLong() {
validator.validateName("AAAAAAAAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "nameField",
errors);
Mockito.verify(errors).rejectValue("nameField", "error.entry.tooManyChars");
}
@Test
public void ensureValidNameHasNoValidationError() {
validator.validateName("Hans-Peter", "nameField", errors);
Mockito.verifyZeroInteractions(errors);
}
// VALIDATION OF EMAIL FIELD
@Test
public void ensureEmailMustNotBeNull() {
validator.validateEmail(null, errors);
Mockito.verify(errors).rejectValue("email", "error.entry.mandatory");
}
@Test
public void ensureEmailMustNotBeEmpty() {
validator.validateEmail("", errors);
Mockito.verify(errors).rejectValue("email", "error.entry.mandatory");
}
@Test
public void ensureEmailWithoutAtIsInvalid() {
validator.validateEmail("fraulyoner(at)verwaltung.de", errors);
Mockito.verify(errors).rejectValue("email", "error.entry.mail");
}
@Test
public void ensureEmailWithMoreThanOneAtIsInvalid() {
validator.validateEmail("fraulyoner@verw@ltung.de", errors);
Mockito.verify(errors).rejectValue("email", "error.entry.mail");
}
@Test
public void ensureEmailWithAtOnInvalidPlaceIsInvalid() {
validator.validateEmail("@fraulyonerverwaltung.de", errors);
Mockito.verify(errors).rejectValue("email", "error.entry.mail");
}
@Test
public void ensureEmailWithInvalidHostNameIsInvalid() {
validator.validateEmail("fraulyoner@verwaltungde", errors);
Mockito.verify(errors).rejectValue("email", "error.entry.mail");
}
@Test
public void ensureEmailMustNotBeTooLong() {
validator.validateEmail("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@net.de", errors);
Mockito.verify(errors).rejectValue("email", "error.entry.tooManyChars");
}
@Test
public void ensureValidEmailHasNoValidationError() {
validator.validateEmail("müller@verwaltung.com.de", errors);
Mockito.verifyZeroInteractions(errors);
}
// VALIDATION OF USERNAME
@Test
public void ensureUsernameMustBeUnique() {
Mockito.when(personService.getPersonByLogin("foo")).thenReturn(Optional.of(TestDataCreator.createPerson()));
validator.validateLogin("foo", errors);
Mockito.verify(errors).rejectValue("loginName", "person.form.data.login.error");
}
@Test
public void ensureUniqueUsernameHasNoValidationError() {
Mockito.when(personService.getPersonByLogin("foo")).thenReturn(Optional.<Person>empty());
validator.validateLogin("foo", errors);
Mockito.verify(errors, Mockito.never()).rejectValue(Mockito.anyString(), Mockito.anyString());
}
// VALIDATION OF PERMISSIONS
@Test
public void ensureAtLeastOneRoleMustBeSelected() {
person.setPermissions(new ArrayList<>());
validator.validatePermissions(person, errors);
Mockito.verify(errors).rejectValue("permissions", "person.form.permissions.error.mandatory");
}
@Test
public void ensureIfSelectedInactiveAsRoleNoOtherRoleCanBeSelected() {
person.setPermissions(Arrays.asList(Role.INACTIVE, Role.USER));
validator.validatePermissions(person, errors);
Mockito.verify(errors).rejectValue("permissions", "person.form.permissions.error.inactive");
}
@Test
public void ensureSelectingOnlyInactiveRoleIsValid() {
person.setPermissions(Collections.singletonList(Role.INACTIVE));
validator.validatePermissions(person, errors);
Mockito.verifyZeroInteractions(errors);
}
@Test
public void ensureUserRoleMustBeSelectedIfUserShouldNotBeDeactivated() {
person.setPermissions(Collections.singletonList(Role.OFFICE));
validator.validatePermissions(person, errors);
Mockito.verify(errors).rejectValue("permissions", "person.form.permissions.error.user");
}
@Test
public void ensureDepartmentHeadRoleAndOfficeRoleCanNotBeSelectedBoth() {
person.setPermissions(Arrays.asList(Role.USER, Role.OFFICE, Role.DEPARTMENT_HEAD));
validator.validatePermissions(person, errors);
Mockito.verify(errors).rejectValue("permissions", "person.form.permissions.error.combination");
}
@Test
public void ensureSecondStageRoleAndOfficeRoleCanNotBeSelectedBoth() {
person.setPermissions(Arrays.asList(Role.USER, Role.OFFICE, Role.SECOND_STAGE_AUTHORITY));
validator.validatePermissions(person, errors);
Mockito.verify(errors).rejectValue("permissions", "person.form.permissions.error.combination");
}
@Test
public void ensureDepartmentHeadRoleAndBossRoleCanNotBeSelectedBoth() {
person.setPermissions(Arrays.asList(Role.USER, Role.BOSS, Role.DEPARTMENT_HEAD));
validator.validatePermissions(person, errors);
Mockito.verify(errors).rejectValue("permissions", "person.form.permissions.error.combination");
}
@Test
public void ensureSecondStageRoleAndBossRoleCanNotBeSelectedBoth() {
person.setPermissions(Arrays.asList(Role.USER, Role.BOSS, Role.SECOND_STAGE_AUTHORITY));
validator.validatePermissions(person, errors);
Mockito.verify(errors).rejectValue("permissions", "person.form.permissions.error.combination");
}
@Test
public void ensureValidBossRoleSelectionHasNoValidationError() {
person.setPermissions(Arrays.asList(Role.USER, Role.BOSS));
validator.validatePermissions(person, errors);
Mockito.verifyZeroInteractions(errors);
}
@Test
public void ensureValidOfficeRoleSelectionHasNoValidationError() {
person.setPermissions(Arrays.asList(Role.USER, Role.OFFICE));
validator.validatePermissions(person, errors);
Mockito.verifyZeroInteractions(errors);
}
@Test
public void ensureValidBossAndOfficeRoleSelectionHasNoValidationError() {
person.setPermissions(Arrays.asList(Role.USER, Role.BOSS, Role.OFFICE));
validator.validatePermissions(person, errors);
Mockito.verifyZeroInteractions(errors);
}
@Test
public void ensureSecondStageRoleAndDepartmentHeadRolesCanBeSelectedBoth() {
person.setPermissions(Arrays.asList(Role.USER, Role.DEPARTMENT_HEAD, Role.SECOND_STAGE_AUTHORITY));
validator.validatePermissions(person, errors);
Mockito.verifyZeroInteractions(errors);
}
// VALIDATION OF MAIL NOTIFICATIONS
@Test
public void ensureDepartmentHeadMailNotificationIsOnlyValidIfDepartmentHeadRoleSelected() {
person.setPermissions(Arrays.asList(Role.USER, Role.BOSS));
person.setNotifications(Arrays.asList(MailNotification.NOTIFICATION_USER,
MailNotification.NOTIFICATION_DEPARTMENT_HEAD));
validator.validateNotifications(person, errors);
Mockito.verify(errors).rejectValue("notifications", "person.form.notifications.error.combination");
}
@Test
public void ensureSecondStageMailNotificationIsOnlyValidIfSecondStageRoleSelected() {
person.setPermissions(Arrays.asList(Role.USER, Role.DEPARTMENT_HEAD));
person.setNotifications(Arrays.asList(MailNotification.NOTIFICATION_USER,
MailNotification.NOTIFICATION_SECOND_STAGE_AUTHORITY));
validator.validateNotifications(person, errors);
Mockito.verify(errors).rejectValue("notifications", "person.form.notifications.error.combination");
}
@Test
public void ensureBossMailNotificationIsOnlyValidIfBossRoleSelected() {
person.setPermissions(Arrays.asList(Role.USER));
person.setNotifications(Arrays.asList(MailNotification.NOTIFICATION_USER, MailNotification.NOTIFICATION_BOSS));
validator.validateNotifications(person, errors);
Mockito.verify(errors).rejectValue("notifications", "person.form.notifications.error.combination");
}
@Test
public void ensureOfficeMailNotificationIsOnlyValidIfOfficeRoleSelected() {
person.setPermissions(Arrays.asList(Role.USER, Role.BOSS));
person.setNotifications(Arrays.asList(MailNotification.NOTIFICATION_USER, MailNotification.NOTIFICATION_BOSS,
MailNotification.NOTIFICATION_OFFICE));
validator.validateNotifications(person, errors);
Mockito.verify(errors).rejectValue("notifications", "person.form.notifications.error.combination");
}
@Test
public void ensureValidNotificationSelectionForDepartmentHeadHasNoValidationError() {
person.setPermissions(Arrays.asList(Role.USER, Role.DEPARTMENT_HEAD));
person.setNotifications(Arrays.asList(MailNotification.NOTIFICATION_USER,
MailNotification.NOTIFICATION_DEPARTMENT_HEAD));
validator.validatePermissions(person, errors);
Mockito.verifyZeroInteractions(errors);
}
@Test
public void ensureValidNotificationSelectionForSecondStageHasNoValidationError() {
person.setPermissions(Arrays.asList(Role.USER, Role.SECOND_STAGE_AUTHORITY));
person.setNotifications(Arrays.asList(MailNotification.NOTIFICATION_USER,
MailNotification.NOTIFICATION_SECOND_STAGE_AUTHORITY));
validator.validatePermissions(person, errors);
Mockito.verifyZeroInteractions(errors);
}
@Test
public void ensureValidNotificationSelectionForBossHasNoValidationError() {
person.setPermissions(Arrays.asList(Role.USER, Role.BOSS));
person.setNotifications(Arrays.asList(MailNotification.NOTIFICATION_USER, MailNotification.NOTIFICATION_BOSS));
validator.validatePermissions(person, errors);
Mockito.verifyZeroInteractions(errors);
}
@Test
public void ensureValidNotificationSelectionForOfficeHasNoValidationError() {
person.setPermissions(Arrays.asList(Role.USER, Role.OFFICE));
person.setNotifications(Arrays.asList(MailNotification.NOTIFICATION_USER,
MailNotification.NOTIFICATION_OFFICE));
validator.validatePermissions(person, errors);
Mockito.verifyZeroInteractions(errors);
}
}