/projects/struts-2.2.1/src/xwork-core/src/test/java/com/opensymphony/xwork2/validator/DefaultActionValidatorManagerTest.java
Java | 349 lines | 115 code | 20 blank | 214 comment | 0 complexity | ad3a5f2e58dc3a3cd9a5d0e185d3c81d MD5 | raw file
1/*
2 * Copyright 2002-2003,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.mockobjects.dynamic.C;
19import com.mockobjects.dynamic.Mock;
20import com.opensymphony.xwork2.*;
21import com.opensymphony.xwork2.config.ConfigurationException;
22import com.opensymphony.xwork2.test.DataAware2;
23import com.opensymphony.xwork2.test.SimpleAction2;
24import com.opensymphony.xwork2.test.SimpleAction3;
25import com.opensymphony.xwork2.util.ValueStack;
26import junit.framework.TestCase;
27
28import java.util.ArrayList;
29import java.util.HashMap;
30import java.util.List;
31
32
33/**
34 * DefaultActionValidatorManagerTest
35 *
36 * @author Jason Carreira
37 * @author tm_jee
38 * @version $Date: 2009-12-27 19:18:29 +0100 (Sun, 27 Dec 2009) $ $Id: DefaultActionValidatorManagerTest.java 894090 2009-12-27 18:18:29Z martinc $
39 */
40public class DefaultActionValidatorManagerTest extends TestCase {
41
42 protected final String alias = "validationAlias";
43
44 DefaultActionValidatorManager actionValidatorManager;
45 Mock mockValidatorFileParser;
46 Mock mockValidatorFactory;
47 ValueStack stubValueStack;
48
49 @Override
50 protected void setUp() throws Exception {
51 actionValidatorManager = new DefaultActionValidatorManager();
52 super.setUp();
53 mockValidatorFileParser = new Mock(ValidatorFileParser.class);
54 actionValidatorManager.setValidatorFileParser((ValidatorFileParser)mockValidatorFileParser.proxy());
55
56 mockValidatorFactory = new Mock(ValidatorFactory.class);
57 actionValidatorManager.setValidatorFactory((ValidatorFactory)mockValidatorFactory.proxy());
58
59 stubValueStack = new StubValueStack();
60 ActionContext.setContext(new ActionContext(new HashMap<String, Object>()));
61 ActionContext.getContext().setValueStack(stubValueStack);
62
63 }
64
65 @Override
66 protected void tearDown() throws Exception {
67 actionValidatorManager = null;
68 super.tearDown();
69 mockValidatorFactory = null;
70 mockValidatorFileParser = null;
71 }
72
73
74 public void testBuildValidatorKey() {
75 String validatorKey = DefaultActionValidatorManager.buildValidatorKey(SimpleAction.class, alias);
76 assertEquals(SimpleAction.class.getName() + "/" + alias, validatorKey);
77 }
78
79 public void testBuildsValidatorsForAlias() {
80 mockValidatorFileParser.expectAndReturn("parseActionValidatorConfigs",
81 C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/SimpleAction-validation.xml")),
82 new ArrayList());
83 mockValidatorFileParser.expectAndReturn("parseActionValidatorConfigs",
84 C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/SimpleAction-validationAlias-validation.xml")),
85 new ArrayList());
86 actionValidatorManager.getValidators(SimpleAction.class, alias);
87 mockValidatorFileParser.verify();
88 }
89
90 public void testBuildsValidatorsForAliasError() {
91 boolean pass = false;
92 try {
93 mockValidatorFileParser.expectAndReturn("parseActionValidatorConfigs",
94 C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/TestBean-validation.xml")),
95 new ArrayList());
96 mockValidatorFileParser.expectAndThrow("parseActionValidatorConfigs",
97 C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/TestBean-badtest-validation.xml")),
98 new ConfigurationException());
99 List validatorList = actionValidatorManager.getValidators(TestBean.class, "badtest");
100 } catch (XWorkException ex) {
101 pass = true;
102 }
103 mockValidatorFileParser.verify();
104 assertTrue("Didn't throw exception on load failure", pass);
105 }
106
107
108 public void testGetValidatorsForInterface() {
109 mockValidatorFileParser.expectAndReturn("parseActionValidatorConfigs",
110 C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/test/DataAware-validation.xml")),
111 new ArrayList());
112 mockValidatorFileParser.expectAndReturn("parseActionValidatorConfigs",
113 C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/test/DataAware-validationAlias-validation.xml")),
114 new ArrayList());
115 mockValidatorFileParser.expectAndReturn("parseActionValidatorConfigs",
116 C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/test/DataAware2-validation.xml")),
117 new ArrayList());
118 actionValidatorManager.getValidators(DataAware2.class, alias);
119 mockValidatorFileParser.verify();
120 }
121
122 public void testGetValidatorsFromInterface() {
123 mockValidatorFileParser.expectAndReturn("parseActionValidatorConfigs",
124 C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/SimpleAction-validation.xml")),
125 new ArrayList());
126 mockValidatorFileParser.expectAndReturn("parseActionValidatorConfigs",
127 C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/SimpleAction-validationAlias-validation.xml")),
128 new ArrayList());
129 mockValidatorFileParser.expectAndReturn("parseActionValidatorConfigs",
130 C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/test/DataAware-validation.xml")),
131 new ArrayList());
132 mockValidatorFileParser.expectAndReturn("parseActionValidatorConfigs",
133 C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/test/DataAware-validationAlias-validation.xml")),
134 new ArrayList());
135 actionValidatorManager.getValidators(SimpleAction3.class, alias);
136 mockValidatorFileParser.verify();
137 }
138
139 public void testSameAliasWithDifferentClass() {
140 mockValidatorFileParser.expectAndReturn("parseActionValidatorConfigs",
141 C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/SimpleAction-validation.xml")),
142 new ArrayList());
143 mockValidatorFileParser.expectAndReturn("parseActionValidatorConfigs",
144 C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/SimpleAction-validationAlias-validation.xml")),
145 new ArrayList());
146 mockValidatorFileParser.expectAndReturn("parseActionValidatorConfigs",
147 C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/test/SimpleAction2-validation.xml")),
148 new ArrayList());
149 mockValidatorFileParser.expectAndReturn("parseActionValidatorConfigs",
150 C.args(C.IS_NOT_NULL, C.IS_NOT_NULL, C.eq("com/opensymphony/xwork2/test/SimpleAction2-validationAlias-validation.xml")),
151 new ArrayList());
152 actionValidatorManager.getValidators(SimpleAction.class, alias);
153 actionValidatorManager.getValidators(SimpleAction2.class, alias);
154 mockValidatorFileParser.verify();
155 }
156
157 /*
158 // TODO: this all need to be converted to real unit tests
159
160 public void testSkipUserMarkerActionLevelShortCircuit() {
161 // get validators
162 List validatorList = actionValidatorManager.getValidators(User.class, null);
163 assertEquals(10, validatorList.size());
164
165 try {
166 User user = new User();
167 user.setName("Mark");
168 user.setEmail("bad_email");
169 user.setEmail2("bad_email");
170
171 ValidatorContext context = new GenericValidatorContext(user);
172 actionValidatorManager.validate(user, null, context);
173 assertTrue(context.hasFieldErrors());
174
175 // check field errors
176 List l = (List) context.getFieldErrors().get("email");
177 assertNotNull(l);
178 assertEquals(1, l.size());
179 assertEquals("Not a valid e-mail.", l.get(0));
180 l = (List) context.getFieldErrors().get("email2");
181 assertNotNull(l);
182 assertEquals(2, l.size());
183 assertEquals("Not a valid e-mail2.", l.get(0));
184 assertEquals("Email2 not from the right company.", l.get(1));
185
186 // check action errors
187 assertTrue(context.hasActionErrors());
188 l = (List) context.getActionErrors();
189 assertNotNull(l);
190 assertEquals(2, l.size()); // both expression test failed see User-validation.xml
191 assertEquals("Email does not start with mark", l.get(0));
192 } catch (ValidationException ex) {
193 ex.printStackTrace();
194 fail("Validation error: " + ex.getMessage());
195 }
196 }
197
198 public void testSkipAllActionLevelShortCircuit2() {
199 // get validators
200 List validatorList = actionValidatorManager.getValidators(User.class, null);
201 assertEquals(10, validatorList.size());
202
203 try {
204 User user = new User();
205 user.setName("Mark");
206 // * mark both email to starts with mark to get pass the action-level validator,
207 // so we could concentrate on testing the field-level validators (User-validation.xml)
208 // * make both email the same to pass the action-level validator at
209 // UserMarker-validation.xml
210 user.setEmail("mark_bad_email_for_field_val@foo.com");
211 user.setEmail2("mark_bad_email_for_field_val@foo.com");
212
213 ValidatorContext context = new GenericValidatorContext(user);
214 actionValidatorManager.validate(user, null, context);
215 assertTrue(context.hasFieldErrors());
216
217 // check field errors
218 // we have an error in this field level, email does not ends with mycompany.com
219 List l = (List) context.getFieldErrors().get("email");
220 assertNotNull(l);
221 assertEquals(1, l.size()); // because email-field-val is short-circuit
222 assertEquals("Email not from the right company.", l.get(0));
223
224
225 // check action errors
226 l = (List) context.getActionErrors();
227 assertFalse(context.hasActionErrors());
228 assertEquals(0, l.size());
229
230
231 } catch (ValidationException ex) {
232 ex.printStackTrace();
233 fail("Validation error: " + ex.getMessage());
234 }
235 }
236
237
238 public void testActionLevelShortCircuit() throws Exception {
239
240 List validatorList = actionValidatorManager.getValidators(User.class, null);
241 assertEquals(10, validatorList.size());
242
243 User user = new User();
244 // all fields will trigger error, but sc of action-level, cause it to not appear
245 user.setName(null);
246 user.setEmail("tmjee(at)yahoo.co.uk");
247 user.setEmail("tm_jee(at)yahoo.co.uk");
248
249 ValidatorContext context = new GenericValidatorContext(user);
250 actionValidatorManager.validate(user, null, context);
251
252 // check field level errors
253 // shouldn't have any because action error prevents validation of anything else
254 List l = (List) context.getFieldErrors().get("email2");
255 assertNull(l);
256
257
258 // check action errors
259 assertTrue(context.hasActionErrors());
260 l = (List) context.getActionErrors();
261 assertNotNull(l);
262 // we only get one, because UserMarker-validation.xml action-level validator
263 // already sc it :-)
264 assertEquals(1, l.size());
265 assertEquals("Email not the same as email2", l.get(0));
266 }
267
268
269 public void testShortCircuitNoErrors() {
270 // get validators
271 List validatorList = actionValidatorManager.getValidators(User.class, null);
272 assertEquals(10, validatorList.size());
273
274 try {
275 User user = new User();
276 user.setName("Mark");
277 user.setEmail("mark@mycompany.com");
278 user.setEmail2("mark@mycompany.com");
279
280 ValidatorContext context = new GenericValidatorContext(user);
281 actionValidatorManager.validate(user, null, context);
282 assertFalse(context.hasErrors());
283 } catch (ValidationException ex) {
284 ex.printStackTrace();
285 fail("Validation error: " + ex.getMessage());
286 }
287 }
288
289 public void testFieldErrorsOrder() throws Exception {
290 ValidationOrderAction action = new ValidationOrderAction();
291 actionValidatorManager.validate(action, "actionContext");
292 Map fieldErrors = action.getFieldErrors();
293 Iterator i = fieldErrors.entrySet().iterator();
294
295 assertNotNull(fieldErrors);
296 assertEquals(fieldErrors.size(), 12);
297
298
299 Map.Entry e = (Map.Entry) i.next();
300 assertEquals(e.getKey(), "username");
301 assertEquals(((List)e.getValue()).get(0), "username required");
302
303 e = (Map.Entry) i.next();
304 assertEquals(e.getKey(), "password");
305 assertEquals(((List)e.getValue()).get(0), "password required");
306
307 e = (Map.Entry) i.next();
308 assertEquals(e.getKey(), "confirmPassword");
309 assertEquals(((List)e.getValue()).get(0), "confirm password required");
310
311 e = (Map.Entry) i.next();
312 assertEquals(e.getKey(), "firstName");
313 assertEquals(((List)e.getValue()).get(0), "first name required");
314
315 e = (Map.Entry) i.next();
316 assertEquals(e.getKey(), "lastName");
317 assertEquals(((List)e.getValue()).get(0), "last name required");
318
319 e = (Map.Entry) i.next();
320 assertEquals(e.getKey(), "city");
321 assertEquals(((List)e.getValue()).get(0), "city is required");
322
323 e = (Map.Entry) i.next();
324 assertEquals(e.getKey(), "province");
325 assertEquals(((List)e.getValue()).get(0), "province is required");
326
327 e = (Map.Entry) i.next();
328 assertEquals(e.getKey(), "country");
329 assertEquals(((List)e.getValue()).get(0), "country is required");
330
331 e = (Map.Entry) i.next();
332 assertEquals(e.getKey(), "postalCode");
333 assertEquals(((List)e.getValue()).get(0), "postal code is required");
334
335 e = (Map.Entry) i.next();
336 assertEquals(e.getKey(), "email");
337 assertEquals(((List)e.getValue()).get(0), "email is required");
338
339 e = (Map.Entry) i.next();
340 assertEquals(e.getKey(), "website");
341 assertEquals(((List)e.getValue()).get(0), "website is required");
342
343 e = (Map.Entry) i.next();
344 assertEquals(e.getKey(), "passwordHint");
345 assertEquals(((List)e.getValue()).get(0), "password hint is required");
346
347 }
348 */
349}