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 }