package javango.contrib.hibernate.tests;
import java.util.HashMap;
import java.util.Map;
import javango.contrib.hibernate.HibernateFormHelper;
import javango.contrib.hibernate.HibernateModule;
import javango.contrib.hibernate.HibernateUtil;
import javango.contrib.hibernate.ModelForm;
import javango.contrib.hibernate.ValidatedForm;
import javango.db.Managers;
import javango.forms.Form;
import javango.forms.fields.CharField;
import javango.forms.fields.EmailField;
import javango.forms.fields.Field;
import javango.forms.fields.FieldFactory;
import javango.forms.fields.LongField;
import javango.forms.fields.annotations.FieldProperties;
import junit.framework.TestCase;
import javax.persistence.*;
import org.hibernate.validator.*;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
public class TestHibernateValidator extends TestCase {
@Entity
@Table(name="contact_us")
public static class ContactBean {
@Id @GeneratedValue
@Column(name = "id")
private Long id;
@Column
@Length(max = 20)
private String subject;
@Column
private String message;
@Column
private String sender;
@Column
@Range(min=4, max=10,message="value must be between 4 and 10")
private Long value;
@Column
private Boolean ccMyself;
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getSender() {
return sender;
}
public void setSender(String sender) {
this.sender = sender;
}
public Long getValue() {
return value;
}
public void setValue(Long value) {
this.value = value;
}
public Boolean getCcMyself() {
return ccMyself;
}
public void setCcMyself(Boolean ccMyself) {
this.ccMyself = ccMyself;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
public static class ContactForm extends ModelForm {
@Length(max=20)
public EmailField sender;
public LongField value;
public ContactForm(FieldFactory fieldFactory, HibernateUtil hibernateUtil, Managers managers) {
super(fieldFactory, hibernateUtil, managers);
setModel(ContactBean.class);
}
}
Injector injector;
FieldFactory fieldFactory;
HibernateUtil hibernateUtil;
Managers managers;
@Override
protected void setUp() throws Exception {
super.setUp();
injector = Guice.createInjector(new HibernateModule());
this.fieldFactory = injector.getInstance(FieldFactory.class);
this.hibernateUtil = injector.getInstance(HibernateUtil.class);
this.managers = injector.getInstance(Managers.class);
}
public void testSimpleValidation() throws Exception {
ContactBean bean = new ContactBean();
bean.setValue(new Long(100));
ClassValidator<ContactBean> v = new ClassValidator<ContactBean>(ContactBean.class);
InvalidValue[] invalids = v.getInvalidValues(bean);
InvalidValue invalid = invalids[0];
assertEquals("value must be between 4 and 10",invalid.getMessage());
invalids = v.getPotentialInvalidValues("value", new Integer(50));
invalid = invalids[0];
assertEquals("value must be between 4 and 10",invalid.getMessage());
}
public void testFormHelperValidation() throws Exception {
Map<String, String[]> m = new HashMap<String, String[]>();
m.put("value", new String[] {"200"});
m.put("id", new String[] {"100"});
m.put("message", new String[] {"100"});
m.put("subject", new String[] {"1234567890123456789012"});
m.put("sender", new String[] {"100"});
m.put("ccMyself", new String[] {"false"});
ModelForm contactForm = new ModelForm(fieldFactory, hibernateUtil, managers);
contactForm.setModel(ContactBean.class);
contactForm.bind(m);
assertFalse(HibernateFormHelper.isValid(contactForm, ContactBean.class));
Map<String, String> errors = contactForm.getErrors();
assertTrue(errors.containsKey("value"));
assertEquals("value must be between 4 and 10", errors.get("value"));
assertTrue(errors.containsKey("subject"));
assertEquals("length must be between 0 and 20", errors.get("subject"));
}
public void testValidatorInFormAndBean() throws Exception {
Map<String, String[]> m = new HashMap<String, String[]>();
m.put("value", new String[] {"200"});
m.put("id", new String[] {"100"});
m.put("message", new String[] {"100"});
m.put("subject", new String[] {"1234567890123456789012"});
m.put("sender", new String[] {"100"});
m.put("ccMyself", new String[] {"false"});
ModelForm contactForm = new ContactForm(fieldFactory, hibernateUtil, managers);
contactForm.bind(m);
assertFalse(contactForm.isValid());
Map<String, String> errors = contactForm.getErrors();
assertTrue(errors.containsKey("sender"));
m.put("sender", new String[] {"foo@example.com"});
contactForm = new ContactForm(fieldFactory, hibernateUtil, managers);
contactForm.bind(m);
assertFalse(contactForm.isValid());
errors = contactForm.getErrors();
assertTrue(errors.containsKey("value"));
assertEquals("value must be between 4 and 10", errors.get("value"));
assertTrue(errors.containsKey("subject"));
assertEquals("length must be between 0 and 20", errors.get("subject"));
m.put("sender", new String[] {"12345678901234567890foo@example.com"});
contactForm = new ContactForm(fieldFactory, hibernateUtil, managers);
contactForm.bind(m);
assertFalse(contactForm.isValid());
errors = contactForm.getErrors();
assertTrue(errors.containsKey("sender"));
assertEquals("length must be between 0 and 20", errors.get("sender"));
}
public static class RequiredTestForm extends ValidatedForm {
@Inject
public RequiredTestForm(FieldFactory fieldFactory) {
super(fieldFactory);
}
@NotEmpty
@FieldProperties(required=false)
public CharField myField;
}
public void testValidatorNotEmpty() throws Exception {
Form form = injector.getInstance(RequiredTestForm.class).bind(new HashMap<String, String[]>());
assertFalse(form.isValid());
Map<String, String>errors = form.getErrors();
assertTrue(errors.containsKey("myField"));
assertEquals("may not be null or empty", errors.get("myField"));
}
}