View Javadoc
1   package ejava.jpa.example.validation;
2   
3   import static org.junit.Assert.*;
4   
5   import java.text.SimpleDateFormat;
6   import java.util.Calendar;
7   import java.util.Date;
8   import java.util.GregorianCalendar;
9   import java.util.Set;
10  
11  import javax.validation.ConstraintViolation;
12  import javax.validation.Validation;
13  import javax.validation.Validator;
14  import javax.validation.ValidatorFactory;
15  import javax.validation.groups.Default;
16  
17  import org.apache.commons.logging.Log;
18  import org.apache.commons.logging.LogFactory;
19  import org.junit.Test;
20  
21  /**
22   * This test provides a demonstration of predefined constraints within the 
23   * Validation API before we get to application-specific extensions.
24   */
25  public class PredefinedValidationTest {
26  	private static Log log = LogFactory.getLog(PredefinedValidationTest.class);
27  
28  	private ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
29  	private Validator val = vf.getValidator();
30  	
31  	/**
32  	 * This test demonstrates a successful validation of all criteria
33  	 */
34  	@Test
35  	public void testValid() {
36  		log.info("*** testValid ***");
37  
38  		Person p = new Person()
39  			.setFirstName("Billy Bob")
40  			.setLastName("Smith-Jones")
41  			.setBirthDate(new GregorianCalendar(1980, Calendar.JANUARY, 1).getTime())
42  			.setEmail("bbob@hotmail.com");
43  		
44  		Set<ConstraintViolation<Person>> violations = val.validate(p);
45  		
46  		log.debug("valid person=" + p);
47  		assertEquals("unexpected number of violations:" + violations, 0, violations.size());
48  	}
49  
50  	/**
51  	 * This test demonstrates the use of the NotNull constraint
52  	 */
53  	@Test
54  	public void testNotNull() {
55  		log.info("*** testNotNull ***");
56  
57  		Person p = new Person();
58  		
59  		Set<ConstraintViolation<Person>> violations = val.validate(p, POCs.class);
60  		for (ConstraintViolation<Person> v : violations) {
61  			log.info(v.getRootBeanClass() + ", " + v.getPropertyPath() + " " + v.getMessage());
62  		}
63  		
64  		log.debug("invalid null-named person=" + p);
65  		assertEquals("unexpected number of violations", 4, violations.size());
66  	}
67  	
68  	/**
69  	 * This test demonstrates the Size constraint
70  	 */
71  	@Test
72  	public void testSize() {
73  		log.info("*** testSize ***");
74  		
75  		Person p = new Person()
76  			.setFirstName("Bobbbbbbbbbbbbbbbbbbbbbbbbbbb")
77  			.setLastName("Smithhhhhhhhhhhhhhhhhhhhhhhhhh");
78  		
79  		Set<ConstraintViolation<Person>> violations = val.validate(p);
80  		for (ConstraintViolation<Person> v : violations) {
81  			log.info(v.getPropertyPath() + ":" + v.getInvalidValue() + " " + v.getMessage());
82  		}
83  		
84  		log.debug("invalid named-sized person=" + p);
85  		assertEquals("unexpected number of violations", 2, violations.size());
86  	}
87  
88  	/**
89  	 * This test demonstrates the Pattern constraint
90  	 */
91  	@Test
92  	public void testPattern() {
93  		log.info("*** testPattern ***");
94  		
95  		Person p = new Person()
96  			.setFirstName("Bob2")
97  			.setLastName("Smith")
98  			.setEmail("bob2");
99  		
100 		Set<ConstraintViolation<Person>> violations = val.validate(p);
101 		for (ConstraintViolation<Person> v : violations) {
102 			log.info(v.getPropertyPath() + ":" + v.getInvalidValue() + " " + v.getMessage());
103 		}
104 		
105 		log.debug("invalid named-sized person=" + p);
106 		assertEquals("unexpected number of violations", 3, violations.size());
107 	}
108 	
109 	/**
110 	 * This test demonstrates the predefined Past constraint for dates
111 	 */
112 	@Test
113 	public void testPast() {
114 		log.info("*** testPast ***");
115 		
116 		Person p = new Person()
117 			.setFirstName("Bob")
118 			.setLastName("Smith")
119 			.setBirthDate(new GregorianCalendar(2052, Calendar.JANUARY, 1).getTime());
120 		
121 		Set<ConstraintViolation<Person>> violations = val.validate(p, Drivers.class);
122 		for (ConstraintViolation<Person> v : violations) {
123 			String value = (v.getInvalidValue() instanceof Date) ? 
124 					new SimpleDateFormat("YYYY").format((Date)v.getInvalidValue()) : 
125 					v.getInvalidValue().toString(); 
126 			log.info(v.getPropertyPath() + ":" + value + " " + v.getMessage());			
127 		}
128 		
129 		log.debug("invalid named-sized person=" + p);
130 		assertEquals("unexpected number of violations", 3, violations.size());
131 	}
132 	
133 	/**
134 	 * This test demonstrates the use of validation groups
135 	 */
136 	@Test
137 	public void testGroups() {
138 		log.info("*** testGroups ***");
139 		
140 		Calendar seventeen = new GregorianCalendar();
141 		seventeen.add(Calendar.YEAR, -17);
142 		
143 		Person p = new Person()
144 			.setFirstName("Bob")
145 			.setLastName("Smith")
146 			.setEmail("bob.smith@gmail.com")
147 			.setBirthDate(seventeen.getTime());
148 		
149 		Set<ConstraintViolation<Person>> validPerson = val.validate(p, Default.class);
150 		Set<ConstraintViolation<Person>> validDriver = val.validate(p, Drivers.class);
151 		Set<ConstraintViolation<Person>> validPOC = val.validate(p, POCs.class);
152 		
153 		log.debug(p.toString() + ", validPerson=" + validPerson.isEmpty() +
154 				                 ", validDriver=" + validDriver.isEmpty() +
155 				                 ", validPOC=" + validPOC.isEmpty());
156 		
157 		log.debug("validPerson=" + validPerson);
158 		log.debug("validDriver=" + validDriver);
159 		log.debug("validPOC=" + validPOC);
160 		
161 		assertTrue("not validPerson", validPerson.isEmpty());
162 		assertTrue("validDriver", validDriver.isEmpty());
163 		assertFalse("not validPOC", validPOC.isEmpty());
164 	}
165 	
166 }