/projects/struts-2.2.1/src/xwork-core/src/test/java/com/opensymphony/xwork2/validator/AnnotationActionValidatorManagerTest.java
Java | 395 lines | 254 code | 86 blank | 55 comment | 1 complexity | e9ca1f218ed695e2a2bcf20ba951b078 MD5 | raw file
1/*
2 * Copyright 2002-2006,2009 The Apache Software Foundation.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package com.opensymphony.xwork2.validator;
17
18import com.opensymphony.xwork2.*;
19import com.opensymphony.xwork2.config.entities.ActionConfig;
20import com.opensymphony.xwork2.test.AnnotationDataAware2;
21import com.opensymphony.xwork2.test.AnnotationUser;
22import com.opensymphony.xwork2.test.SimpleAnnotationAction2;
23import com.opensymphony.xwork2.test.SimpleAnnotationAction3;
24import com.opensymphony.xwork2.util.FileManager;
25import com.opensymphony.xwork2.validator.validators.*;
26
27import java.util.List;
28
29import org.easymock.EasyMock;
30
31
32/**
33 * AnnotationActionValidatorManagerTest
34 *
35 * @author Rainer Hermanns
36 * @author Jason Carreira
37 * @author tm_jee ( tm_jee (at) yahoo.co.uk )
38 * Created Jun 9, 2003 11:03:01 AM
39 */
40public class AnnotationActionValidatorManagerTest extends XWorkTestCase {
41
42 protected final String alias = "annotationValidationAlias";
43
44 AnnotationActionValidatorManager annotationActionValidatorManager;
45
46 @Override protected void setUp() throws Exception {
47 super.setUp();
48 annotationActionValidatorManager = (AnnotationActionValidatorManager) container.getInstance(ActionValidatorManager.class);
49
50 ActionConfig config = new ActionConfig.Builder("", "name", "").build();
51 ActionInvocation invocation = EasyMock.createNiceMock(ActionInvocation.class);
52 ActionProxy proxy = EasyMock.createNiceMock(ActionProxy.class);
53
54 EasyMock.expect(invocation.getProxy()).andReturn(proxy).anyTimes();
55 EasyMock.expect(invocation.getAction()).andReturn(null).anyTimes();
56 EasyMock.expect(invocation.invoke()).andReturn(Action.SUCCESS).anyTimes();
57 EasyMock.expect(proxy.getMethod()).andReturn("execute").anyTimes();
58 EasyMock.expect(proxy.getConfig()).andReturn(config).anyTimes();
59
60
61 EasyMock.replay(invocation);
62 EasyMock.replay(proxy);
63
64 ActionContext.getContext().setActionInvocation(invocation);
65 }
66
67 @Override protected void tearDown() throws Exception {
68 annotationActionValidatorManager = null;
69 super.tearDown();
70 }
71
72 public void testBuildValidatorKey() {
73 String validatorKey = AnnotationActionValidatorManager.buildValidatorKey(SimpleAnnotationAction.class);
74 assertEquals(SimpleAnnotationAction.class.getName() + "/name|execute", validatorKey);
75 }
76
77 public void testBuildsValidatorsForAlias() {
78 List validatorList = annotationActionValidatorManager.getValidators(SimpleAnnotationAction.class, alias);
79
80 // 17 in the class level + 0 in the alias
81 // TODO: add alias tests
82 assertEquals(17, validatorList.size());
83 }
84
85 public void testGetValidatorsForGivenMethodNameWithoutReloading() throws ValidationException {
86 List validatorList = annotationActionValidatorManager.getValidators(SimpleAnnotationAction.class, alias, "execute");
87
88 //disable configuration reload/devmode
89 FileManager.setReloadingConfigs(false);
90
91 //17 in the class level + 0 in the alias
92 assertEquals(12, validatorList.size());
93
94 validatorList = annotationActionValidatorManager.getValidators(SimpleAnnotationAction.class, alias, "execute");
95
96 //expect same number of validators
97 assertEquals(12, validatorList.size());
98 }
99
100 public void testDefaultMessageInterpolation() {
101 // get validators
102 List validatorList = annotationActionValidatorManager.getValidators(AnnotatedTestBean.class, "beanMessageBundle");
103 assertEquals(3, validatorList.size());
104
105 try {
106 AnnotatedTestBean bean = new AnnotatedTestBean();
107 bean.setName("foo");
108 bean.setCount(99);
109
110 ValidatorContext context = new GenericValidatorContext(bean);
111 annotationActionValidatorManager.validate(bean, "beanMessageBundle", context);
112 assertTrue(context.hasErrors());
113 assertTrue(context.hasFieldErrors());
114
115 List<String> l = context.getFieldErrors().get("count");
116 assertNotNull(l);
117 assertEquals(1, l.size());
118 assertEquals("Smaller Invalid Count: 99", l.get(0));
119 } catch (ValidationException ex) {
120 ex.printStackTrace();
121 fail("Validation error: " + ex.getMessage());
122 }
123 }
124
125 public void testGetValidatorsForInterface() {
126 List validatorList = annotationActionValidatorManager.getValidators(AnnotationDataAware2.class, alias);
127
128 // 1 in interface hierarchy, 2 from parent interface (1 default + 1 context)
129 assertEquals(3, validatorList.size());
130
131 final FieldValidator dataValidator1 = (FieldValidator) validatorList.get(0);
132 assertEquals("data", dataValidator1.getFieldName());
133 assertTrue(dataValidator1 instanceof RequiredFieldValidator);
134
135 final FieldValidator dataValidator2 = (FieldValidator) validatorList.get(1);
136 assertEquals("data", dataValidator2.getFieldName());
137 assertTrue(dataValidator2 instanceof RequiredStringValidator);
138
139 final FieldValidator blingValidator = (FieldValidator) validatorList.get(2);
140 assertEquals("bling", blingValidator.getFieldName());
141 assertTrue(blingValidator instanceof RequiredStringValidator);
142 }
143
144 public void no_testGetValidatorsFromInterface() {
145 List validatorList = annotationActionValidatorManager.getValidators(SimpleAnnotationAction3.class, alias);
146
147 // 17 in the class hierarchy + 1 in the interface + 1 in interface alias
148 assertEquals(19, validatorList.size());
149
150 final FieldValidator v = (FieldValidator) validatorList.get(0);
151 assertEquals("bar", v.getFieldName());
152 assertTrue(v instanceof RequiredFieldValidator);
153
154 final FieldValidator v1 = (FieldValidator) validatorList.get(1);
155 assertEquals("bar", v1.getFieldName());
156 assertTrue(v1 instanceof IntRangeFieldValidator);
157
158 final FieldValidator vdouble = (FieldValidator) validatorList.get(2);
159 assertEquals("percentage", vdouble.getFieldName());
160 assertTrue(vdouble instanceof DoubleRangeFieldValidator);
161
162 final FieldValidator v2 = (FieldValidator) validatorList.get(3);
163 assertEquals("baz", v2.getFieldName());
164 assertTrue(v2 instanceof IntRangeFieldValidator);
165
166 final FieldValidator v3 = (FieldValidator) validatorList.get(4);
167 assertEquals("date", v3.getFieldName());
168 assertTrue(v3 instanceof DateRangeFieldValidator);
169
170 // action-level validator comes first
171 final Validator v4 = (Validator) validatorList.get(5);
172 assertTrue(v4 instanceof ExpressionValidator);
173
174 // action-level validator comes first
175 final Validator v5 = (Validator) validatorList.get(6);
176 assertTrue(v5 instanceof ExpressionValidator);
177
178 // action-level validator comes first
179 final Validator v6 = (Validator) validatorList.get(7);
180 assertTrue(v6 instanceof ExpressionValidator);
181
182 // action-level validator comes first
183 final Validator v7 = (Validator) validatorList.get(8);
184 assertTrue(v7 instanceof ExpressionValidator);
185
186 // action-level validator comes first
187 final Validator v8 = (Validator) validatorList.get(9);
188 assertTrue(v8 instanceof ExpressionValidator);
189
190 final FieldValidator v9 = (FieldValidator) validatorList.get(10);
191 assertEquals("datefield", v9.getFieldName());
192 assertTrue(v9 instanceof DateRangeFieldValidator);
193
194 final FieldValidator v10 = (FieldValidator) validatorList.get(11);
195 assertEquals("emailaddress", v10.getFieldName());
196 assertTrue(v10 instanceof EmailValidator);
197
198 final FieldValidator v11 = (FieldValidator) validatorList.get(12);
199 assertEquals("intfield", v11.getFieldName());
200 assertTrue(v11 instanceof IntRangeFieldValidator);
201
202 final FieldValidator v12 = (FieldValidator) validatorList.get(13);
203 assertEquals("customfield", v12.getFieldName());
204 assertTrue(v12 instanceof RequiredFieldValidator);
205
206 final FieldValidator v13 = (FieldValidator) validatorList.get(14);
207 assertEquals("stringisrequired", v13.getFieldName());
208 assertTrue(v13 instanceof RequiredStringValidator);
209
210 final FieldValidator v14 = (FieldValidator) validatorList.get(15);
211 assertEquals("needstringlength", v14.getFieldName());
212 assertTrue(v14 instanceof StringLengthFieldValidator);
213
214 final FieldValidator v15 = (FieldValidator) validatorList.get(16);
215 assertEquals("hreflocation", v15.getFieldName());
216 assertTrue(v15 instanceof URLValidator);
217
218 final FieldValidator v16 = (FieldValidator) validatorList.get(17);
219 assertEquals("data", v16.getFieldName());
220 assertTrue(v16 instanceof RequiredFieldValidator);
221
222 final FieldValidator v17 = (FieldValidator) validatorList.get(18);
223 assertEquals("data", v17.getFieldName());
224 assertTrue(v17 instanceof RequiredStringValidator);
225
226 }
227
228 public void testMessageInterpolation() {
229 // get validators
230 List validatorList = annotationActionValidatorManager.getValidators(AnnotatedTestBean.class, "beanMessageBundle");
231 assertEquals(3, validatorList.size());
232
233 try {
234 AnnotatedTestBean bean = new AnnotatedTestBean();
235 bean.setName("foo");
236 bean.setCount(150);
237
238 ValidatorContext context = new GenericValidatorContext(bean);
239 annotationActionValidatorManager.validate(bean, "beanMessageBundle", context);
240 assertTrue(context.hasErrors());
241 assertTrue(context.hasFieldErrors());
242
243 List<String> l = context.getFieldErrors().get("count");
244 assertNotNull(l);
245 assertEquals(1, l.size());
246 assertEquals("Count must be between 1 and 100, current value is 150.", l.get(0));
247 } catch (ValidationException ex) {
248 ex.printStackTrace();
249 fail("Validation error: " + ex.getMessage());
250 }
251 }
252
253 public void testSameAliasWithDifferentClass() {
254 List validatorList = annotationActionValidatorManager.getValidators(SimpleAnnotationAction.class, alias);
255 List validatorList2 = annotationActionValidatorManager.getValidators(SimpleAnnotationAction2.class, alias);
256 assertFalse(validatorList.size() == validatorList2.size());
257 }
258
259 public void testSameAliasWithAliasWithSlashes() {
260 List validatorList = annotationActionValidatorManager.getValidators(SimpleAction.class, "some/alias");
261 assertNotNull(validatorList);
262 assertEquals(11, validatorList.size());
263 }
264
265 public void testSkipUserMarkerActionLevelShortCircuit() {
266 // get validators
267 List validatorList = annotationActionValidatorManager.getValidators(AnnotationUser.class, null);
268 assertEquals(10, validatorList.size());
269
270 try {
271 AnnotationUser user = new AnnotationUser();
272 user.setName("Mark");
273 user.setEmail("bad_email");
274 user.setEmail2("bad_email");
275
276 ValidatorContext context = new GenericValidatorContext(user);
277 annotationActionValidatorManager.validate(user, null, context);
278 assertTrue(context.hasFieldErrors());
279
280 // check field errors
281 List<String> l = context.getFieldErrors().get("email");
282 assertNotNull(l);
283 assertEquals(1, l.size());
284 assertEquals("Not a valid e-mail.", l.get(0));
285 l = context.getFieldErrors().get("email2");
286 assertNotNull(l);
287 assertEquals(2, l.size());
288 assertEquals("Not a valid e-mail2.", l.get(0));
289 assertEquals("Email2 not from the right company.", l.get(1));
290
291 // check action errors
292 assertTrue(context.hasActionErrors());
293 l = (List<String>) context.getActionErrors();
294 assertNotNull(l);
295 assertEquals(2, l.size()); // both expression test failed see AnnotationUser-validation.xml
296 assertEquals("Email does not start with mark", l.get(0));
297 } catch (ValidationException ex) {
298 ex.printStackTrace();
299 fail("Validation error: " + ex.getMessage());
300 }
301 }
302
303 public void testSkipAllActionLevelShortCircuit2() {
304 // get validators
305 List validatorList = annotationActionValidatorManager.getValidators(AnnotationUser.class, null);
306 assertEquals(10, validatorList.size());
307
308 try {
309 AnnotationUser user = new AnnotationUser();
310 user.setName("Mark");
311 // * mark both email to starts with mark to get pass the action-level validator,
312 // so we could concentrate on testing the field-level validators (AnnotationUser-validation.xml)
313 // * make both email the same to pass the action-level validator at
314 // AnnotationUserMarker-validation.xml
315 user.setEmail("mark_bad_email_for_field_val@foo.com");
316 user.setEmail2("mark_bad_email_for_field_val@foo.com");
317
318 ValidatorContext context = new GenericValidatorContext(user);
319 annotationActionValidatorManager.validate(user, null, context);
320 assertTrue(context.hasFieldErrors());
321
322 // check field errors
323 // we have an error in this field level, email does not ends with mycompany.com
324 List l = (List) context.getFieldErrors().get("email");
325 assertNotNull(l);
326 assertEquals(1, l.size()); // because email-field-val is short-circuit
327 assertEquals("Email not from the right company.", l.get(0));
328
329
330 // check action errors
331 l = (List) context.getActionErrors();
332 assertFalse(context.hasActionErrors());
333 assertEquals(0, l.size());
334
335
336 } catch (ValidationException ex) {
337 ex.printStackTrace();
338 fail("Validation error: " + ex.getMessage());
339 }
340 }
341
342
343 public void testActionLevelShortCircuit() throws Exception {
344
345 List validatorList = annotationActionValidatorManager.getValidators(AnnotationUser.class, null);
346 assertEquals(10, validatorList.size());
347
348 AnnotationUser user = new AnnotationUser();
349 // all fields will trigger error, but sc of action-level, cause it to not appear
350 user.setName(null);
351
352 user.setEmail("rainerh(at)example.com");
353 user.setEmail("rainer_h(at)example.com");
354
355
356 ValidatorContext context = new GenericValidatorContext(user);
357 annotationActionValidatorManager.validate(user, null, context);
358
359 // check field level errors
360 // shouldn't have any because action error prevents validation of anything else
361 List l = (List) context.getFieldErrors().get("email2");
362 assertNull(l);
363
364
365 // check action errors
366 assertTrue(context.hasActionErrors());
367 l = (List) context.getActionErrors();
368 assertNotNull(l);
369 // we only get one, because AnnotationUserMarker-validation.xml action-level validator
370 // already sc it :-)
371 assertEquals(1, l.size());
372 assertEquals("Email not the same as email2", l.get(0));
373 }
374
375
376 public void testShortCircuitNoErrors() {
377 // get validators
378 List validatorList = annotationActionValidatorManager.getValidators(AnnotationUser.class, null);
379 assertEquals(10, validatorList.size());
380
381 try {
382 AnnotationUser user = new AnnotationUser();
383 user.setName("Mark");
384 user.setEmail("mark@mycompany.com");
385 user.setEmail2("mark@mycompany.com");
386
387 ValidatorContext context = new GenericValidatorContext(user);
388 annotationActionValidatorManager.validate(user, null, context);
389 assertFalse(context.hasErrors());
390 } catch (ValidationException ex) {
391 ex.printStackTrace();
392 fail("Validation error: " + ex.getMessage());
393 }
394 }
395}