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.*;
019
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.Account;
028import org.kuali.kpme.core.util.HrTestConstants;
029import org.kuali.rice.krad.service.KRADServiceLocator;
030
031import com.gargoylesoftware.htmlunit.html.HtmlInput;
032import com.gargoylesoftware.htmlunit.html.HtmlPage;
033
034public class AccountMaintTest extends KPMEWebTestCase {
035        
036        private static final String NEW_MAINT_DOC_PREFIX = "document.newMaintainableObject.";
037        private String newUrl;
038        private String lookupUrl;
039        private Map<String,String> requiredFields;
040
041        private void setDefaultTestInputValues() {
042                requiredFields = new HashMap<String,String>();
043
044                requiredFields.put("accountEffectiveDate", "01/01/2010");
045                requiredFields.put("chartOfAccountsCode", "UA");
046                requiredFields.put("accountNumber", "4444");
047                requiredFields.put("accountName", "4444");
048                requiredFields.put("organizationCode", "ORG-CODE");
049        }
050        
051        private void before() {
052                
053                newUrl = HrTestConstants.Urls.ACCOUNT_MAINT_NEW_URL;
054                lookupUrl = HrTestConstants.Urls.ACCOUNT_MAINT_URL;
055                
056                requiredFields = new HashMap<String,String>();
057                requiredFields.put("accountEffectiveDate", "Account Effective Date (EffDate) is a required field.");
058                requiredFields.put("chartOfAccountsCode", "Chart Code (Chart) is a required field.");
059                requiredFields.put("accountNumber", "Account Number (Account Number) is a required field.");
060                requiredFields.put("accountName", "Account Name (AcctName) is a required field.");
061                requiredFields.put("organizationCode", "Organization Code (Org) is a required field.");
062        }
063        
064        private void after() {
065                requiredFields.clear();
066        }
067        
068        @Test
069        public void testRequiredFields() throws Exception {
070                HtmlPage maintPage = HtmlUnitUtil.gotoPageAndLogin(getWebClient(), newUrl);
071                assertNotNull("maintenance page is null", maintPage);
072                
073                HtmlInput docDescription = HtmlUnitUtil.getInputContainingText(maintPage, "* Document Description");
074                assertNotNull("maintenance page does not contain document description", docDescription);
075                
076                docDescription.setValueAttribute("testing submission");
077                
078                HtmlPage resultPage = HtmlUnitUtil.clickInputContainingText(maintPage, "submit");
079                assertNotNull("no result page returned after submit", resultPage);
080                
081                String resultPageAsText = resultPage.asText();
082                for(Entry<String,String> requiredField : requiredFields.entrySet()) {
083                        assertTrue("page does not contain error message for required field: '" + requiredField.getKey() + "'",
084                                        resultPageAsText.contains(requiredField.getValue()));
085                }
086        }
087        
088        @Test
089        public void testLookup() throws Exception {
090                HtmlPage lookupPage = HtmlUnitUtil.gotoPageAndLogin(getWebClient(), lookupUrl);
091                assertNotNull("lookup page is null", lookupPage);
092                
093                lookupPage = HtmlUnitUtil.clickInputContainingText(lookupPage, "search");
094                assertNotNull("lookup result page is null", lookupPage);
095                
096                assertTrue("lookup result page should contain one account '3333'",
097                                lookupPage.asText().contains("3333"));
098        }
099        
100        @Test
101        public void testInValidChart() throws Exception {
102                /**
103                 * TODO: submit sub-object code whose object COA and account COA codes
104                 * match the COA specified on this sub-object, but the account is open.
105                 * 
106                 * This test was changed from asserting a successful submission to asserting a non-successful
107                 * insertion. Test data was added that marked the account used in this test as closed. Validation
108                 * fails for closed accounts.
109                 * 
110                 */
111                HtmlPage maintPage = HtmlUnitUtil.gotoPageAndLogin(getWebClient(), newUrl);
112                assertNotNull("maintenance page is null", maintPage);
113                
114                HtmlInput docDescription = HtmlUnitUtil.getInputContainingText(maintPage, "* Document Description");
115                assertNotNull("maintenance page does not contain document description", docDescription);
116                
117                setDefaultTestInputValues();
118                for(Entry<String,String> entry : requiredFields.entrySet()) {
119                        HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + entry.getKey(), entry.getValue());
120                }
121                docDescription.setValueAttribute("testing submission");
122                // use a non-existent chart
123                HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + "chartOfAccountsCode","BP");
124
125                HtmlPage resultPage = HtmlUnitUtil.clickInputContainingText(maintPage, "submit");
126                assertTrue("page should contain active account existence error", resultPage.asText().contains("No active chart exists for this code"));
127        }
128        
129        @Test
130        public void testValidChart() throws Exception {
131
132                HtmlPage maintPage = HtmlUnitUtil.gotoPageAndLogin(getWebClient(), newUrl);
133                assertNotNull("maintenance page is null", maintPage);
134                
135                HtmlInput docDescription = HtmlUnitUtil.getInputContainingText(maintPage, "* Document Description");
136                assertNotNull("maintenance page does not contain document description", docDescription);
137                
138                setDefaultTestInputValues();
139                for(Entry<String,String> entry : requiredFields.entrySet()) {
140                        HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + entry.getKey(), entry.getValue());
141                }
142                docDescription.setValueAttribute("testing submission");
143
144                HtmlPage resultPage = HtmlUnitUtil.clickInputContainingText(maintPage, "submit");
145                assertTrue("page should contain active account existence error", !resultPage.asText().contains("error(s)"));
146                
147                Map<String,String> keys = new HashMap<String,String>();
148                keys.put("chartOfAccountsCode", "UA");
149                keys.put("accountNumber", "4444");
150                
151                Account account = (Account) KRADServiceLocator.getBusinessObjectService().findByPrimaryKey(Account.class, keys);
152                assertNotNull("newly created sub-object code should exist", account);
153                //clean up after assertion.
154                KRADServiceLocator.getBusinessObjectService().delete(account);
155        }
156        
157        @Override
158        public void setUp() throws Exception {
159                before();
160                super.setUp();
161        }
162        
163        @Override
164        public void tearDown() throws Exception {
165                after();
166                super.tearDown();
167        }
168}