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 }