1   /*
2    * Copyright 2004-2010 the Seasar Foundation and the Others.
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,
13   * either express or implied. See the License for the specific language
14   * governing permissions and limitations under the License.
15   */
16  
17  package org.seasar.cubby.validator;
18  
19  import static org.junit.Assert.assertEquals;
20  import static org.junit.Assert.assertFalse;
21  import static org.junit.Assert.assertTrue;
22  import static org.seasar.cubby.validator.DefaultValidationRules.DATA_CONSTRAINT;
23  import static org.seasar.cubby.validator.DefaultValidationRules.DATA_TYPE;
24  
25  import java.util.Collection;
26  import java.util.Iterator;
27  import java.util.Map;
28  
29  import org.junit.Test;
30  import org.seasar.cubby.action.ActionErrors;
31  import org.seasar.cubby.action.ActionResult;
32  import org.seasar.cubby.action.Forward;
33  import org.seasar.cubby.action.Redirect;
34  import org.seasar.cubby.validator.validators.EqualsValidator;
35  import org.seasar.cubby.validator.validators.MaxLengthValidator;
36  import org.seasar.cubby.validator.validators.NumberValidator;
37  import org.seasar.cubby.validator.validators.RangeValidator;
38  import org.seasar.cubby.validator.validators.RequiredValidator;
39  
40  public class DefaultValidationRulesTest {
41  
42  	@Test
43  	public void addAndGetRules1() throws Exception {
44  		ValidationRules rules = new DefaultValidationRules() {
45  			@Override
46  			protected void initialize() {
47  				add("name", new RequiredValidator(), new MaxLengthValidator(10));
48  			}
49  		};
50  		assertEquals(1, rules.getPhaseValidationRules(DATA_TYPE).size());
51  		assertEquals(0, rules.getPhaseValidationRules(DATA_CONSTRAINT).size());
52  	}
53  
54  	@Test
55  	public void addAndGetRules2() throws Exception {
56  		ValidationRules rules = new DefaultValidationRules() {
57  			@Override
58  			protected void initialize() {
59  				add(DATA_CONSTRAINT, new ValidationRule() {
60  					public void apply(Map<String, Object[]> params,
61  							Object form, ActionErrors errors)
62  							throws ValidationException {
63  						if ("2".equals(params.get("foo"))) {
64  							if (params.get("bar") == null
65  									|| "".equals(params.get("bar"))) {
66  								throw new ValidationException("message");
67  							}
68  						}
69  					}
70  				});
71  			}
72  		};
73  		assertEquals(0, rules.getPhaseValidationRules(DATA_TYPE).size());
74  		assertEquals(1, rules.getPhaseValidationRules(DATA_CONSTRAINT).size());
75  	}
76  
77  	@Test
78  	public void initialize() throws Exception {
79  		ValidationRules rules = new DefaultValidationRules() {
80  			public void initialize() {
81  				add("name", new RequiredValidator(), new MaxLengthValidator(10));
82  				add("age", new NumberValidator(), new RangeValidator(0, 10));
83  			}
84  		};
85  		assertEquals(2, rules.getPhaseValidationRules(DATA_TYPE).size());
86  		assertEquals(0, rules.getPhaseValidationRules(DATA_CONSTRAINT).size());
87  	}
88  
89  	@Test
90  	public void constractor1() throws Exception {
91  		ValidationRules rules = new DefaultValidationRules() {
92  			public void initialize() {
93  				add("name", new RequiredValidator(), new MaxLengthValidator(10));
94  				add("age", new NumberValidator(), new RangeValidator(0, 10));
95  			}
96  		};
97  		assertEquals(2, rules.getPhaseValidationRules(DATA_TYPE).size());
98  		assertEquals(0, rules.getPhaseValidationRules(DATA_CONSTRAINT).size());
99  
100 		Iterator<ValidationRule> iter = rules
101 				.getPhaseValidationRules(DATA_TYPE).iterator();
102 		FieldValidationRule rule = (FieldValidationRule) iter.next();
103 		assertEquals("name", rule.getFieldName());
104 		assertEquals("name", rule.getFieldNameKey());
105 		rule = (FieldValidationRule) iter.next();
106 		assertEquals("age", rule.getFieldName());
107 		assertEquals("age", rule.getFieldNameKey());
108 	}
109 
110 	@Test
111 	public void constractor2() throws Exception {
112 		ValidationRules rules = new DefaultValidationRules("userProfile.") {
113 			public void initialize() {
114 				add("name", new RequiredValidator(), new MaxLengthValidator(10));
115 				add("age", new NumberValidator(), new RangeValidator(0, 10));
116 			}
117 		};
118 		assertEquals(2, rules.getPhaseValidationRules(DATA_TYPE).size());
119 		assertEquals(0, rules.getPhaseValidationRules(DATA_CONSTRAINT).size());
120 
121 		Iterator<ValidationRule> iter = rules
122 				.getPhaseValidationRules(DATA_TYPE).iterator();
123 		FieldValidationRule rule = (FieldValidationRule) iter.next();
124 		assertEquals("name", rule.getFieldName());
125 		assertEquals("userProfile.name", rule.getFieldNameKey());
126 		rule = (FieldValidationRule) iter.next();
127 		assertEquals("age", rule.getFieldName());
128 		assertEquals("userProfile.age", rule.getFieldNameKey());
129 	}
130 
131 	@Test
132 	public void fail() {
133 		ValidationRules rules = new DefaultValidationRules("userProfile.") {
134 			public void initialize() {
135 				add("name", new RequiredValidator(), new MaxLengthValidator(10));
136 				add("age", new NumberValidator(), new RangeValidator(0, 10));
137 			}
138 		};
139 		ActionResult result = rules.fail("error.jsp");
140 		assertTrue(result instanceof Forward);
141 		Forward forward = (Forward) result;
142 		assertEquals("error.jsp", forward.getPath("UTF-8"));
143 	}
144 
145 	@Test
146 	public void failOverride() {
147 		ValidationRules rules = new DefaultValidationRules("userProfile.") {
148 			public void initialize() {
149 				add("name", new RequiredValidator(), new MaxLengthValidator(10));
150 				add("age", new NumberValidator(), new RangeValidator(0, 10));
151 			}
152 
153 			public ActionResult fail(String errorPage) {
154 				return new Redirect(errorPage);
155 			}
156 		};
157 		ActionResult result = rules.fail("error.jsp");
158 		assertTrue(result instanceof Redirect);
159 		Redirect redirect = (Redirect) result;
160 		assertEquals("error.jsp", redirect.getPath("UTF-8"));
161 	}
162 
163 	@Test
164 	public void validationPhasePriority() {
165 
166 		ValidationRules validationRules = new DefaultValidationRules() {
167 
168 			@Override
169 			protected void initialize() {
170 			}
171 
172 		};
173 
174 		Iterator<ValidationPhase> iterator = validationRules
175 				.getValidationPhases().iterator();
176 		ValidationPhase first = iterator.next();
177 		ValidationPhase second = iterator.next();
178 		assertFalse(iterator.hasNext());
179 
180 		assertEquals(DATA_TYPE, first);
181 		assertEquals(DATA_CONSTRAINT, second);
182 	}
183 
184 	@Test
185 	public void addAll() {
186 		final ValidationRules base = new DefaultValidationRules() {
187 			@Override
188 			protected void initialize() {
189 				add("param1", new RequiredValidator());
190 				add("param2", new EqualsValidator("a"));
191 				add(DATA_CONSTRAINT, new ValidationRule() {
192 
193 					public void apply(Map<String, Object[]> params,
194 							Object form, ActionErrors errors)
195 							throws ValidationException {
196 					}
197 
198 				});
199 			}
200 		};
201 
202 		final ValidationRules rules = new DefaultValidationRules() {
203 			@Override
204 			protected void initialize() {
205 				addAll(base);
206 			}
207 		};
208 
209 		Collection<ValidationRule> dataTypeRules = rules
210 				.getPhaseValidationRules(DATA_TYPE);
211 		Collection<ValidationRule> dataConstraintRules = rules
212 				.getPhaseValidationRules(DATA_CONSTRAINT);
213 
214 		assertEquals(2, dataTypeRules.size());
215 		assertEquals(1, dataConstraintRules.size());
216 	}
217 
218 }