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.travel;
017    
018    import org.apache.commons.logging.Log;
019    import org.apache.commons.logging.LogFactory;
020    import org.junit.Test;
021    import org.kuali.rice.krad.uif.UifConstants;
022    import org.kuali.rice.testtools.selenium.WebDriverLegacyITBase;
023    import org.kuali.rice.testtools.selenium.WebDriverUtils;
024    
025    import java.util.HashMap;
026    import java.util.Map;
027    
028    import static org.junit.Assert.*;
029    
030    /**
031     *  Tests that the data attributes are rendered as expected for all controls
032     * 
033     * @author Kuali Rice Team (rice.collab@kuali.org)
034     */
035    public class UifDataAttributesNavAft extends WebDriverLegacyITBase {
036    
037        public static String BOOKMARK_URL = WebDriverUtils.getBaseUrlString()+ "/kr-krad/data-attributes-test-uif-controller?viewId=dataAttributesView_selenium&methodToCall=start";
038    
039        @Override
040        protected String getBookmarkUrl() {
041            return BOOKMARK_URL;
042        }
043    
044        private  Log log = LogFactory.getLog(getClass());
045    
046        /**
047         * verify that a tag has simple data attributes
048         *
049         * @param tag - html tag e.g. img or a
050         * @param tagId - derived from the bean id set in the view
051         * @param tagIdSuffix - where applicable, a suffix that is appended to the control by krad e.g. _control
052         */
053        private void verifySimpleAttributes(String tag, String tagId, String tagIdSuffix) throws Exception{
054            // test the attributes that are set via the data attributes list
055            tagId = tagId + tagIdSuffix;
056            String simpleAttributesXpath="//" + tag + "[@id='" + tagId + "' and @data-iconTemplateName='cool-icon-%s.png' and @data-transitions='3']";
057            assertTrue(tagId + " does not have simple data attributes (via list) present", isElementPresentByXpath(simpleAttributesXpath));
058            verifyStaticDataAttributes(tag, tagId);
059    
060        }
061    
062        /**
063         * test the attributes that are set via the data*Attribute properties
064         *
065         * @param tag - html tag e.g. img or a
066         * @param tagId - the html tag id - a combination of bean id and any suffix
067         */
068        private void verifyStaticDataAttributes(String tag, String tagId) {
069            final String simpleAttributesXpath;
070            simpleAttributesXpath="//" + tag + "[@id='" + tagId + "'"
071                    + " and @data-dataroleattribute='role' and @data-datatypeattribute='type' and @data-datametaattribute='meta']";
072            assertTrue(tagId + " does not have simple data attributes (via data*Attribute) properties present",
073                    isElementPresentByXpath(simpleAttributesXpath));
074        }
075    
076        /**
077         * check that complex attributes exist in the script
078         *
079         * @param tagId - the expected tag id
080         * @param suffix - the expected suffix e.g. _button
081         */
082        private void verifyComplexAttributes(String tagId, String suffix)throws Exception {
083            tagId = tagId + suffix;
084            String complexAttributesXpath="//input[(@type='hidden') and (@data-role='dataScript') and (@data-for='"+ tagId +  "')]";
085            assertTrue(tagId + ": complex data attributes script not found", isElementPresentByXpath(complexAttributesXpath));
086    
087            // the message field does not support complex attributes
088            //if (!tagId.equalsIgnoreCase("messageField")) {
089                String scriptValue = waitAndGetAttributeByXpath(complexAttributesXpath, "value");
090                assertNotNull("script value is null",scriptValue);
091            boolean ok = scriptValue.contains(
092                    "jQuery('#" + tagId + "').data('capitals', {kenya:'nairobi', uganda:'kampala', tanzania:'dar'});")
093                    && scriptValue.contains("jQuery('#" + tagId + "').data('intervals', {short:2, medium:5, long:13});");
094            if (!ok) {
095                log.info("scriptValue for " + tagId + " is " + scriptValue);
096            }
097            // check for complex attributes
098            assertTrue(tagId + ": complex attributes script does not contain expected code", ok);
099            //}
100        }
101    
102        /**
103         * check that all attributes exist in the script
104         *
105         * @param tagId - the expected tag id
106         * @param suffix - the expected suffix e.g. _control
107         * @return true if all attributes were found in script, false otherwise
108         */
109        private boolean verifyAllAttributesInScript(String tagId, String suffix)throws Exception {
110            checkForIncidentReport();
111            tagId = tagId + suffix;
112            String complexAttributesXpath="//input[@type='hidden' and @data-for='"+ tagId +  "']";
113    
114            // the message field does not support complex attributes
115            String scriptValue = waitAndGetAttributeByXpath(complexAttributesXpath, "value");
116            assertNotNull("script value is null",scriptValue);
117            // log.info("scriptValue for " + tagId + " is " + scriptValue);
118            return scriptValue.contains("jQuery('#" + tagId + "').data('transitions', 3);") &&
119                    scriptValue.contains("jQuery('#" + tagId + "').data('iconTemplateName', 'cool-icon-%s.png');") &&
120                    scriptValue.contains("jQuery('#" + tagId + "').data('capitals', {kenya:'nairobi', uganda:'kampala', tanzania:'dar'});") &&
121                    scriptValue.contains("jQuery('#" + tagId + "').data('intervals', {short:2, medium:5, long:13});");
122        }
123    
124    
125        /**
126         * Tests that the data attributes are rendered as expected for all controls
127         */
128        @Test
129        public void testDataAttributesPresentInControlsNav() throws Exception{
130            assertEquals("Kuali Portal Index", getTitle());
131            open(getBookmarkUrl());
132            waitForPageToLoad(); // if this times out make a special one that 50000
133            
134            // custom suffix to mark  test bean ids
135            String testIdSuffix = "_attrs";
136            // input fields, whose controls are implemented as spring form tags, will have both simple and complex attributes set via a script
137            String[] inputControls = {"textInputField", "textAreaInputField", "dropDown", "datePicker", "fileUpload", "userControl",
138                    "spinnerControl", "hiddenControl", "checkBox"};//, "radioButton",
139            for (int i=0; i<inputControls.length; i++) {
140                assertTrue(inputControls[i] + ": script does not contain expected code",
141                        verifyAllAttributesInScript(inputControls[i], testIdSuffix + UifConstants.IdSuffixes.CONTROL));
142                String tag = "input";
143                if (inputControls[i].equalsIgnoreCase("textAreaInputField")) {
144                    tag = "textarea";
145                } else if (inputControls[i].equalsIgnoreCase("dropDown")) {
146                    tag = "select";
147                }
148                verifyStaticDataAttributes(tag, inputControls[i] + testIdSuffix + UifConstants.IdSuffixes.CONTROL);
149            }
150            // these controls allow for simple attributes on the tag and complex attributes via js
151            Map<String, String[]> otherControlsMap = new HashMap<String, String[]>();
152            // controls whose simple attributes are set in an img tag
153            String[] imgControls = {"imageField_image"};
154            // fields whose simple attributes are set in an anchor tag
155            String[] anchorFields = {"navigationLink", "actionLink-noImage", "actionLink-imageRight", "actionLink-imageLeft", "linkElement"};
156            // fields whose simple attributes are set in a span tag
157            String[] spanFields = {"messageField"};
158            // fields whose simple attributes are set in an input tag
159            String[] inputFields = {"imageAction"};
160            // fields whose simple attributes are set in button tag
161            String[] buttonElements = {"buttonTextOnly", "buttonImageBottom", "buttonImageLeft", "buttonImageTop", "buttonImageRight"};
162            // iframe field
163            String[] iframeField = {"iframe"};
164            String[] divField={"spaceField","linkField"};
165            
166            otherControlsMap.put("img", imgControls);
167            otherControlsMap.put("a", anchorFields);
168            otherControlsMap.put("span", spanFields);
169            otherControlsMap.put("input", inputFields);
170            otherControlsMap.put("button", buttonElements);
171            otherControlsMap.put("iframe", iframeField);
172            otherControlsMap.put("div", divField);
173            
174            // a map to hold the tags where the simple attributes are affixed
175            // if a tag is not here, a empty string will be used for the suffix
176            Map<String, String> simpleTagIdSuffix = new HashMap<String, String>();
177            simpleTagIdSuffix.put("span", "_span");
178            
179    
180            for (String tag: otherControlsMap.keySet()) {
181                String[] controlIds = otherControlsMap.get(tag);
182                for (int i=0; i<controlIds.length; i++) {
183                    String tagId = controlIds[i];
184    
185                    // check for complex attributes
186                    verifyComplexAttributes(tagId, testIdSuffix);
187    
188                    // determine whether we are using a tag id suffix for the simple attributes
189                    String tagIdSuffix = testIdSuffix;
190                    if (simpleTagIdSuffix.containsKey(tag)) {
191                        tagIdSuffix = tagIdSuffix + simpleTagIdSuffix.get(tag);
192                    }
193    
194                    // check for simple attributes
195                    verifySimpleAttributes(tag, tagId, tagIdSuffix);
196                }
197                
198                // test label field - which uses the tagId suffix for both the simple attributes and complex
199                String tagId = "textInputField";
200                String tagIdSuffix = testIdSuffix + "_label";
201                // check for complex attributes
202                verifyComplexAttributes(tagId, tagIdSuffix);
203                // check for simple attributes
204                verifySimpleAttributes("label", tagId, tagIdSuffix);
205    
206                //test that the radio buttons have the 3 data attributes that can appear in the tag
207                tagId = "radioButton" + testIdSuffix + UifConstants.IdSuffixes.CONTROL;
208                String[] radioButtonIds = {tagId + "_0", tagId + "_1"};
209                for (String id: radioButtonIds) {
210                    verifyStaticDataAttributes("input", id);
211                }
212                //test that all complex and simple attributes set via the list are in a script
213                verifyAllAttributesInScript(tagId, "");
214            }
215            passed();
216        }
217    }