001    /**
002     * Copyright 2005-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     */
016    package edu.sampleu.main;
017    
018    import org.apache.commons.lang3.StringUtils;
019    import org.junit.Test;
020    import org.kuali.rice.testtools.selenium.AutomatedFunctionalTestUtils;
021    import org.kuali.rice.testtools.selenium.WebDriverLegacyITBase;
022    import org.kuali.rice.testtools.selenium.WebDriverUtils;
023    import org.openqa.selenium.Keys;
024    
025    /**
026     * test that checks that rules can be added to agendas
027     *
028     * @author Kuali Rice Team (rice.collab@kuali.org)
029     */
030    public class AgendaEditorAddRuleAft extends WebDriverLegacyITBase {
031    
032        public static String KRAD_PORTAL_BASE = "/kr-krad/";
033        public static String AGENDA_EDITOR_BASE = "krmsAgendaEditor";
034    
035        public static String NEW_DATA_OBJ_PATH = "document.newMaintainableObject.dataObject.";
036    
037        public static final String BOOKMARK_URL =
038                AutomatedFunctionalTestUtils.PORTAL
039                        + "?channelTitle=Agenda%20Lookup&channelUrl="
040                        + WebDriverUtils.getBaseUrlString()
041                        + AutomatedFunctionalTestUtils.KRAD_LOOKUP_METHOD
042                        + "org.kuali.rice.krms.impl.repository.AgendaBo"
043                        + AutomatedFunctionalTestUtils.SHOW_MAINTENANCE_LINKS
044                        + "&returnLocation="
045                        + AutomatedFunctionalTestUtils.PORTAL_URL
046                        + AutomatedFunctionalTestUtils.HIDE_RETURN_LINK;
047    
048        @Override
049        protected String getBookmarkUrl() {
050            return BOOKMARK_URL;
051        }
052    
053        @Override
054        protected void navigate() throws Exception {
055            waitAndClickByLinkText(AGENDA_LOOKUP_LINK_TEXT);
056            waitForPageToLoad();
057        }
058    
059        protected void testAgendaEditorAddRuleWithSimpleProposition() throws Exception {
060            String uniqId = AutomatedFunctionalTestUtils.createUniqueDtsPlusTwoRandomCharsNot9Digits();
061            String agendaName = "AgendaEditorAddRuleAft " + uniqId;
062            String ruleName = "AgendaEditorAddRuleAft Rule " + "1" + " " + uniqId;
063    
064            selectFrameIframePortlet();
065            waitAndClickLinkContainingText("Create New");
066    
067            // add agenda information
068            waitForPageToLoad();
069            addNewAgendaInformation(agendaName, "Kuali Rules Test", "Context1");
070            // dynamic agenda details
071            Thread.sleep(500); // tab is happening to fast
072            unfocusElement();
073            waitAndTypeByName(NEW_DATA_OBJ_PATH + "agenda.typeId", "Campus Agenda");
074            unfocusElement();
075            waitAndTypeByName(NEW_DATA_OBJ_PATH + "customAttributesMap[Campus]", "BL");
076            waitAndClickButtonByText("Add Rule");
077    
078            // add agenda rule information
079            waitForPageToLoad();
080            addNewAgendaRuleInformation("Validation Rule", "", ruleName);
081            waitAndClickButtonByExactText("Add"); // add proposition button
082            addRulePropositionInfo("0", "Campus must have students", "", "Bloomington Campus Size", ">", "1");
083            addNewRuleActionInformation("KrmsActionResolverType", "test", "test");
084            waitAndClickButtonByText("Add Rule");
085    
086            // validate rule exists
087            waitForPageToLoad();
088            assertTextPresent(ruleName);
089            waitAndClickLinkContainingText("Cancel");
090            passed();
091        }
092    
093    
094        protected void addNewAgendaInformation(String agendaName, String agendaNamespace, String agendaContext) throws Exception {
095            waitAndSelectByName(NEW_DATA_OBJ_PATH + "namespace", agendaNamespace);
096            waitAndTypeByName(NEW_DATA_OBJ_PATH + "agenda.name", agendaName);
097            waitAndTypeByName(NEW_DATA_OBJ_PATH + "contextName", agendaContext);
098        }
099    
100        protected void addNewAgendaRuleInformation(String ruleType, String ruleTypeCode, String ruleName) throws Exception {
101            waitAndSelectByName(NEW_DATA_OBJ_PATH + "agendaItemLine.rule.typeId", ruleType);
102    
103            if (StringUtils.isNotBlank(ruleTypeCode)) {
104                waitAndSelectByName(NEW_DATA_OBJ_PATH + "customRuleAttributesMap[ruleTypeCode]", ruleTypeCode);
105            }
106    
107            // validate that Type selected is Validation Rule
108            assertTrue("Expected ruleTypeCode dropdown value not found ",isElementPresentByXpath(
109                    "//option[@selected='selected' and @value='1002']"));
110    
111            waitAndTypeByName(NEW_DATA_OBJ_PATH + "agendaItemLine.rule.name", ruleName);
112        }
113    
114        protected void addRulePropositionInfo(String childIndex, String description, String category, String propTerm,
115                String propComparison, String propositionValue) throws Exception {
116            String propTreeRootPath = NEW_DATA_OBJ_PATH + "agendaItemLine.rule.propositionTree.rootElement.";
117            String propTreeChildPath = propTreeRootPath + "children[" + childIndex + "].";
118            String propositionPath = propTreeChildPath + "data.proposition.";
119    
120            if (StringUtils.isNoneBlank(description)) {
121                waitAndTypeByName(propositionPath + "description", description);
122            }
123    
124            if (StringUtils.isNoneBlank(category)) {
125                waitAndSelectByName(propositionPath + "categoryId", category);
126            }
127    
128            if (StringUtils.isNoneBlank(propTerm)) {
129                waitAndSelectByName(propositionPath + "parameters[0].value", propTerm);
130            }
131    
132            if (StringUtils.isNoneBlank(propComparison)) {
133                waitAndSelectByName(propositionPath + "parameters[2].value", propComparison);
134                unfocusElement();
135                Thread.sleep(1500); // need time for next input to be reloaded
136            }
137    
138            if (StringUtils.isNoneBlank(propositionValue)) {
139                waitAndTypeByName(propositionPath + "parameters[1].value", propositionValue);
140            }
141        }
142    
143        protected void addNewRuleActionInformation(String actionType, String actionName,
144                String actionDescription) throws Exception {
145            // select action elements
146            waitAndSelectByName(NEW_DATA_OBJ_PATH + "agendaItemLineRuleAction.typeId", actionType);
147            waitAndTypeByName(NEW_DATA_OBJ_PATH + "agendaItemLineRuleAction.name", actionName);
148            waitAndTypeByName(NEW_DATA_OBJ_PATH + "agendaItemLineRuleAction.description", actionDescription);
149        }
150    
151    
152        protected void unfocusElement() {
153            driver.switchTo().activeElement().sendKeys(Keys.TAB);
154        }
155    
156        /**
157         * test that a rule can be added to an agenda
158         */
159        @Test
160        public void testAgendaEditorAddRuleNav() throws Exception {
161            testAgendaEditorAddRuleWithSimpleProposition();
162        }
163    
164    }
165