001/**
002 * Copyright 2004-2015 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.kuali.hr.core.kfs;
017
018import static org.junit.Assert.assertNotNull;
019import static org.junit.Assert.assertTrue;
020import java.util.HashMap;
021import java.util.Map;
022import java.util.Map.Entry;
023
024import org.junit.Test;
025import org.kuali.hr.KPMEWebTestCase;
026import org.kuali.hr.util.HtmlUnitUtil;
027import org.kuali.kpme.core.kfs.coa.businessobject.SubObjectCode;
028import org.kuali.kpme.core.util.HrTestConstants;
029import org.kuali.rice.krad.service.KRADServiceLocator;
030import com.gargoylesoftware.htmlunit.html.HtmlInput;
031import com.gargoylesoftware.htmlunit.html.HtmlPage;
032
033public class SubObjectCodeMaintTest extends KPMEWebTestCase {
034
035        private static final String NEW_MAINT_DOC_PREFIX = "document.newMaintainableObject.";
036        private String newUrl;
037        private String lookupUrl;
038        private Map<String,String> requiredFields;
039
040        @Override
041        public void setUp() throws Exception {
042                // TODO Auto-generated method stub
043                super.setUp();
044                before();
045        }
046
047        @Override
048        public void tearDown() throws Exception {
049                requiredFields.clear();
050                // TODO Auto-generated method stub
051                super.tearDown();
052        }
053        
054        private void before() {
055                
056                newUrl = HrTestConstants.Urls.SUB_OBJECT_CODE_MAINT_NEW_URL;
057                lookupUrl = HrTestConstants.Urls.SUB_OBJECT_CODE_MAINT_URL;
058                
059                requiredFields = new HashMap<String,String>();
060                requiredFields.put("universityFiscalYear", "University Fiscal Year (Year) is a required field.");
061                requiredFields.put("chartOfAccountsCode", "Chart Code (Chart) is a required field.");
062                requiredFields.put("accountNumber", "Account Number (Account Number) is a required field.");
063                requiredFields.put("financialObjectCode", "Object Code (Object) is a required field.");
064                requiredFields.put("financialSubObjectCode", "Sub-Object Code (Sub-Object) is a required field.");
065                requiredFields.put("financialSubObjectCodeName", "Sub-Object Code Name (SubObjCodeName) is a required field.");
066                requiredFields.put("financialSubObjectCdshortNm", "Sub-Object Code Short Name (SubObjCodeShortName) is a required field.");
067        }
068        
069        private void setDefaultTestInputValues() {
070                requiredFields = new HashMap<String,String>();
071                requiredFields.put("active", "on");
072                requiredFields.put("universityFiscalYear", "2013");
073                requiredFields.put("chartOfAccountsCode", "UA");
074                requiredFields.put("accountNumber", "1111");
075                requiredFields.put("financialObjectCode", "1000");
076                requiredFields.put("financialSubObjectCode", "10");
077                requiredFields.put("financialSubObjectCodeName", "Test Sub Obj");
078                requiredFields.put("financialSubObjectCdshortNm", "Sub Obj TST");
079        }
080        
081        @Test
082        public void testRequiredFields() throws Exception {
083                HtmlPage maintPage = HtmlUnitUtil.gotoPageAndLogin(getWebClient(), newUrl);
084                assertNotNull("maintenance page is null", maintPage);
085                
086                HtmlInput docDescription = HtmlUnitUtil.getInputContainingText(maintPage, "* Document Description");
087                assertNotNull("maintenance page does not contain document description", docDescription);
088                
089                docDescription.setValueAttribute("testing submission");
090                
091                HtmlPage resultPage = HtmlUnitUtil.clickInputContainingText(maintPage, "submit");
092                assertNotNull("no result page returned after submit", resultPage);
093                
094                String resultPageAsText = resultPage.asText();
095                for(Entry<String,String> requiredField : requiredFields.entrySet()) {
096                        assertTrue("page does not contain error message for required field: '" + requiredField.getKey() + "'",
097                                        resultPageAsText.contains(requiredField.getValue()));
098                }
099        }
100        
101        @Test
102        public void testLookup() throws Exception {
103                HtmlPage lookupPage = HtmlUnitUtil.gotoPageAndLogin(getWebClient(), lookupUrl);
104                assertNotNull("lookup page is null", lookupPage);
105                
106                lookupPage = HtmlUnitUtil.clickInputContainingText(lookupPage, "search");
107                assertNotNull("lookup result page is null", lookupPage);
108                assertTrue("lookup page should contain 'UA Sub Obj'", lookupPage.asText().contains("UA Sub Obj"));
109        }
110        
111        @Test
112        public void testInvalidChartConsistencyCaseOne() throws Exception {
113                /**
114                 * TODO: submit sub-object code whose account COA code does not
115                 * match the COA specified on this sub-object
116                 */
117                HtmlPage maintPage = HtmlUnitUtil.gotoPageAndLogin(getWebClient(), newUrl);
118                assertNotNull("maintenance page is null", maintPage);
119                
120                HtmlInput docDescription = HtmlUnitUtil.getInputContainingText(maintPage, "* Document Description");
121                assertNotNull("maintenance page does not contain document description", docDescription);
122
123                setDefaultTestInputValues();
124                for(Entry<String,String> entry : requiredFields.entrySet()) {
125                        HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + entry.getKey(), entry.getValue());
126                }
127
128                docDescription.setValueAttribute("testing submission");
129                
130                // this account's COA Code is "UA"
131                HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + "accountNumber", "9999");
132                // reset requiredFields map to default error messages.
133                before();
134                HtmlPage resultPage = HtmlUnitUtil.clickInputContainingText(maintPage, "submit");
135                assertNotNull("no result page returned after submit", resultPage);
136                
137                String resultPageAsText = resultPage.asText();
138                for(Entry<String,String> requiredField : requiredFields.entrySet()) {
139                        if(requiredField.getKey().equals("accountNumber")) {
140                                assertTrue("page does not contain error message for the invalid field: '" + requiredField.getKey() + "'",
141                                                resultPageAsText.contains("No such active account exists whose chart matches 'UA'"));
142                        }
143                }
144        }
145        
146        @Test
147        public void testInvalidChartConsistencyCaseTwo() throws Exception {
148                /**
149                 * TODO: submit sub-object code whose object code chart does not
150                 * match the chart specified on the sub-object
151                 */
152                HtmlPage maintPage = HtmlUnitUtil.gotoPageAndLogin(getWebClient(), newUrl);
153                assertNotNull("maintenance page is null", maintPage);
154                
155                HtmlInput docDescription = HtmlUnitUtil.getInputContainingText(maintPage, "* Document Description");
156                assertNotNull("maintenance page does not contain document description", docDescription);
157
158                setDefaultTestInputValues();
159                for(Entry<String,String> entry : requiredFields.entrySet()) {
160                        HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + entry.getKey(), entry.getValue());
161                }
162
163                docDescription.setValueAttribute("testing submission");
164                //HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + "accountNumber", "1111");
165
166                HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + "financialObjectCode", "9000");
167                // reset requiredFields map to default error messages.
168                before();
169                HtmlPage resultPage = HtmlUnitUtil.clickInputContainingText(maintPage, "submit");
170                assertNotNull("no result page returned after submit", resultPage);
171                
172                String resultPageAsText = resultPage.asText();
173                for(Entry<String,String> requiredField : requiredFields.entrySet()) {
174                        if(requiredField.getKey().equals("financialObjectCode")) {
175                                assertTrue("page does not contain error message for the invalid field: '" + requiredField.getKey() + "'",
176                                                resultPageAsText.contains("No such active object code exists whose chart matches 'UA'"));
177                        }
178                }
179        }
180        
181        @Test
182        public void testInvalidChartConsistencyCaseThree() throws Exception {
183                /**
184                 * TODO: submit sub-object code whose account chart and object code chart
185                 * do not match the chart specified on the sub-object
186                 */
187                HtmlPage maintPage = HtmlUnitUtil.gotoPageAndLogin(getWebClient(), newUrl);
188                assertNotNull("maintenance page is null", maintPage);
189                
190                HtmlInput docDescription = HtmlUnitUtil.getInputContainingText(maintPage, "* Document Description");
191                assertNotNull("maintenance page does not contain document description", docDescription);
192
193                setDefaultTestInputValues();
194                for(Entry<String,String> entry : requiredFields.entrySet()) {
195                        HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + entry.getKey(), entry.getValue());
196                }
197
198                docDescription.setValueAttribute("testing submission");
199                
200                // this account's COA Code is "UA"
201                HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + "accountNumber", "9999");
202                HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + "financialObjectCode", "9000");
203                // reset requiredFields map to default error messages.
204                before();
205                HtmlPage resultPage = HtmlUnitUtil.clickInputContainingText(maintPage, "submit");
206                assertNotNull("no result page returned after submit", resultPage);
207                
208                String resultPageAsText = resultPage.asText();
209                for(Entry<String,String> requiredField : requiredFields.entrySet()) {
210                        if(requiredField.getKey().equals("financialObjectCode")) {
211                                assertTrue("page does not contain error message for the invalid field: '" + requiredField.getKey() + "'",
212                                                resultPageAsText.contains("No such active object code exists whose chart matches 'UA'"));
213                        }
214                        if(requiredField.getKey().equals("accountNumber")) {
215                                assertTrue("page does not contain error message for the invalid field: '" + requiredField.getKey() + "'",
216                                                resultPageAsText.contains("No such active account exists whose chart matches 'UA'"));
217                        }
218                }
219        }
220        
221        @Test
222        public void testValidChartConsistencyWithClosedAccount() throws Exception {
223                /**
224                 * TODO: submit sub-object code whose object COA and account COA codes
225                 * match the COA specified on this sub-object, but the account is open.
226                 * 
227                 * This test was changed from asserting a successful submission to asserting a non-successful
228                 * insertion. Test data was added that marked the account used in this test as closed. Validation
229                 * fails for closed accounts.
230                 * 
231                 */
232                HtmlPage maintPage = HtmlUnitUtil.gotoPageAndLogin(getWebClient(), newUrl);
233                assertNotNull("maintenance page is null", maintPage);
234                
235                HtmlInput docDescription = HtmlUnitUtil.getInputContainingText(maintPage, "* Document Description");
236                assertNotNull("maintenance page does not contain document description", docDescription);
237                
238                setDefaultTestInputValues();
239                for(Entry<String,String> entry : requiredFields.entrySet()) {
240                        HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + entry.getKey(), entry.getValue());
241                }
242                docDescription.setValueAttribute("testing submission");
243                // account 2222 has same chart as default object code, and the chart input value on this form.
244                HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + "accountNumber","2222");
245                // primary key includes fin_sub_obj_cd
246                HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + "financialSubObjectCode", "20");
247                HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + "financialSubObjectCodeName", "TST Sub object code");
248                HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + "financialSubObjectCdshortNm", "TST SOC");
249
250                HtmlPage resultPage = HtmlUnitUtil.clickInputContainingText(maintPage, "submit");
251                assertTrue("page should contain active account existence error", resultPage.asText().contains("No such active account exists whose chart matches 'UA'"));
252                
253                Map<String,String> keys = new HashMap<String,String>();
254                keys.put("universityFiscalYear", "2013");
255                keys.put("chartOfAccountsCode", "UA");
256                keys.put("accountNumber", "2222");
257                keys.put("financialObjectCode", "1000");
258                keys.put("financialSubObjectCode", "20");
259                
260/*              SubObjectCode subObjectCode = KRADServiceLocator.getBusinessObjectService().findByPrimaryKey(SubObjectCode.class, keys);
261                assertNotNull("newly created sub-object code should exist", subObjectCode);
262                //clean up after assertion.
263                KRADServiceLocator.getBusinessObjectService().delete(subObjectCode);*/
264        }
265        
266        @Test
267        public void testValidChartConsistencyWithOpenAccount() throws Exception {
268
269                HtmlPage maintPage = HtmlUnitUtil.gotoPageAndLogin(getWebClient(), newUrl);
270                assertNotNull("maintenance page is null", maintPage);
271                
272                HtmlInput docDescription = HtmlUnitUtil.getInputContainingText(maintPage, "* Document Description");
273                assertNotNull("maintenance page does not contain document description", docDescription);
274                
275                setDefaultTestInputValues();
276                for(Entry<String,String> entry : requiredFields.entrySet()) {
277                        HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + entry.getKey(), entry.getValue());
278                }
279                docDescription.setValueAttribute("testing submission");
280                // account 2222 has same chart as default object code, and the chart input value on this form.
281                HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + "accountNumber","3333");
282                // primary key includes fin_sub_obj_cd
283                HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + "financialSubObjectCode", "30");
284                HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + "financialSubObjectCodeName", "TST Sub object code 3");
285                HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + "financialSubObjectCdshortNm", "TST SOC 3");
286
287                HtmlPage resultPage = HtmlUnitUtil.clickInputContainingText(maintPage, "submit");
288                assertTrue("page should contain active account existence error", !resultPage.asText().contains("error(s)"));
289                
290                Map<String,String> keys = new HashMap<String,String>();
291                keys.put("universityFiscalYear", "2013");
292                keys.put("chartOfAccountsCode", "UA");
293                keys.put("accountNumber", "3333");
294                keys.put("financialObjectCode", "1000");
295                keys.put("financialSubObjectCode", "30");
296                
297                SubObjectCode subObjectCode = KRADServiceLocator.getBusinessObjectService().findByPrimaryKey(SubObjectCode.class, keys);
298                assertNotNull("newly created sub-object code should exist", subObjectCode);
299                //clean up after assertion.
300                KRADServiceLocator.getBusinessObjectService().delete(subObjectCode);
301        }
302        
303        @Test
304        public void testInValidChart() throws Exception {
305                /**
306                 * TODO: submit sub-object code whose object COA and account COA codes
307                 * match the COA specified on this sub-object, but the account is open.
308                 * 
309                 * This test was changed from asserting a successful submission to asserting a non-successful
310                 * insertion. Test data was added that marked the account used in this test as closed. Validation
311                 * fails for closed accounts.
312                 * 
313                 */
314                HtmlPage maintPage = HtmlUnitUtil.gotoPageAndLogin(getWebClient(), newUrl);
315                assertNotNull("maintenance page is null", maintPage);
316                
317                HtmlInput docDescription = HtmlUnitUtil.getInputContainingText(maintPage, "* Document Description");
318                assertNotNull("maintenance page does not contain document description", docDescription);
319                
320                setDefaultTestInputValues();
321                for(Entry<String,String> entry : requiredFields.entrySet()) {
322                        HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + entry.getKey(), entry.getValue());
323                }
324                docDescription.setValueAttribute("testing submission");
325                // use a non-existent chart
326                HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + "chartOfAccountsCode","BP");
327
328                HtmlPage resultPage = HtmlUnitUtil.clickInputContainingText(maintPage, "submit");
329
330                assertTrue("page should contain active chart existence error", resultPage.asText().contains("No active chart exists for this code"));
331        }
332
333}