001 package org.kuali.student.r2.common.validator;
002
003 import org.junit.Before;
004 import org.junit.Test;
005 import org.kuali.student.common.test.util.ContextInfoTestUtility;
006 import org.kuali.student.r1.common.dictionary.dto.ObjectStructureDefinition;
007 import org.kuali.student.r1.common.dictionary.service.impl.DictionaryServiceImpl;
008 import org.kuali.student.r1.common.validator.ServerDateParser;
009 import org.kuali.student.r2.common.class1.search.SearchServiceDispatcherImpl;
010 import org.kuali.student.r2.common.dto.ContextInfo;
011 import org.kuali.student.r2.common.dto.ValidationResultInfo;
012 import org.kuali.student.r2.common.exceptions.*;
013 import org.kuali.student.r2.core.search.dto.*;
014 import org.kuali.student.r2.core.search.service.SearchService;
015 import org.kuali.student.r2.core.class1.type.dto.TypeInfo;
016
017 import javax.jws.WebParam;
018 import java.util.ArrayList;
019 import java.util.List;
020
021 import static org.junit.Assert.assertEquals;
022
023 public class TestValidator {
024 DefaultValidatorImpl val = null;
025 ValidatorFactory valFactory = new ValidatorFactory();
026 DictionaryServiceImpl dictionaryDelegate = new DictionaryServiceImpl(
027 "classpath:test-validator-context.xml");
028
029 @Before
030 public void init() {
031
032 val = new DefaultValidatorImpl();
033 val.setDateParser(new ServerDateParser());
034 val.setMessageService(null);
035 valFactory.setDefaultValidator(val);
036
037 }
038
039 @Test
040 public void testRequired() {
041
042 List<ValidationResultInfo> results = val.validateObject(buildTestPerson1(), getSimpleStudentObjectStructure(), ContextInfoTestUtility.getEnglishContextInfo());
043 assertEquals(results.size(), 1);
044
045 assertEquals(results.get(0).getErrorLevel(), ValidationResultInfo.ErrorLevel.ERROR);
046 assertEquals(results.get(0).getMessage(), "validation.required");
047 }
048
049 @Test
050 public void testLengthRange() {
051
052 ConstraintMockPerson p = buildTestPerson1();
053 p.setFirstName("thisisaveryveryverylo");
054
055 List<ValidationResultInfo> results = val.validateObject(p, getSimpleStudentObjectStructure(), ContextInfoTestUtility.getEnglishContextInfo());
056 assertEquals(results.size(), 2);
057
058 assertEquals(results.get(0).getErrorLevel(), ValidationResultInfo.ErrorLevel.ERROR);
059 assertEquals(results.get(0).getMessage(), "validation.lengthOutOfRange");
060 }
061
062 @Test
063 public void testMinLength() {
064
065 ConstraintMockPerson p = buildTestPerson1();
066 p.setFirstName("t");
067
068 ObjectStructureDefinition o1 = getSimpleStudentObjectStructure();
069 o1.getAttributes().get(0).setMaxLength(null);
070
071 List<ValidationResultInfo> results = val.validateObject(p, o1, ContextInfoTestUtility.getEnglishContextInfo());
072 assertEquals(results.size(), 2);
073
074 assertEquals(results.get(0).getErrorLevel(), ValidationResultInfo.ErrorLevel.ERROR);
075 assertEquals(results.get(0).getMessage(), "validation.minLengthFailed");
076 }
077
078 @Test
079 public void testMinDateValue() {
080 ConstraintMockPerson p = buildTestPerson1();
081 ServerDateParser sp = new ServerDateParser();
082 p.setDob(sp.parseDate("1960-01-01"));
083 ObjectStructureDefinition o1 = getSimpleStudentObjectStructure();
084
085 List<ValidationResultInfo> results = val.validateObject(p, o1, ContextInfoTestUtility.getEnglishContextInfo());
086 assertEquals(results.size(), 1);
087
088 assertEquals(results.get(0).getErrorLevel(), ValidationResultInfo.ErrorLevel.ERROR);
089 assertEquals(results.get(0).getMessage(), "validation.minValueFailed");
090 }
091
092 @Test
093 public void testMaxLength() {
094
095 ConstraintMockPerson p = buildTestPerson1();
096 p.setFirstName("thisisaveryveryverylo");
097
098 ObjectStructureDefinition o1 = getSimpleStudentObjectStructure();
099 o1.getAttributes().get(0).setMinLength(0);
100
101 List<ValidationResultInfo> results = val.validateObject(p, o1, ContextInfoTestUtility.getEnglishContextInfo());
102 assertEquals(results.size(), 2);
103
104 assertEquals(results.get(0).getErrorLevel(), ValidationResultInfo.ErrorLevel.ERROR);
105 assertEquals(results.get(0).getMessage(), "validation.maxLengthFailed");
106 }
107
108 @Test
109 public void testValidChars() {
110
111 ConstraintMockPerson p = buildTestPerson1();
112 p.setFirstName("in$#valid");
113
114 ObjectStructureDefinition o1 = getSimpleStudentObjectStructure();
115
116 List<ValidationResultInfo> results = val.validateObject(p, o1, ContextInfoTestUtility.getEnglishContextInfo());
117 assertEquals(results.size(), 2);
118
119 assertEquals(results.get(0).getErrorLevel(),
120 ValidationResultInfo.ErrorLevel.ERROR);
121 assertEquals(results.get(0).getMessage(), "validation.validCharsFailed");
122 }
123
124 @Test
125 public void testDoubleValueRange() {
126
127 ConstraintMockPerson p = buildTestPerson2();
128 p.setGpa(5.0);
129
130 ObjectStructureDefinition o1 = getSimpleStudentObjectStructure();
131
132 List<ValidationResultInfo> results = val.validateObject(p, o1, ContextInfoTestUtility.getEnglishContextInfo());
133 assertEquals(results.size(), 1);
134
135 assertEquals(results.get(0).getErrorLevel(), ValidationResultInfo.ErrorLevel.ERROR);
136 assertEquals(results.get(0).getMessage(), "validation.outOfRange");
137 }
138
139 @Test
140 public void testNestedCaseConstraint() {
141
142 ConstraintMockPerson p = buildTestPerson4();
143
144 ObjectStructureDefinition o1 = getStudentWithAddressObjectStructure();
145
146 List<ValidationResultInfo> results = val.validateObject(p, o1, ContextInfoTestUtility.getEnglishContextInfo());
147 assertEquals(2, results.size());
148
149 p.getAddress().get(0).setState("ACTIVE");
150 results = val.validateObject(p, o1, ContextInfoTestUtility.getEnglishContextInfo());
151
152 assertEquals(4, results.size());
153 }
154
155
156 @Test
157 public void testNestedStructures() {
158 ConstraintMockPerson p = buildTestPerson3();
159
160 ObjectStructureDefinition o = getStudentWithAddressObjectStructure();
161
162 List<ValidationResultInfo> results = val.validateObject(p, o, ContextInfoTestUtility.getEnglishContextInfo());
163 // ERROR address/0/line1 validation.required
164 // ERROR address/0/line2 validation.validCharsFailed
165 // ERROR address/0/line2 validation.requiresField
166 System.out.println(results.size() + " errors found");
167 for (ValidationResultInfo vri : results) {
168 System.out.println(vri.getErrorLevel() + " " + vri.getElement()
169 + " " + vri.getMessage());
170 }
171 assertEquals(4, results.size());
172
173 assertEquals(results.get(0).getErrorLevel(), ValidationResultInfo.ErrorLevel.ERROR);
174 assertEquals(results.get(0).getMessage(), "validation.required");
175
176 assertEquals(results.get(1).getErrorLevel(), ValidationResultInfo.ErrorLevel.ERROR);
177 assertEquals(results.get(1).getMessage(), "validation.validCharsFailed");
178
179 assertEquals(results.get(2).getErrorLevel(), ValidationResultInfo.ErrorLevel.ERROR);
180 assertEquals(results.get(2).getMessage(), "validation.requiresField");
181
182 SearchServiceDispatcherImpl searchDispatcher = new SearchServiceDispatcherImpl();
183 List<SearchService> searchServices = new ArrayList<SearchService>();
184 searchServices.add(new MockSearchService());
185 searchDispatcher.setSearchServices(searchServices);
186
187 val.setSearchDispatcher(searchDispatcher);
188 p.getAddress().get(0).setLine1("something");
189 results = val.validateObject(p, o, ContextInfoTestUtility.getEnglishContextInfo());
190 System.out.println(results.size() + " errors found");
191 for (ValidationResultInfo vri : results) {
192 System.out.println(vri.getErrorLevel() + " " + vri.getElement()
193 + " " + vri.getMessage());
194 }
195 assertEquals(3, results.size());
196
197 p.getAddress().get(0).setLine2("notrightlookupvalue");
198 results = val.validateObject(p, o, ContextInfoTestUtility.getEnglishContextInfo());
199 System.out.println(results.size() + " errors found");
200 for (ValidationResultInfo vri : results) {
201 System.out.println(vri.getErrorLevel() + " " + vri.getElement()
202 + " " + vri.getMessage());
203 }
204 assertEquals(2, results.size());
205 assertEquals(results.get(0).getErrorLevel(),
206 ValidationResultInfo.ErrorLevel.ERROR);
207 assertEquals(results.get(0).getMessage(), "validation.lookup");
208 }
209
210 public class MockSearchService implements SearchService {
211
212 @Override
213 public List<TypeInfo> getSearchTypes(@WebParam(name = "contextInfo") ContextInfo contextInfo) throws InvalidParameterException, MissingParameterException, OperationFailedException {
214 return null; //To change body of implemented methods use File | Settings | File Templates.
215 }
216
217 @Override
218 public TypeInfo getSearchType(@WebParam(name = "searchTypeKey") String searchTypeKey, @WebParam(name = "contextInfo") ContextInfo contextInfo) throws DoesNotExistException, InvalidParameterException, MissingParameterException, OperationFailedException {
219 return null; //To change body of implemented methods use File | Settings | File Templates.
220 }
221
222
223 @Override
224 public SearchResultInfo search(SearchRequestInfo searchRequestInfo, @WebParam(name = "contextInfo") ContextInfo contextInfo) throws MissingParameterException, OperationFailedException, PermissionDeniedException {
225 if (searchRequestInfo != null
226 && searchRequestInfo.getParams() != null
227 && "param1".equals(searchRequestInfo.getParams().get(0)
228 .getKey())
229 && "line2value".equals(searchRequestInfo.getParams().get(0)
230 .getValues().get(0))) {
231 SearchResultInfo result = new SearchResultInfo();
232 SearchResultRowInfo row = new SearchResultRowInfo();
233 result.getRows().add(row);
234 return result;
235 }
236 return null;
237 }
238 }
239
240 public ConstraintMockPerson buildTestPerson1() {
241 return ValidatorMockObjectGenerator.buildTestPerson1();
242 }
243
244 public ConstraintMockPerson buildTestPerson2() {
245 return ValidatorMockObjectGenerator.buildTestPerson2();
246 }
247
248 public ConstraintMockPerson buildTestPerson3() {
249 return ValidatorMockObjectGenerator.buildTestPerson3();
250 }
251
252 public ConstraintMockPerson buildTestPerson4() {
253 return ValidatorMockObjectGenerator.buildTestPerson4();
254 }
255
256 public ObjectStructureDefinition getSimpleStudentObjectStructure() {
257 return dictionaryDelegate.getObjectStructure("simpleStudent");
258 }
259
260 public ObjectStructureDefinition getStudentWithAddressObjectStructure() {
261 return dictionaryDelegate.getObjectStructure("studentWithAddress");
262 }
263 }