001    package org.springframework.binding.validation.support;
002    
003    import java.text.MessageFormat;
004    import java.util.Locale;
005    
006    import junit.framework.TestCase;
007    
008    import org.hibernate.validator.AssertTrue;
009    import org.hibernate.validator.NotEmpty;
010    import org.hibernate.validator.Range;
011    import org.springframework.binding.form.ValidatingFormModel;
012    import org.springframework.binding.validation.ValidationResults;
013    import org.springframework.context.support.AbstractMessageSource;
014    import org.springframework.context.support.MessageSourceAccessor;
015    import org.springframework.context.support.StaticApplicationContext;
016    import org.springframework.richclient.application.Application;
017    import org.springframework.richclient.application.ApplicationServicesLocator;
018    import org.springframework.richclient.application.config.DefaultApplicationLifecycleAdvisor;
019    import org.springframework.richclient.application.support.DefaultApplicationServices;
020    import org.springframework.richclient.form.FormModelHelper;
021    import org.springframework.rules.Rules;
022    import org.springframework.rules.factory.Constraints;
023    import org.springframework.rules.support.DefaultRulesSource;
024    
025    /**
026     * Testcase for HibernateRulesValidator.
027     *
028     * @author ldo
029     *
030     */
031    public class HibernateValidatorTests extends TestCase {
032        private HibernateRulesValidator hibernateRulesValidator;
033    
034        private ValidatingFormModel model;
035    
036        /**
037         * Initialize test environment
038         */
039        protected void setUp() throws Exception {
040            Application.load(null);
041            StaticApplicationContext applicationContext = new StaticApplicationContext();
042            DefaultApplicationServices applicationServices = new DefaultApplicationServices(applicationContext);
043    
044            DefaultApplicationLifecycleAdvisor advisor = new DefaultApplicationLifecycleAdvisor();
045            Application app = new Application(advisor);
046            advisor.setApplication(app);
047    
048            Application.instance().setApplicationContext(applicationContext);
049            applicationServices.setApplicationContext(applicationContext);
050    
051            ApplicationServicesLocator locator = new ApplicationServicesLocator(applicationServices);
052            ApplicationServicesLocator.load(locator);
053    
054            // create dummy message source that always return an empty string
055            AbstractMessageSource source = new AbstractMessageSource() {
056                @Override
057                protected MessageFormat resolveCode(String s, Locale locale) {
058                    return new MessageFormat("");
059                }
060            };
061            MessageSourceAccessor accessor = new MessageSourceAccessor(source);
062            applicationServices.setMessageSourceAccesor(accessor);
063            applicationServices.setMessageSource(source);
064    
065            applicationContext.refresh();
066    
067            // create formmodel to test on and initialize value models
068            model = FormModelHelper.createFormModel(new ValidatingObject());
069            model.getValueModel("stringValue");
070            model.getValueModel("intValue");
071    
072        }
073    
074        private void setOnlyHibernateValidator()
075        {
076            hibernateRulesValidator = new HibernateRulesValidator(model, ValidatingObject.class);
077            model.setValidator(hibernateRulesValidator);
078            model.setValidating(true);
079        }
080    
081        private void setRulesAndHibernateValidator()
082        {
083            Rules rules = new Rules(ValidatingObject.class);
084            Constraints c = Constraints.instance();
085            rules.add(c.eq("intValue", 8));
086            rules.add(c.eq("stringValue", "valid"));
087            DefaultRulesSource source = new DefaultRulesSource();
088            source.addRules(rules);
089            RulesValidator rulesValidator = new RulesValidator(model, source);
090            hibernateRulesValidator = new HibernateRulesValidator(model, ValidatingObject.class);
091            CompositeRichValidator compositeValidator = new CompositeRichValidator(rulesValidator, hibernateRulesValidator);
092            model.setValidator(compositeValidator);
093            model.setValidating(true);
094        }
095    
096        /**
097         * Test valid object
098         */
099        public void testValid() {
100            setOnlyHibernateValidator();
101            ValidatingObject valid = new ValidatingObject();
102            valid.setStringValue("valid");
103            valid.setIntValue(8);
104            model.setFormObject(valid);
105            assertFalse(model.getValidationResults().getHasErrors());
106            assertTrue(model.getValidationResults().getMessageCount("stringValue") == 0);
107            assertTrue(model.getValidationResults().getMessageCount("intValue") == 0);
108    
109        }
110    
111        /**
112         * Test object with invalid String value (empty string on a NotEmpty property)
113         */
114        public void testInvalidString() {
115            setOnlyHibernateValidator();
116            ValidatingObject invalid = new ValidatingObject();
117            invalid.setStringValue("");
118            invalid.setIntValue(8);
119            model.setFormObject(invalid);
120            assertTrue(model.getValidationResults().getHasErrors());
121            assertTrue(model.getValidationResults().getMessageCount("stringValue") == 1);
122            assertTrue(model.getValidationResults().getMessageCount("intValue") == 0);
123        }
124    
125        /**
126         * Test object with invalid Integer value (value out of range)
127         */
128        public void testInvalidInt() {
129            setOnlyHibernateValidator();
130            ValidatingObject invalid = new ValidatingObject();
131            invalid.setStringValue("valid");
132            invalid.setIntValue(20);
133            model.setFormObject(invalid);
134            assertTrue(model.getValidationResults().getHasErrors());
135            assertTrue(model.getValidationResults().getMessageCount("stringValue") == 0);
136            assertTrue(model.getValidationResults().getMessageCount("intValue") == 1);
137        }
138    
139        public void testInvalidIntAndString() {
140            setOnlyHibernateValidator();
141            ValidatingObject invalid = new ValidatingObject();
142            invalid.setStringValue("");
143            invalid.setIntValue(20);
144            model.setFormObject(invalid);
145            assertTrue(model.getValidationResults().getHasErrors());
146            assertTrue(model.getValidationResults().getMessageCount("stringValue") == 1);
147            assertTrue(model.getValidationResults().getMessageCount("intValue") == 1);
148        }
149    
150        /**
151         * AssertTrue tests are not bound to a property, so they should not be included when
152         * not using explicit rules.
153         */
154        public void testInvalidAssertTrue() {
155            setOnlyHibernateValidator();
156            ValidatingObject invalid = new ValidatingObject();
157            invalid.setStringValue("valid");
158            invalid.setIntValue(12);
159            model.setFormObject(invalid);
160            assertFalse(model.getValidationResults().getHasErrors());
161        }
162    
163    
164        public void testRulesTriggeredNullFormObject()
165        {
166            setRulesAndHibernateValidator();
167            model.setFormObject(null);
168            model.setEnabled(true);
169            assertTrue(model.getValidationResults().getHasErrors());
170        }
171    
172        /**
173         * AssertTrue tests are not bound to a property, but can be coped with by
174         * using rules
175         */
176        public void testRulesAndHibernateValidation()
177        {
178            setRulesAndHibernateValidator();
179            ValidatingObject invalid = new ValidatingObject();
180            invalid.setStringValue("valid");
181            invalid.setIntValue(12);
182            model.setFormObject(invalid);
183            assertTrue(model.getValidationResults().getHasErrors());
184            assertEquals(0, model.getValidationResults().getMessageCount("stringValue"));
185            assertEquals(1, model.getValidationResults().getMessageCount("intValue"));
186        }
187    
188    
189    
190    }