1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.kuali.kfs.gl.businessobject.lookup;
20
21 import java.sql.Date;
22 import java.util.ArrayList;
23 import java.util.HashMap;
24 import java.util.LinkedList;
25 import java.util.List;
26 import java.util.Map;
27
28 import org.apache.commons.lang.StringUtils;
29 import org.kuali.kfs.coa.businessobject.Account;
30 import org.kuali.kfs.gl.Constant;
31 import org.kuali.kfs.gl.businessobject.Balance;
32 import org.kuali.kfs.gl.businessobject.CurrentAccountBalance;
33 import org.kuali.kfs.gl.service.AccountBalanceService;
34 import org.kuali.kfs.sys.ConfigureContext;
35 import org.kuali.kfs.sys.KFSPropertyConstants;
36 import org.kuali.kfs.sys.ObjectUtil;
37 import org.kuali.kfs.sys.businessobject.lookup.LookupableSpringContext;
38 import org.kuali.kfs.sys.context.SpringContext;
39 import org.kuali.kfs.sys.fixture.AccountFixture;
40 import org.kuali.rice.kim.api.identity.Person;
41 import org.kuali.rice.kim.api.identity.PersonService;
42 import org.kuali.rice.kns.lookup.HtmlData.AnchorHtmlData;
43 import org.kuali.rice.krad.bo.PersistableBusinessObjectBase;
44 import org.kuali.rice.krad.datadictionary.DataDictionary;
45 import org.kuali.rice.krad.exception.ValidationException;
46 import org.kuali.rice.krad.service.BusinessObjectService;
47 import org.kuali.rice.krad.service.DataDictionaryService;
48 import org.kuali.rice.krad.util.GlobalVariables;
49 import org.kuali.rice.krad.util.ObjectUtils;
50
51 @ConfigureContext
52 public class CurrentAccountBalanceLookupableHelperServiceTest extends AbstractGeneralLedgerLookupableHelperServiceTestBase {
53
54
55 private enum ExpectException{YES, NO};
56
57
58 private static final String LOOKUP_HELPER_SERVICE_KEY = "glCurrentAccountBalanceLookupableHelperService";
59
60
61 private static final String UNIVERSITY_FISCAL_YEAR_KEY = KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR;
62 private static final String UNIVERSITY_FISCAL_PERIOD_CODE_KEY = KFSPropertyConstants.UNIVERSITY_FISCAL_PERIOD_CODE;
63 private static final String CHART_OF_ACCOUNTS_CODE_KEY = KFSPropertyConstants.ACCOUNT + "." + KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE;
64 private static final String ACCOUNT_NUMBER_KEY = KFSPropertyConstants.ACCOUNT + "." + KFSPropertyConstants.ACCOUNT_NUMBER;
65 private static final String FISCAL_OFFICER_PRINCIPAL_NAME_KEY = KFSPropertyConstants.ACCOUNT + "." + KFSPropertyConstants.ACCOUNT_FISCAL_OFFICER_USER + "." + KFSPropertyConstants.PERSON_USER_ID;
66 private static final String ACCOUNT_SUPERVISOR_PRINCIPAL_NAME_KEY = KFSPropertyConstants.ACCOUNT + "." + KFSPropertyConstants.ACCOUNT_SUPERVISORY_USER + "." + KFSPropertyConstants.PERSON_USER_ID;
67 private static final String SUB_ACCOUNT_NUMBER_KEY = KFSPropertyConstants.SUB_ACCOUNT_NUMBER;
68 private static final String ORGINIZATION_CODE_KEY = KFSPropertyConstants.ACCOUNT + "." + KFSPropertyConstants.ORGANIZATION_CODE;
69
70
71 private static final String FISCAL_OFFICER_PRINCIPAL_NAME_VAL = "mhkozlow";
72 private static final String ACCOUNT_SUPERVISOR_PRINCIPAL_NAME_VAL = "jaraujo";
73 private static final String ORGINIZATION_CODE_VAL = "PSY";
74 private static final String ACCOUNT_EXPIRATION_DATE = "2101-09-30";
75 private static final Integer UNIVERSITY_FISCAL_YEAR = 2014;
76
77
78 private AccountBalanceService accountBalanceService;
79 private PersonService personService;
80 private DataDictionary dataDictionary;
81
82
83 private Map<String, String> fullFieldToValueMap;
84 private Map<String, String> requiredFieldToValueMap;
85 private Map<String, String> semiRequiredFieldToValueMap;
86 private Map<String, String> optionalFieldToValueMap;
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101 @Override
102 protected void setUp() throws Exception {
103 super.setUp();
104 accountBalanceService = SpringContext.getBean(AccountBalanceService.class);
105 personService = SpringContext.getBean(PersonService.class);
106 dataDictionary = SpringContext.getBean(DataDictionaryService.class).getDataDictionary();
107 lookupableHelperServiceImpl = LookupableSpringContext.getLookupableHelperService(LOOKUP_HELPER_SERVICE_KEY);
108 lookupableHelperServiceImpl.setBusinessObjectClass(CurrentAccountBalance.class);
109 testDataGenerator.generateTransactionData(pendingEntry);
110 initFieldToValueMaps();
111 pendingEntry.setAccount(generateAccount());
112 }
113
114
115
116
117
118 private void initFieldToValueMaps(){
119 initRequiredFieldToValueMap();
120 initSemiRequiredFieldToValueMap();
121 initOptionalFieldToValueMap();
122 initFullFieldToValueMap();
123 }
124
125
126
127
128
129 private void initRequiredFieldToValueMap(){
130 requiredFieldToValueMap = new HashMap<String, String>();
131 requiredFieldToValueMap.put(UNIVERSITY_FISCAL_YEAR_KEY, UNIVERSITY_FISCAL_YEAR.toString());
132 requiredFieldToValueMap.put(UNIVERSITY_FISCAL_PERIOD_CODE_KEY, pendingEntry.getUniversityFiscalPeriodCode());
133 requiredFieldToValueMap.put(Constant.CONSOLIDATION_OPTION, Constant.CONSOLIDATION);
134 }
135
136
137
138
139
140 private void initSemiRequiredFieldToValueMap(){
141
142
143
144
145
146 semiRequiredFieldToValueMap = new HashMap<String, String>();
147 semiRequiredFieldToValueMap.put(ACCOUNT_NUMBER_KEY, pendingEntry.getAccountNumber());
148 semiRequiredFieldToValueMap.put(CHART_OF_ACCOUNTS_CODE_KEY, pendingEntry.getChartOfAccountsCode());
149 semiRequiredFieldToValueMap.put(FISCAL_OFFICER_PRINCIPAL_NAME_KEY, FISCAL_OFFICER_PRINCIPAL_NAME_VAL);
150 semiRequiredFieldToValueMap.put(ACCOUNT_SUPERVISOR_PRINCIPAL_NAME_KEY, ACCOUNT_SUPERVISOR_PRINCIPAL_NAME_VAL);
151 }
152
153
154
155
156
157 private void initOptionalFieldToValueMap(){
158 optionalFieldToValueMap = new HashMap<String, String>();
159 optionalFieldToValueMap.put(SUB_ACCOUNT_NUMBER_KEY, pendingEntry.getSubAccountNumber());
160
161
162
163
164
165 optionalFieldToValueMap.put(ORGINIZATION_CODE_KEY, ORGINIZATION_CODE_VAL);
166 }
167
168
169
170
171
172 private void initFullFieldToValueMap(){
173 fullFieldToValueMap = new HashMap<String, String>();
174 fullFieldToValueMap.putAll(requiredFieldToValueMap);
175 fullFieldToValueMap.putAll(semiRequiredFieldToValueMap);
176 fullFieldToValueMap.putAll(optionalFieldToValueMap);
177 }
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196 @Override
197 public void testGetInquiryUrl() {
198
199
200 pendingEntry.setSubAccountNumber(Constant.CONSOLIDATED_SUB_ACCOUNT_NUMBER);
201
202 Balance balance = new Balance(pendingEntry);
203 CurrentAccountBalance currentAccountBalance = generateCurrentAccountBalance(balance);
204
205 List<String> inquiryFieldNames = new ArrayList<String>();
206 inquiryFieldNames.add(UNIVERSITY_FISCAL_YEAR_KEY);
207 inquiryFieldNames.add(UNIVERSITY_FISCAL_PERIOD_CODE_KEY);
208 inquiryFieldNames.add(CHART_OF_ACCOUNTS_CODE_KEY);
209 inquiryFieldNames.add(ORGINIZATION_CODE_KEY);
210 inquiryFieldNames.add(FISCAL_OFFICER_PRINCIPAL_NAME_KEY);
211 inquiryFieldNames.add(SUB_ACCOUNT_NUMBER_KEY);
212
213
214 for(String fieldName : inquiryFieldNames){
215 AnchorHtmlData htmlData = (AnchorHtmlData)lookupableHelperServiceImpl.getInquiryUrl(currentAccountBalance, fieldName);
216 assertTrue("Null inquiryUrl for property: " + fieldName, ObjectUtils.isNotNull(htmlData));
217
218 String href = htmlData.getHref();
219 if(SUB_ACCOUNT_NUMBER_KEY.equals(fieldName)){
220 assertTrue("The href anchor for the property " + fieldName + "is not blank.", StringUtils.isBlank(href));
221 }else{
222 assertTrue("The href anchor for the property " + fieldName + "is blank.", StringUtils.isNotBlank(href));
223 }
224 }
225
226
227 pendingEntry.setSubAccountNumber(optionalFieldToValueMap.get(SUB_ACCOUNT_NUMBER_KEY));
228
229 }
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250 public void testValidateSearchParameters(){
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270 Map<String, String> testMap = new HashMap<String, String>();
271
272
273
274 validateMap(testMap, ExpectException.YES);
275
276
277
278 testMap.putAll(requiredFieldToValueMap);
279 validateMap(testMap, ExpectException.YES);
280
281
282
283
284
285 testMap.putAll(semiRequiredFieldToValueMap);
286 validateMap(testMap, ExpectException.NO);
287
288
289
290
291
292
293 testMap.putAll(optionalFieldToValueMap);
294 validateMap(testMap, ExpectException.NO);
295
296
297 validateMap(fullFieldToValueMap, ExpectException.NO);
298
299 }
300
301
302
303
304
305
306
307
308 private void validateMap(Map<String, String> fieldToValueMap, ExpectException shouldExpectException){
309 String message = String.format("Validation failed for search parameters: %s", fieldToValueMap.keySet());
310 try{
311 if(shouldExpectException == ExpectException.YES){
312 assertTrue(message, validateSearchParametersThrowsException(fieldToValueMap));
313 }else{
314 assertFalse(message, validateSearchParametersThrowsException(fieldToValueMap));
315 }
316 } finally {
317
318
319 GlobalVariables.getMessageMap().clearErrorMessages();
320 }
321 }
322
323
324
325
326
327
328
329 private boolean validateSearchParametersThrowsException(Map<String, String> fieldToValueMap) {
330 try{
331 lookupableHelperServiceImpl.validateSearchParameters(fieldToValueMap);
332 }catch(ValidationException e){
333 return true;
334 }
335 return false;
336 }
337
338
339
340
341
342
343
344
345
346 @Override
347 public void testGetSearchResults() throws Exception {
348
349
350 Balance balance = new Balance(pendingEntry);
351 balance.setUniversityFiscalYear(UNIVERSITY_FISCAL_YEAR);
352
353
354 CurrentAccountBalance currentAccountBalance = generateCurrentAccountBalance(balance);
355
356
357 Map<String, String> fieldValues = getLookupFieldValues(currentAccountBalance, false);
358 List searchResults = lookupableHelperServiceImpl.getSearchResults(fieldValues);
359 assertTrue(testDataGenerator.getMessageValue("noSuchRecord"), !contains(searchResults, currentAccountBalance));
360
361
362 insertNewRecord(balance);
363
364
365 fieldValues = getLookupFieldValues(currentAccountBalance, false);
366 searchResults = lookupableHelperServiceImpl.getSearchResults(fieldValues);
367 int numOfFirstResult = searchResults.size();
368 assertTrue(testDataGenerator.getMessageValue("wrongRecordSize"), searchResults.size() >= 1);
369 assertTrue(testDataGenerator.getMessageValue("failToFindRecord"), contains(searchResults, currentAccountBalance));
370
371
372 fieldValues = getLookupFieldValues(currentAccountBalance, true);
373 searchResults = lookupableHelperServiceImpl.getSearchResults(fieldValues);
374 assertTrue(testDataGenerator.getMessageValue("wrongRecordSize"), searchResults.size() >= numOfFirstResult);
375 assertTrue(testDataGenerator.getMessageValue("failToFindRecord"), contains(searchResults, currentAccountBalance));
376
377 }
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394 @Override
395 public Map<String, String> getLookupFieldValues(PersistableBusinessObjectBase businessObject, boolean isExtended) throws Exception{
396 if(isExtended){
397 return fullFieldToValueMap;
398 }else{
399
400 Map<String, String> results = new HashMap<String, String>();
401 results.putAll(requiredFieldToValueMap);
402 results.put(ACCOUNT_NUMBER_KEY, semiRequiredFieldToValueMap.get(ACCOUNT_NUMBER_KEY));
403 return results;
404 }
405 }
406
407
408
409
410
411 private CurrentAccountBalance generateCurrentAccountBalance(Balance balance){
412 CurrentAccountBalance currentAccountBalance = new CurrentAccountBalance();
413 ObjectUtil.buildObject(currentAccountBalance, balance);
414 currentAccountBalance.setUniversityFiscalYear(UNIVERSITY_FISCAL_YEAR);
415 currentAccountBalance.setAccount(generateAccount());
416 currentAccountBalance.setUniversityFiscalPeriodCode(requiredFieldToValueMap.get(UNIVERSITY_FISCAL_PERIOD_CODE_KEY));
417 return currentAccountBalance;
418 }
419
420
421
422
423
424
425 private Account generateAccount(){
426 Account account = AccountFixture.ACCOUNT_PRESENCE_ACCOUNT.createAccount();
427 account.setAccountExpirationDate(Date.valueOf(ACCOUNT_EXPIRATION_DATE));
428 account.setActive(true);
429 account.setAccountNumber(testDataGenerator.getPropertyValue(KFSPropertyConstants.ACCOUNT_NUMBER));
430 account.setChartOfAccountsCode(pendingEntry.getChartOfAccountsCode());
431 account.setOrganizationCode(optionalFieldToValueMap.get(ORGINIZATION_CODE_KEY));
432
433 Person accountFiscalOfficerUser = personService.getPersonByPrincipalName(semiRequiredFieldToValueMap.get(FISCAL_OFFICER_PRINCIPAL_NAME_KEY));
434 account.setAccountFiscalOfficerSystemIdentifier(accountFiscalOfficerUser.getPrincipalId());
435 account.setAccountFiscalOfficerUser(accountFiscalOfficerUser);
436
437 Person accountSupervisoryUser = personService.getPersonByPrincipalName(semiRequiredFieldToValueMap.get(ACCOUNT_SUPERVISOR_PRINCIPAL_NAME_KEY));
438 account.setAccountFiscalOfficerSystemIdentifier(accountSupervisoryUser.getPrincipalId());
439 account.setAccountSupervisoryUser(accountSupervisoryUser);
440
441 return account;
442 }
443
444
445
446
447
448
449
450 private void insertNewRecord(Balance balance) {
451 SpringContext.getBean(BusinessObjectService.class).save(balance);
452 }
453
454
455
456
457
458
459
460
461
462 @Override
463 public List<String> getLookupFields(boolean isExtended) {
464 List<String> lookupFields = new LinkedList<String>();
465 lookupFields.add(UNIVERSITY_FISCAL_YEAR_KEY);
466 lookupFields.add(UNIVERSITY_FISCAL_PERIOD_CODE_KEY);
467 lookupFields.add(ACCOUNT_NUMBER_KEY);
468 if(isExtended){
469 lookupFields.add(ORGINIZATION_CODE_KEY);
470 lookupFields.add(FISCAL_OFFICER_PRINCIPAL_NAME_KEY);
471 lookupFields.add(ACCOUNT_SUPERVISOR_PRINCIPAL_NAME_KEY);
472 lookupFields.add(CHART_OF_ACCOUNTS_CODE_KEY);
473 lookupFields.add(SUB_ACCOUNT_NUMBER_KEY);
474 }
475 return lookupFields;
476 }
477
478
479 }