001    /**
002     * Copyright 2004-2013 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     */
016    package org.kuali.hr.core.kfs;
017    
018    import static org.junit.Assert.assertNotNull;
019    import static org.junit.Assert.assertTrue;
020    
021    import java.util.HashMap;
022    import java.util.Map;
023    import java.util.Map.Entry;
024    
025    import org.junit.Ignore;
026    import org.junit.Test;
027    import org.kuali.hr.KPMEWebTestCase;
028    import org.kuali.hr.util.HtmlUnitUtil;
029    import org.kuali.kpme.core.kfs.coa.businessobject.Organization;
030    import org.kuali.kpme.core.kfs.coa.businessobject.ProjectCode;
031    import org.kuali.kpme.core.util.HrTestConstants;
032    import org.kuali.rice.krad.service.KRADServiceLocator;
033    
034    import com.gargoylesoftware.htmlunit.html.HtmlInput;
035    import com.gargoylesoftware.htmlunit.html.HtmlPage;
036    
037    public class ProjectCodeMaintTest extends KPMEWebTestCase {
038            
039            private static final String NEW_MAINT_DOC_PREFIX = "document.newMaintainableObject.";
040            private String newUrl;
041            private String lookupUrl;
042            private Map<String,String> requiredFields;
043    
044            private void before() {
045                    
046                    newUrl = HrTestConstants.Urls.PROJECT_CODE_MAINT_NEW_URL;
047                    lookupUrl = HrTestConstants.Urls.PROJECT_CODE_MAINT_URL;
048                    
049                    requiredFields = new HashMap<String,String>();
050                    requiredFields.put("code", "Project Code (Project) is a required field.");
051                    requiredFields.put("name", "Project Name (Name) is a required field.");
052                    requiredFields.put("chartOfAccountsCode", "Chart Code (Chart) is a required field.");
053                    requiredFields.put("organizationCode", "Organization Code (Org) is a required field.");
054            }
055            
056            private void setDefaultTestInputValues() {
057                    requiredFields = new HashMap<String,String>();
058                    requiredFields.put("active", "on");
059                    requiredFields.put("chartOfAccountsCode", "UA");
060                    requiredFields.put("code", "PRJ-CODE");
061                    requiredFields.put("name", "PRJ-NAME");
062                    requiredFields.put("organizationCode", "ORG-CODE");
063            }
064            
065            private void after() {
066                    requiredFields.clear();
067            }
068            
069            @Test
070            public void testRequiredFields() throws Exception {
071                    HtmlPage maintPage = HtmlUnitUtil.gotoPageAndLogin(getWebClient(), newUrl);
072                    assertNotNull("maintenance page is null", maintPage);
073                    
074                    HtmlInput docDescription = HtmlUnitUtil.getInputContainingText(maintPage, "* Document Description");
075                    assertNotNull("maintenance page does not contain document description", docDescription);
076                    
077                    docDescription.setValueAttribute("testing submission");
078                    
079                    HtmlPage resultPage = HtmlUnitUtil.clickInputContainingText(maintPage, "submit");
080                    assertNotNull("no result page returned after submit", resultPage);
081                    
082                    String resultPageAsText = resultPage.asText();
083                    for(Entry<String,String> requiredField : requiredFields.entrySet()) {
084                            assertTrue("page does not contain error message for required field: '" + requiredField.getKey() + "'",
085                                            resultPageAsText.contains(requiredField.getValue()));
086                    }
087            }
088            
089            @Test
090            public void testLookup() throws Exception {
091                    HtmlPage lookupPage = HtmlUnitUtil.gotoPageAndLogin(getWebClient(), lookupUrl);
092                    assertNotNull("lookup page is null", lookupPage);
093                    
094                    lookupPage = HtmlUnitUtil.clickInputContainingText(lookupPage, "search");
095                    assertNotNull("lookup result page is null", lookupPage);
096                    
097                    assertTrue("lookup result should not contain any project codes", lookupPage.asText().contains("No values match this search. "));
098            }
099            
100            @Override
101            public void setUp() throws Exception {
102                    super.setUp();
103                    before();
104            }
105    
106            @Override
107            public void tearDown() throws Exception {
108                    after();
109                    super.tearDown();
110            }
111            
112            @Test
113            public void testInvalidChartConsistencyCaseTwo() throws Exception {
114                    /**
115                     * TODO: submit project code whose specified organization's chart does not match the chart defined
116                     * on this project code
117                     */
118                    HtmlPage maintPage = HtmlUnitUtil.gotoPageAndLogin(getWebClient(), newUrl);
119                    assertNotNull("maintenance page is null", maintPage);
120                    
121                    HtmlInput docDescription = HtmlUnitUtil.getInputContainingText(maintPage, "* Document Description");
122                    assertNotNull("maintenance page does not contain document description", docDescription);
123    
124                    setDefaultTestInputValues();
125                    for(Entry<String,String> entry : requiredFields.entrySet()) {
126                            HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + entry.getKey(), entry.getValue());
127                    }
128    
129                    docDescription.setValueAttribute("testing submission");
130                    //HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + "accountNumber", "1111");
131    
132                    HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + "organizationCode", "ORG-CODE2");
133                    // reset requiredFields map to default error messages.
134                    before();
135                    HtmlPage resultPage = HtmlUnitUtil.clickInputContainingText(maintPage, "submit");
136                    assertNotNull("no result page returned after submit", resultPage);
137                    
138                    String resultPageAsText = resultPage.asText();
139                    for(Entry<String,String> requiredField : requiredFields.entrySet()) {
140                            if(requiredField.getKey().equals("organizationCode")) {
141                                    assertTrue("page does not contain error message for the invalid field: '" + requiredField.getKey() + "'",
142                                                    resultPageAsText.contains("No such active organization exists whose chart matches 'UA'"));
143                            }
144                    }
145            }
146            
147            @Test
148            public void testInValidChart() throws Exception {
149                    /**
150                     * TODO: submit sub-object code whose object COA and account COA codes
151                     * match the COA specified on this sub-object, but the account is open.
152                     * 
153                     * This test was changed from asserting a successful submission to asserting a non-successful
154                     * insertion. Test data was added that marked the account used in this test as closed. Validation
155                     * fails for closed accounts.
156                     * 
157                     */
158                    HtmlPage maintPage = HtmlUnitUtil.gotoPageAndLogin(getWebClient(), newUrl);
159                    assertNotNull("maintenance page is null", maintPage);
160                    
161                    HtmlInput docDescription = HtmlUnitUtil.getInputContainingText(maintPage, "* Document Description");
162                    assertNotNull("maintenance page does not contain document description", docDescription);
163                    
164                    setDefaultTestInputValues();
165                    for(Entry<String,String> entry : requiredFields.entrySet()) {
166                            HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + entry.getKey(), entry.getValue());
167                    }
168                    docDescription.setValueAttribute("testing submission");
169                    // use a non-existent chart
170                    HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + "chartOfAccountsCode","BP");
171    
172                    HtmlPage resultPage = HtmlUnitUtil.clickInputContainingText(maintPage, "submit");
173                    assertTrue("page should contain active chart existence error", resultPage.asText().contains("No active chart exists for this code"));
174            }
175            
176            @Test
177            public void testValidChart() throws Exception {
178    
179                    HtmlPage maintPage = HtmlUnitUtil.gotoPageAndLogin(getWebClient(), newUrl);
180                    assertNotNull("maintenance page is null", maintPage);
181                    
182                    HtmlInput docDescription = HtmlUnitUtil.getInputContainingText(maintPage, "* Document Description");
183                    assertNotNull("maintenance page does not contain document description", docDescription);
184                    
185                    setDefaultTestInputValues();
186                    for(Entry<String,String> entry : requiredFields.entrySet()) {
187                            HtmlUnitUtil.setFieldValue(maintPage, NEW_MAINT_DOC_PREFIX + entry.getKey(), entry.getValue());
188                    }
189                    docDescription.setValueAttribute("testing submission");
190    
191                    HtmlPage resultPage = HtmlUnitUtil.clickInputContainingText(maintPage, "submit");
192    
193                    assertTrue("page should contain active account existence error", !resultPage.asText().contains("error(s)"));
194                    
195                    ProjectCode projectCode = (ProjectCode) KRADServiceLocator.getBusinessObjectService().findBySinglePrimaryKey(ProjectCode.class, "PRJ-CODE");
196                    assertNotNull("newly created sub-object code should exist", projectCode);
197                    //clean up after assertion.
198                    KRADServiceLocator.getBusinessObjectService().delete(projectCode);
199            }
200    }