/* * Copyright 2002-2007 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.xml; import java.util.List; import junit.framework.TestCase; import org.springframework.core.io.ClassPathResource; import org.springframework.validation.BindException; import org.springframework.validation.FieldError; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.context.ApplicationContext; import org.springmodules.validation.bean.BeanValidator; import org.springmodules.validation.bean.context.ValidationContextUtils; import org.springmodules.validation.bean.conf.BeanValidationConfiguration; import org.springmodules.validation.bean.conf.ResourceConfigurationLoadingException; import org.springmodules.validation.util.cel.ognl.OgnlConditionExpressionParser; import org.springmodules.validation.util.fel.parser.OgnlFunctionExpressionParser; import org.apache.commons.lang.ArrayUtils; /** * Tests for {@link org.springmodules.validation.bean.conf.loader.xml.DefaultXmlBeanValidationConfigurationLoader}. * * @author Uri Boness */ public class DefaultXmlBeanValidationConfigurationLoaderIntegrationTests extends TestCase { public void testLoadConfiguration() throws Exception { DefaultXmlBeanValidationConfigurationLoader loader = createLoader("Person.vld.xml"); BeanValidationConfiguration config = loader.loadConfiguration(Person.class); assertEquals(2, config.getGlobalRules().length); Person person = new Person(); person.setFirstName("Uri"); person.setLastName("Boness"); person.setAge(-1); person.setEmail("uri@b"); person.setPassword("pa"); person.setConfirmPassword("pa1"); BindException errors = new BindException(person, "person"); BeanValidator validator = new BeanValidator(loader); validator.validate(person, errors); assertEquals(2, errors.getGlobalErrorCount()); assertEquals(1, errors.getFieldErrorCount("smallInteger")); assertEquals(1, errors.getFieldErrorCount("lastName")); assertEquals("Person.lastName[validateLastNameIsLongerThanTen()]", errors.getFieldError("lastName").getCode()); } public void testValidateWithContext() throws Exception { DefaultXmlBeanValidationConfigurationLoader loader = createLoader("PersonWithContext.vld.xml"); BeanValidationConfiguration config = loader.loadConfiguration(Person.class); assertEquals(2, config.getGlobalRules().length); BeanValidator validator = new BeanValidator(loader); Person person = new Person(); person.setFirstName("Uri"); person.setLastName("Boness"); person.setAge(-1); person.setEmail("uri@b"); person.setPassword("pa"); person.setConfirmPassword("pa1"); ValidationContextUtils.setContext("ctx1"); BindException errors = new BindException(person, "person"); validator.validate(person, errors); assertEquals(1, errors.getGlobalErrorCount()); assertFalse(errors.hasFieldErrors("smallInteger")); assertEquals(1, errors.getFieldErrorCount("lastName")); ValidationContextUtils.clearContext(); ValidationContextUtils.setContext("ctx2"); errors = new BindException(person, "person"); validator.validate(person, errors); assertEquals(1, errors.getGlobalErrorCount()); assertEquals(1, errors.getFieldErrorCount("smallInteger")); assertEquals(1, errors.getFieldErrorCount("lastName")); assertEquals("Person.lastName[validateLastNameIsLongerThanTen()]", errors.getFieldError("lastName").getCode()); ValidationContextUtils.clearContext(); } public void testLoadDefaultConfiguration() throws Exception { DefaultXmlBeanValidationConfigurationLoader loader = new DefaultXmlBeanValidationConfigurationLoader(); loader.afterPropertiesSet(); BeanValidationConfiguration conf = loader.loadConfiguration(Person.class); assertNotNull(conf); } public void testValidationBean_WhenDeployedInApplicationContext() throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("appCtxt.xml", getClass()); DefaultXmlBeanValidationConfigurationLoader loader = createLoader("TestBean1.vld.xml", context); BeanValidator validator = new BeanValidator(loader); TestBean bean = new TestBean(); BindException errors = new BindException(bean, "bean"); validator.validate(bean, errors); assertTrue(errors.hasErrors()); assertTrue(errors.hasFieldErrors("name")); bean = new TestBean("name"); errors = new BindException(bean, "bean"); validator.validate(bean, errors); assertFalse(errors.hasErrors()); } public void testValidationBean_WhenNotDeployedInApplicationContext() throws Exception { try { createLoader("TestBean1.vld.xml"); fail("Expecting an UnsupportedOperationException for the configuration loader is not deployed in " + "an application context"); } catch (ResourceConfigurationLoadingException rcle) { // expected } } public void testConditionBean_WhenDeployedInApplicationContext() throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("appCtxt.xml", getClass()); DefaultXmlBeanValidationConfigurationLoader loader = createLoader("TestBean2.vld.xml", context); BeanValidator validator = new BeanValidator(loader); TestBean bean = new TestBean(); BindException errors = new BindException(bean, "bean"); validator.validate(bean, errors); assertTrue(errors.hasErrors()); assertTrue(errors.hasFieldErrors("name")); assertEquals("TestBean.name[test.bean.condition]", errors.getFieldError("name").getCode()); bean = new TestBean("name"); errors = new BindException(bean, "bean"); validator.validate(bean, errors); assertFalse(errors.hasErrors()); } public void testConditionBean_WhenNotDeployedInApplicationContext() throws Exception { try { createLoader("TestBean2.vld.xml"); fail("Expecting an UnsupportedOperationException for the configuration loader is not deployed in " + "an application context"); } catch (ResourceConfigurationLoadingException rcle) { // expected } } public void testShortCircuiteValidationDisabled() throws Exception { DefaultXmlBeanValidationConfigurationLoader loader = createLoader("TestBean3.vld.xml"); BeanValidator validator = new BeanValidator(loader); validator.setShortCircuitFieldValidation(false); TestBean bean = new TestBean(); BindException errors = new BindException(bean, "bean"); validator.validate(bean, errors); assertTrue(errors.hasErrors()); assertTrue(errors.hasFieldErrors("name")); assertEquals(2, errors.getFieldErrorCount("name")); List fieldErrors = errors.getFieldErrors("name"); assertTrue(ArrayUtils.contains(((FieldError)fieldErrors.get(0)).getCodes(), "TestBean.name[not.null]")); assertTrue(ArrayUtils.contains(((FieldError)fieldErrors.get(1)).getCodes(), "TestBean.name[not.null.2]")); } public void testShortCircuiteValidationEnabled() throws Exception { DefaultXmlBeanValidationConfigurationLoader loader = createLoader("TestBean3.vld.xml"); BeanValidator validator = new BeanValidator(loader); TestBean bean = new TestBean(); BindException errors = new BindException(bean, "bean"); validator.validate(bean, errors); assertTrue(errors.hasErrors()); assertTrue(errors.hasFieldErrors("name")); assertEquals(1, errors.getFieldErrorCount("name")); assertTrue(ArrayUtils.contains(errors.getFieldError("name").getCodes(), "TestBean.name[not.null]")); } protected DefaultXmlBeanValidationConfigurationLoader createLoader(String resource) throws Exception { return createLoader(resource, null); } protected DefaultXmlBeanValidationConfigurationLoader createLoader(String resource, ApplicationContext context) throws Exception { DefaultXmlBeanValidationConfigurationLoader loader = new DefaultXmlBeanValidationConfigurationLoader(); loader.setResource(new ClassPathResource(resource, getClass())); loader.setConditionExpressionParser(new OgnlConditionExpressionParser()); loader.setFunctionExpressionParser(new OgnlFunctionExpressionParser()); loader.setApplicationContext(context); loader.afterPropertiesSet(); return loader; } }