Package org.springmodules.validation.bean.conf.loader.annotation

Source Code of org.springmodules.validation.bean.conf.loader.annotation.AnnotationBeanValidationConfigurationLoaderIntegrationTests

/*
* Copyright 2004-2005 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.springmodules.validation.bean.conf.loader.annotation;

import java.util.ArrayList;
import java.util.Calendar;

import junit.framework.TestCase;
import org.springframework.validation.BindException;
import org.springframework.validation.Validator;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springmodules.validation.bean.BeanValidator;
import org.springmodules.validation.bean.conf.loader.annotation.handler.jpa.JpaBasicAnnotationHandler;
import org.springmodules.validation.bean.conf.loader.annotation.handler.jpa.JpaColumnAnnotationHandler;
import org.springmodules.validation.bean.conf.loader.annotation.handler.jpa.JpaManyToOneAnnotationHandler;
import org.springmodules.validation.bean.conf.loader.annotation.handler.jpa.JpaOneToOneAnnotationHandler;
import org.springmodules.validation.bean.context.ValidationContextHolder;
import org.springmodules.validation.bean.context.DefaultValidationContext;

/**
* Integration tests for {@link AnnotationBeanValidationConfigurationLoader}.
*
* @author Uri Boness
*/
public class AnnotationBeanValidationConfigurationLoaderIntegrationTests extends TestCase {

    public void test() throws Exception {

        Person person = new Person();
        person.setFirstName("a"); // invalid - must be at least 2 chars
        person.setLastName("qwertyuiopasdfghjklzx"); // invalid - too long (max 20 chars)
        person.setNickname("a"); // invalid - the PersonValidator should register a global error

        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.HOUR, -3);
        person.setBirthday(cal.getTime()); // valid - date in the past
        person.setAge(-1); // invalid - must be 0 or more
        person.setFather(null); // invalid - father cannot be null
        person.setMother(new Person()); // invalid - mother must be valid
        person.setFriends(new ArrayList<Person>()); // invalid - friends cannot be empty
        person.setHomeless(false);
        person.setAddress(new Address(null, "Amsterdam"));
        person.setNullableInteger(new Integer(3));

        AnnotationBeanValidationConfigurationLoader loader = new AnnotationBeanValidationConfigurationLoader();
        BeanValidator validator = new BeanValidator(loader);

        BindException errors = new BindException(person, "person");

        validator.validate(person, errors);

        assertTrue(errors.hasGlobalErrors());
        assertEquals(3, errors.getGlobalErrorCount());
        assertTrue(errors.hasFieldErrors());
        assertTrue(errors.hasFieldErrors("firstName"));
        assertTrue(errors.hasFieldErrors("lastName"));
        assertEquals(1, errors.getFieldErrorCount("lastName"));
        assertTrue(errors.hasFieldErrors("birthday"));
        assertEquals(1, errors.getFieldErrorCount("birthday"));
        assertEquals(1, errors.getFieldErrorCount("age"));
        assertEquals("Person.age[just.another.error.code]", errors.getFieldError("age").getCode());
        assertTrue(errors.hasFieldErrors("father"));
        assertTrue(errors.hasFieldErrors("mother.*"));
        assertTrue(errors.hasFieldErrors("friends"));
        assertTrue(errors.hasFieldErrors("address.street"));
        assertFalse(errors.hasFieldErrors("nullableString"));
        assertTrue(errors.hasFieldErrors("nullableInteger"));
        assertEquals("Address.street[not.null]", errors.getFieldError("address.street").getCode());

    }

    public void testWithContext() throws Exception {

        PersonWithContext person = new PersonWithContext();
        person.setFirstName("a"); // invalid (ctx1) - must be at least 2 chars
        person.setLastName("qwertyuiopasdfghjklzx"); // invalid (ctx1) - too long (max 20 chars)
        person.setNickname("a"); // invalid (ctx1) - the PersonValidator should register a global error

        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.HOUR, -3);
        person.setBirthday(cal.getTime()); // valid (ctx1) - date in the past
        person.setAge(-1); // invalid (ctx2) - must be 0 or more
        person.setFather(null); // invalid (ctx1) - father cannot be null
        person.setMother(new PersonWithContext()); // invalid (ctx2) - mother must be valid
        person.setFriends(new ArrayList<PersonWithContext>()); // invalid (ctx1) - friends cannot be empty
        person.setHomeless(false);
        person.setAddress(new Address(null, "Amsterdam")); // (all contexts)
        person.setNullableInteger(new Integer(3)); // invalid (ctx2) - min value is 10

        AnnotationBeanValidationConfigurationLoader loader = new AnnotationBeanValidationConfigurationLoader();
        BeanValidator validator = new BeanValidator(loader);

        BindException errors = new BindException(person, "person");

        setContext("ctx1");

        validator.validate(person, errors);

        assertTrue(errors.hasGlobalErrors());
        assertEquals(2, errors.getGlobalErrorCount());
        assertTrue(errors.hasFieldErrors());
        assertTrue(errors.hasFieldErrors("firstName"));
        assertTrue(errors.hasFieldErrors("lastName"));
        assertEquals(1, errors.getFieldErrorCount("lastName"));
        assertFalse(errors.hasFieldErrors("birthday"));
        assertEquals(0, errors.getFieldErrorCount("age"));
        assertTrue(errors.hasFieldErrors("father"));
        assertTrue(errors.hasFieldErrors("mother.*"));
        assertTrue(errors.hasFieldErrors("friends"));
        assertTrue(errors.hasFieldErrors("address.street"));
        assertFalse(errors.hasFieldErrors("nullableString"));
        assertFalse(errors.hasFieldErrors("nullableInteger"));
        assertEquals("Address.street[not.null]", errors.getFieldError("address.street").getCode());

        clearContext();

        setContext("ctx2");

        errors = new BindException(person, "person");
        validator.validate(person, errors);

        assertFalse(errors.hasGlobalErrors());
        assertTrue(errors.hasFieldErrors());
        assertFalse(errors.hasFieldErrors("firstName"));
        assertFalse(errors.hasFieldErrors("lastName"));
        assertEquals(0, errors.getFieldErrorCount("lastName"));
        assertTrue(errors.hasFieldErrors("birthday"));
        assertEquals(1, errors.getFieldErrorCount("birthday"));
        assertEquals(1, errors.getFieldErrorCount("age"));
        assertEquals("PersonWithContext.age[just.another.error.code]", errors.getFieldError("age").getCode());
        assertFalse(errors.hasFieldErrors("father"));
        assertTrue(errors.hasFieldErrors("mother.*"));
        assertFalse(errors.hasFieldErrors("friends"));
        assertTrue(errors.hasFieldErrors("address.street"));
        assertFalse(errors.hasFieldErrors("nullableString"));
        assertTrue(errors.hasFieldErrors("nullableInteger"));
        assertEquals("Address.street[not.null]", errors.getFieldError("address.street").getCode());

        clearContext();

    }

    public void testValidatorRef_WhenDeployedInApplicationContext() throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("appCtxt.xml", getClass());
        Validator validator = (Validator)context.getBean("validator");

        TeztBean1 bean = new TeztBean1();
        BindException errors = new BindException(bean, "bean");
        validator.validate(bean, errors);
        assertTrue(errors.hasErrors());
        assertTrue(errors.hasFieldErrors("name"));

        bean = new TeztBean1("test");
        errors = new BindException(bean, "bean");
        validator.validate(bean, errors);
        assertFalse(errors.hasErrors());

    }

    public void testValidatorRef_WhenNotDeployedInApplicationContext() throws Exception {

        BeanValidator validator = new BeanValidator();
        validator.setConfigurationLoader(new AnnotationBeanValidationConfigurationLoader());

        TeztBean1 bean = new TeztBean1();
        BindException errors = new BindException(bean, "bean");

        try {
            validator.validate(bean, errors);
            fail("Expecting an UnsupportedOperationException for the validator was not deployed within an application context");
        } catch (UnsupportedOperationException uso) {
            // expected
        }
    }

    public void testConditionRef_WhenDeployedInApplicationContext() throws Exception {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("appCtxt.xml", getClass());
        Validator validator = (Validator)context.getBean("validator");

        TeztBean2 bean = new TeztBean2();
        BindException errors = new BindException(bean, "bean");
        validator.validate(bean, errors);
        assertTrue(errors.hasErrors());
        assertTrue(errors.hasFieldErrors("name"));

        bean = new TeztBean2("test");
        errors = new BindException(bean, "bean");
        validator.validate(bean, errors);
        assertFalse(errors.hasErrors());

    }

    public void testConditionRef_WhenNotDeployedInApplicationContext() throws Exception {

        BeanValidator validator = new BeanValidator();
        validator.setConfigurationLoader(new AnnotationBeanValidationConfigurationLoader());

        TeztBean2 bean = new TeztBean2();
        BindException errors = new BindException(bean, "bean");

        try {
            validator.validate(bean, errors);
            fail("Expecting an UnsupportedOperationException for the validator was not deployed within an application context");
        } catch (UnsupportedOperationException uso) {
            // expected
        }
    }

    public void test_Jpa() throws Exception {

        SimpleEntity entity = new SimpleEntity();
        entity.setName(null); // invalid - cannot be null
        entity.setText("abcdefghijk"); // invalid - too long (max 10 chars)
        entity.setOneToOne(null); // invalid - cannot be null
        entity.setManyToOne(null); // invalid - cannot be null

        DefaultValidationAnnotationHandlerRegistry registry = new DefaultValidationAnnotationHandlerRegistry();
        registry.registerPropertyHandler(new JpaBasicAnnotationHandler());
        registry.registerPropertyHandler(new JpaColumnAnnotationHandler());
        registry.registerPropertyHandler(new JpaManyToOneAnnotationHandler());
        registry.registerPropertyHandler(new JpaOneToOneAnnotationHandler());

        AnnotationBeanValidationConfigurationLoader loader = new AnnotationBeanValidationConfigurationLoader();
        loader.setHandlerRegistry(registry);
        BeanValidator validator = new BeanValidator(loader);

        BindException errors = new BindException(entity, "entity");

        validator.validate(entity, errors);

        assertTrue(errors.hasFieldErrors());
        assertTrue(errors.hasFieldErrors("name"));
        assertTrue(errors.hasFieldErrors("text"));
        assertTrue(errors.hasFieldErrors("oneToOne"));
        assertTrue(errors.hasFieldErrors("manyToOne"));
        assertEquals(1, errors.getFieldErrorCount("name"));
        assertEquals(1, errors.getFieldErrorCount("text"));
        assertEquals(1, errors.getFieldErrorCount("oneToOne"));
        assertEquals(1, errors.getFieldErrorCount("manyToOne"));
        assertEquals("SimpleEntity.name[not.null]", errors.getFieldError("name").getCode());
        assertEquals("SimpleEntity.text[max.length]", errors.getFieldError("text").getCode());
        assertEquals("SimpleEntity.oneToOne[not.null]", errors.getFieldError("oneToOne").getCode());
        assertEquals("SimpleEntity.manyToOne[not.null]", errors.getFieldError("manyToOne").getCode());

    }

   
    protected void setContext(String context) {
        ValidationContextHolder.setValidationContext(new DefaultValidationContext(context));
    }

    protected void clearContext() {
        ValidationContextHolder.clearContext();
    }



}
TOP

Related Classes of org.springmodules.validation.bean.conf.loader.annotation.AnnotationBeanValidationConfigurationLoaderIntegrationTests

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.