/** * This Source Code Form is subject to the terms of the Mozilla Public License, * v. 2.0. If a copy of the MPL was not distributed with this file, You can * obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under * the terms of the Healthcare Disclaimer located at http://openmrs.org/license. * * Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS * graphic logo is a trademark of OpenMRS Inc. */ 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; /** * Tests {@link BaseAttributeTypeValidator}. */ public class BaseAttributeTypeValidatorTest extends BaseContextSensitiveTest { private CustomVisitAttributeTypeValidator validator; private VisitAttributeType attributeType; private BindException errors; @Before public void before() { validator = new CustomVisitAttributeTypeValidator(); attributeType = new VisitAttributeType(); errors = new BindException(attributeType, "attributeType"); } /** * 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.hasFieldErrors("maxOccurs")); assertThat(errors.getFieldErrors("maxOccurs").get(0).getCode(), is("AttributeType.maxOccursShouldNotBeLessThanOne")); } @Test public void validate_shouldNotAllowMaxOccursLessThanMinOccurs() { attributeType.setMinOccurs(3); attributeType.setMaxOccurs(2); validator.validate(attributeType, errors); Assert.assertTrue(errors.hasFieldErrors("maxOccurs")); assertThat(errors.getFieldErrors("maxOccurs").get(0).getCode(), is("AttributeType.maxOccursShouldNotBeLessThanMinOccurs")); } @Test public void validate_shouldRequireDatatypeClassname() { validator.validate(attributeType, errors); Assert.assertTrue(errors.hasFieldErrors("datatypeClassname")); assertThat(errors.getFieldErrors("datatypeClassname").get(0).getCode(), is("error.null")); } @Test public void shouldFailIfDatatypeConfigurationIsBlankIfDatatypeEqualsRegexValidatedText() { attributeType.setDatatypeClassname(RegexValidatedTextDatatype.class.getName()); attributeType.setDatatypeConfig(""); validator.validate(attributeType, errors); Assert.assertTrue(errors.hasFieldErrors("datatypeConfig")); assertThat(errors.getFieldErrors("datatypeConfig").get(0).getCode(), is("error.null")); } @Test public void shouldFailIfDatatypeConfigurationIsInvalidIfDatatypeEqualsRegexValidatedText() { attributeType.setDatatypeClassname(RegexValidatedTextDatatype.class.getName()); attributeType.setDatatypeConfig(null); validator.validate(attributeType, errors); 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")); } @Test public void shouldFailIfPreferredHandlerClassIsInvalid() { attributeType.setDatatypeClassname(RegexValidatedTextDatatype.class.getName()); attributeType.setDatatypeConfig("some valid config"); attributeType.setPreferredHandlerClassname("uncompatible class"); validator.validate(attributeType, errors); Assert.assertTrue(errors.hasFieldErrors("handlerConfig")); assertThat(errors.getFieldErrors("handlerConfig").get(0).getCode(), is("AttributeType.handlerConfig.invalid")); } @Test public void validate_shouldFailValidationIfFieldLengthsAreNotCorrect() { 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])); validator.validate(attributeType, errors); Assert.assertTrue(errors.hasFieldErrors("datatypeConfig")); Assert.assertTrue(errors.hasFieldErrors("handlerConfig")); } @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()); } @Test public void validate_shouldPassValidationIfAllRequiredValuesAreSet() { attributeType.setName("name"); attributeType.setMinOccurs(1); attributeType.setDatatypeClassname(RegexValidatedTextDatatype.class.getName()); attributeType.setDatatypeConfig("[a-z]+"); validator.validate(attributeType, errors); Assert.assertFalse(errors.hasErrors()); } }