Skip to content

Commit

Permalink
Merge pull request openmrs#2103 from teleivo/baseattributetypevalidat…
Browse files Browse the repository at this point in the history
…ortest

Clean and add tests to BaseAttributeTypeValidatorTest
  • Loading branch information
teleivo authored Mar 28, 2017
2 parents 83b0f68 + eb56f8c commit 3f2f4d0
Showing 1 changed file with 154 additions and 48 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,128 +9,234 @@
*/
package org.openmrs.validator;

import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.openmrs.VisitAttributeType;
import org.openmrs.customdatatype.datatype.RegexValidatedTextDatatype;
import org.openmrs.test.BaseContextSensitiveTest;
import org.springframework.validation.BindException;
import org.springframework.validation.Errors;

/**
* Tests {@link BaseAttributeTypeValidator}.
*/
public class BaseAttributeTypeValidatorTest extends BaseContextSensitiveTest {

VisitAttributeTypeValidator validator;
private CustomVisitAttributeTypeValidator validator;

VisitAttributeType attributeType;
private VisitAttributeType attributeType;

BindException errors;
private BindException errors;

@Before
public void before() {
validator = new VisitAttributeTypeValidator();
validator = new CustomVisitAttributeTypeValidator();
attributeType = new VisitAttributeType();
errors = new BindException(attributeType, "attributeType");
}

/**
* @see BaseAttributeTypeValidator#validate(Object,Errors)
* Needed so we can test the abstract {@link BaseAttributeTypeValidator} without interference of
* an existing concrete implementation like a VisitAttributeTypeValidator.
*/
private class CustomVisitAttributeTypeValidator extends BaseAttributeTypeValidator<VisitAttributeType> {

@Override
public boolean supports(Class<?> clazz) {
return clazz.equals(VisitAttributeType.class);
}
}

@Test
public void shouldFailIfGivenNull() {

validator.validate(null, errors);

Assert.assertTrue(errors.hasErrors());
Assert.assertEquals("error.general", errors.getAllErrors().get(0).getCode());
}

@Test
public void shouldFailIfNameIsNull() {

validator.validate(attributeType, errors);

Assert.assertTrue(errors.hasFieldErrors("name"));
assertThat(errors.getFieldErrors("name").get(0).getCode(), is("error.name"));
}

@Test
public void shouldFailIfNameIsEmpty() {

attributeType.setName("");

validator.validate(attributeType, errors);

Assert.assertTrue(errors.hasFieldErrors("name"));
assertThat(errors.getFieldErrors("name").get(0).getCode(), is("error.name"));
}

@Test
public void shouldFailIfNameIsOnlyWhitespaces() {

attributeType.setName(" ");

validator.validate(attributeType, errors);

Assert.assertTrue(errors.hasFieldErrors("name"));
assertThat(errors.getFieldErrors("name").get(0).getCode(), is("error.name"));
}

@Test
public void validate_shouldRequireMinOccurs() {

attributeType.setMinOccurs(null);

validator.validate(attributeType, errors);

Assert.assertTrue(errors.hasFieldErrors("minOccurs"));
assertThat(errors.getFieldErrors("minOccurs").get(0).getCode(), is("error.null"));
}

@Test
public void shouldFailIfMinOccursIsLessThanZero() {

attributeType.setMinOccurs(-1);

validator.validate(attributeType, errors);

Assert.assertTrue(errors.hasFieldErrors("minOccurs"));
assertThat(errors.getFieldErrors("minOccurs").get(0).getCode(),
is("AttributeType.minOccursShouldNotBeLessThanZero"));
}

@Test
public void validate_shouldNotAllowMaxOccursLessThan1() {

attributeType.setMaxOccurs(0);

validator.validate(attributeType, errors);
Assert.assertTrue(errors.getFieldErrors("maxOccurs").size() > 0);

Assert.assertTrue(errors.hasFieldErrors("maxOccurs"));
assertThat(errors.getFieldErrors("maxOccurs").get(0).getCode(), is("AttributeType.maxOccursShouldNotBeLessThanOne"));
}

/**
* @see BaseAttributeTypeValidator#validate(Object,Errors)
*/
@Test
public void validate_shouldNotAllowMaxOccursLessThanMinOccurs() {

attributeType.setMinOccurs(3);
attributeType.setMaxOccurs(2);

validator.validate(attributeType, errors);
Assert.assertTrue(errors.getFieldErrors("maxOccurs").size() > 0);

Assert.assertTrue(errors.hasFieldErrors("maxOccurs"));
assertThat(errors.getFieldErrors("maxOccurs").get(0).getCode(),
is("AttributeType.maxOccursShouldNotBeLessThanMinOccurs"));
}

/**
* @see BaseAttributeTypeValidator#validate(Object,Errors)
*/
@Test
public void validate_shouldRequireDatatypeClassname() {

validator.validate(attributeType, errors);
Assert.assertTrue(errors.getFieldErrors("datatypeClassname").size() > 0);

Assert.assertTrue(errors.hasFieldErrors("datatypeClassname"));
assertThat(errors.getFieldErrors("datatypeClassname").get(0).getCode(), is("error.null"));
}

/**
* @see BaseAttributeTypeValidator#validate(Object,Errors)
*/
@Test
public void validate_shouldRequireMinOccurs() {
attributeType.setMinOccurs(null);
public void shouldFailIfDatatypeConfigurationIsBlankIfDatatypeEqualsRegexValidatedText() {

attributeType.setDatatypeClassname(RegexValidatedTextDatatype.class.getName());
attributeType.setDatatypeConfig("");

validator.validate(attributeType, errors);
Assert.assertTrue(errors.getFieldErrors("minOccurs").size() > 0);

Assert.assertTrue(errors.hasFieldErrors("datatypeConfig"));
assertThat(errors.getFieldErrors("datatypeConfig").get(0).getCode(), is("error.null"));
}

/**
* @see BaseAttributeTypeValidator#validate(Object,Errors)
*/
@Test
public void validate_shouldRequireName() {
public void shouldFailIfDatatypeConfigurationIsInvalidIfDatatypeEqualsRegexValidatedText() {

attributeType.setDatatypeClassname(RegexValidatedTextDatatype.class.getName());
attributeType.setDatatypeConfig(null);

validator.validate(attributeType, errors);
Assert.assertTrue(errors.getFieldErrors("name").size() > 0);

Assert.assertTrue(errors.hasFieldErrors("datatypeConfig"));
assertThat(errors.getFieldErrors("datatypeConfig").get(0).getCode(), is("AttributeType.datatypeConfig.invalid"));
}

@Test
public void shouldFailIfPreferredHandlerClassIsOfWrongDatatype() {

attributeType.setDatatypeClassname(RegexValidatedTextDatatype.class.getName());
attributeType.setDatatypeConfig("some valid config");
attributeType.setPreferredHandlerClassname("org.openmrs.attribute.handler.DateDatatypeHandler");

validator.validate(attributeType, errors);

Assert.assertTrue(errors.hasFieldErrors("preferredHandlerClassname"));
assertThat(errors.getFieldErrors("preferredHandlerClassname").get(0).getCode(),
is("AttributeType.preferredHandlerClassname.wrongDatatype"));
}

/**
* @see BaseAttributeTypeValidator#validate(Object,Errors)
*/
@Test
public void validate_shouldRequireDatatypeConfigurationIfDatatypeEqualsRegexValidatedText() {
public void shouldFailIfPreferredHandlerClassIsInvalid() {

attributeType.setDatatypeClassname(RegexValidatedTextDatatype.class.getName());
attributeType.setDatatypeConfig("some valid config");
attributeType.setPreferredHandlerClassname("uncompatible class");

validator.validate(attributeType, errors);
Assert.assertTrue(errors.getFieldErrors("datatypeConfig").size() > 0);

Assert.assertTrue(errors.hasFieldErrors("handlerConfig"));
assertThat(errors.getFieldErrors("handlerConfig").get(0).getCode(),
is("AttributeType.handlerConfig.invalid"));
}

/**
* @see BaseAttributeTypeValidator#validate(Object,Errors)
*/
@Test
public void validate_shouldPassValidationIfAllRequiredValuesAreSet() {
public void validate_shouldFailValidationIfFieldLengthsAreNotCorrect() {

attributeType.setName("name");
attributeType.setMinOccurs(1);
attributeType.setDatatypeClassname(RegexValidatedTextDatatype.class.getName());
attributeType.setDatatypeConfig("[a-z]+");
attributeType.setDatatypeConfig(new String(new char[66000]));
attributeType.setHandlerConfig(new String(new char[66000]));

validator.validate(attributeType, errors);
Assert.assertFalse(errors.hasErrors());

Assert.assertTrue(errors.hasFieldErrors("datatypeConfig"));
Assert.assertTrue(errors.hasFieldErrors("handlerConfig"));
}

/**
* @see BaseAttributeTypeValidator#validate(Object,Errors)
*/
@Test
public void validate_shouldPassValidationIfFieldLengthsAreCorrect() {

attributeType.setName("name");
attributeType.setMinOccurs(1);
attributeType.setDatatypeClassname(RegexValidatedTextDatatype.class.getName());
attributeType.setDatatypeConfig("[a-z]+");
attributeType.setHandlerConfig("HandlerConfig");

validator.validate(attributeType, errors);

Assert.assertFalse(errors.hasErrors());
}

/**
* @see BaseAttributeTypeValidator#validate(Object,Errors)
*/
@Test
public void validate_shouldFailValidationIfFieldLengthsAreNotCorrect() {
public void validate_shouldPassValidationIfAllRequiredValuesAreSet() {

attributeType.setName("name");
attributeType.setMinOccurs(1);
attributeType.setDatatypeClassname(RegexValidatedTextDatatype.class.getName());
attributeType.setDatatypeConfig(new String(new char[66000]));
attributeType.setHandlerConfig(new String(new char[66000]));
attributeType.setDatatypeConfig("[a-z]+");

validator.validate(attributeType, errors);
Assert.assertTrue(errors.hasFieldErrors("datatypeConfig"));
Assert.assertTrue(errors.hasFieldErrors("handlerConfig"));

Assert.assertFalse(errors.hasErrors());
}
}

0 comments on commit 3f2f4d0

Please sign in to comment.