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 */
016package edu.sampleu.main;
017
018import org.apache.commons.lang3.StringUtils;
019import org.junit.Test;
020import org.kuali.rice.testtools.selenium.AutomatedFunctionalTestUtils;
021import org.kuali.rice.testtools.selenium.WebDriverLegacyITBase;
022import org.kuali.rice.testtools.selenium.WebDriverUtils;
023import 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 */
030public 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