001/**
002 * Copyright 2004-2014 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;
020
021import java.util.HashMap;
022import java.util.Map;
023import java.util.Map.Entry;
024
025import org.junit.Test;
026import org.kuali.hr.KPMEWebTestCase;
027import org.kuali.hr.util.HtmlUnitUtil;
028import org.kuali.kpme.core.kfs.coa.businessobject.ObjectCode;
029import org.kuali.kpme.core.util.HrTestConstants;
030import org.kuali.rice.krad.service.KRADServiceLocator;
031
032import com.gargoylesoftware.htmlunit.html.HtmlInput;
033import com.gargoylesoftware.htmlunit.html.HtmlPage;
034
035public class ObjectCodeMaintTest extends KPMEWebTestCase {
036        
037        private static final String NEW_MAINT_DOC_PREFIX = "document.newMaintainableObject.";
038        private String newUrl;
039        private String lookupUrl;
040        private Map<String,String> requiredFields;
041
042        @Override
043        public void setUp() throws Exception {
044                super.setUp();
045                before();
046        }
047
048        @Override
049        public void tearDown() throws Exception {
050                after();
051                super.tearDown();
052        }
053        
054        private void setDefaultTestInputValues() {
055                requiredFields = new HashMap<String,String>();
056                requiredFields.put("active", "on");
057                requiredFields.put("universityFiscalYear", "2013");
058                requiredFields.put("chartOfAccountsCode", "UA");
059                requiredFields.put("financialObjectCode", "3000");
060                requiredFields.put("financialObjectCodeName", "Regular Earnings");
061                requiredFields.put("financialObjectCodeShortName", "Reg Earns");
062        }
063        
064        private void before() {
065                
066                newUrl = HrTestConstants.Urls.OBJECT_CODE_MAINT_NEW_URL;
067                lookupUrl = HrTestConstants.Urls.OBJECT_CODE_MAINT_URL;
068                
069                requiredFields = new HashMap<String,String>();
070                requiredFields.put("universityFiscalYear", "Fiscal Year (FY) is a required field.");
071                requiredFields.put("chartOfAccountsCode", "Chart of Accounts Code (ChartOfAccountsCode) is a required field.");
072                requiredFields.put("financialObjectCode", "Object Code (Object) is a required field.");
073                requiredFields.put("financialObjectCodeName", "Object Code Name (ObjCodeName) is a required field.");
074                requiredFields.put("financialObjectCodeShortName", "Object Code Short Name (ObjCodeShortName) is a required field.");
075        }
076        
077        private void after() {
078                requiredFields.clear();
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                HtmlUnitUtil.setFieldValue(lookupPage, "universityFiscalYear", "2013");
107                
108                lookupPage = HtmlUnitUtil.clickInputContainingText(lookupPage, "search");
109                assertNotNull("lookup result page is null", lookupPage);
110                
111                String lookupPageAsText = lookupPage.asText();
112                assertTrue("lookup result page should contain three records",
113                                lookupPageAsText.contains("9000") && lookupPageAsText.contains("1000") && lookupPageAsText.contains("2000"));
114                
115        }
116        
117        @Test
118        public void testInValidChart() throws Exception {
119                /**
120                 * TODO: submit sub-object code whose object COA and account COA codes
121                 * match the COA specified on this sub-object, but the account is open.
122                 * 
123                 * This test was changed from asserting a successful submission to asserting a non-successful
124                 * insertion. Test data was added that marked the account used in this test as closed. Validation
125                 * fails for closed accounts.
126                 * 
127                 */
128                HtmlPage maintPage = HtmlUnitUtil.gotoPageAndLogin(getWebClient(), newUrl);
129                assertNotNull("maintenance page is null", maintPage);
130                
131                HtmlInput docDescription = HtmlUnitUtil.getInputContainingText(maintPage, "* Document Description");
132                assertNotNull("maintenance page does not contain document description", docDescription);
133                
134                setDefaultTestInputValues();
135                for(Entry<String,String> entry : requiredFields.entrySet()) {
136                        HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + entry.getKey(), entry.getValue());
137                }
138                docDescription.setValueAttribute("testing submission");
139                // use a non-existent chart
140                HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + "chartOfAccountsCode","BP");
141
142                HtmlPage resultPage = HtmlUnitUtil.clickInputContainingText(maintPage, "submit");
143
144                assertTrue("page should contain active chart existence error", resultPage.asText().contains("No active chart exists for this code"));
145        }
146        
147        @Test
148        public void testValidChart() throws Exception {
149
150                HtmlPage maintPage = HtmlUnitUtil.gotoPageAndLogin(getWebClient(), newUrl);
151                assertNotNull("maintenance page is null", maintPage);
152                
153                HtmlInput docDescription = HtmlUnitUtil.getInputContainingText(maintPage, "* Document Description");
154                assertNotNull("maintenance page does not contain document description", docDescription);
155                
156                setDefaultTestInputValues();
157                for(Entry<String,String> entry : requiredFields.entrySet()) {
158                        HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + entry.getKey(), entry.getValue());
159                }
160                docDescription.setValueAttribute("testing submission");
161
162                HtmlPage resultPage = HtmlUnitUtil.clickInputContainingText(maintPage, "submit");
163                assertTrue("page should contain active account existence error", !resultPage.asText().contains("error(s)"));
164                
165                Map<String,String> keys = new HashMap<String,String>();
166                keys.put("chartOfAccountsCode", "UA");
167                keys.put("universityFiscalYear", "2013");
168                keys.put("financialObjectCode", "3000");
169                
170                ObjectCode objectCode = (ObjectCode) KRADServiceLocator.getBusinessObjectService().findByPrimaryKey(ObjectCode.class, keys);
171                assertNotNull("newly created sub-object code should exist", objectCode);
172                //clean up after assertion.
173                KRADServiceLocator.getBusinessObjectService().delete(objectCode);
174        }
175
176}