View Javadoc

1   /*
2    * Copyright 2006-2012 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package edu.samplu.travel.krad.test;
17  
18  import edu.samplu.common.ITUtil;
19  import edu.samplu.common.UpgradedSeleniumITBase;
20  import org.apache.commons.logging.Log;
21  import org.apache.commons.logging.LogFactory;
22  import org.junit.Test;
23  import org.kuali.rice.krad.uif.UifConstants;
24  
25  import java.util.HashMap;
26  import java.util.Map;
27  
28  import static org.junit.Assert.*;
29  
30  /**
31   *  Tests that the data attributes are rendered as expected for all controls
32   * 
33   * @author Kuali Rice Team (rice.collab@kuali.org)
34   */
35  public class UifDataAttributesIT extends UpgradedSeleniumITBase {
36      @Override
37      public String getTestUrl() {
38          return ITUtil.PORTAL;
39      }
40  
41      private  Log log = LogFactory.getLog(getClass());
42  
43      /**
44       * verify that a tag has simple data attributes
45       *
46       * @param tag - html tag e.g. img or a
47       * @param tagId - derived from the bean id set in the view
48       * @param tagIdSuffix - where applicable, a suffix that is appended to the control by krad e.g. _control
49       */
50      private void verifySimpleAttributes(String tag, String tagId, String tagIdSuffix) {
51          // test the attributes that are set via the data attributes list
52          tagId = tagId + tagIdSuffix;
53          String simpleAttributesXpath="//" + tag + "[(@id='" + tagId + "') and (@data-iconTemplateName='cool-icon-%s.png') and (@data-transitions='3')]";
54          assertTrue(tagId + " does not have simple data attributes (via list) present", isElementPresent(simpleAttributesXpath));
55          verifyStaticDataAttributes(tag, tagId);
56  
57      }
58  
59      /**
60       * test the attributes that are set via the data*Attribute properties
61       *
62       * @param tag - html tag e.g. img or a
63       * @param tagId - the html tag id - a combination of bean id and any suffix
64       */
65      private void verifyStaticDataAttributes(String tag, String tagId) {
66          final String simpleAttributesXpath;
67          simpleAttributesXpath="//" + tag + "[(@id='" + tagId + "')"
68                  + " and (@data-role='role') and (@data-type='type') and (@data-meta='meta')]";
69          assertTrue(tagId + " does not have simple data attributes (via data*Attribute) properties present",
70                  isElementPresent(simpleAttributesXpath));
71      }
72  
73      /**
74       * check that complex attributes exist in the script
75       *
76       * @param tagId - the expected tag id
77       * @param suffix - the expected suffix e.g. _button
78       */
79      private void verifyComplexAttributes(String tagId, String suffix) {
80          tagId = tagId + suffix;
81          String complexAttributesXpath="//input[(@type='hidden') and (@data-role='dataScript') and (@data-for='"+ tagId +  "')]";
82          assertTrue(tagId + ": complex data attributes script not found", isElementPresent(complexAttributesXpath));
83  
84          // the message field does not support complex attributes
85          //if (!tagId.equalsIgnoreCase("messageField")) {
86              String scriptValue = getAttribute(complexAttributesXpath + "@value");
87              assertNotNull("script value is null",scriptValue);
88          boolean ok = scriptValue.contains(
89                  "jQuery('#" + tagId + "').data('capitals', {kenya:'nairobi', uganda:'kampala', tanzania:'dar'});")
90                  && scriptValue.contains("jQuery('#" + tagId + "').data('intervals', {short:2, medium:5, long:13});");
91          if (!ok) {
92              log.info("scriptValue for " + tagId + " is " + scriptValue);
93          }
94          // check for complex attributes
95          assertTrue(tagId + ": complex attributes script does not contain expected code", ok);
96          //}
97      }
98  
99      /**
100      * check that all attributes exist in the script
101      *
102      * @param tagId - the expected tag id
103      * @param suffix - the expected suffix e.g. _control
104      * @return true if all attributes were found in script, false otherwise
105      */
106     private boolean verifyAllAttributesInScript(String tagId, String suffix) {
107         tagId = tagId + suffix;
108         String complexAttributesXpath="//input[(@type='hidden') and (@data-for='"+ tagId +  "')]";
109         assertTrue(tagId + ": complex data attributes script not found see https://jira.kuali.org/browse/KULRICE-7752", isElementPresent(complexAttributesXpath));
110 
111         // the message field does not support complex attributes
112         String scriptValue = getAttribute(complexAttributesXpath + "@value");
113         assertNotNull("script value is null",scriptValue);
114         // log.info("scriptValue for " + tagId + " is " + scriptValue);
115         return scriptValue.contains("jQuery('#" + tagId + "').data('transitions', 3);") &&
116                 scriptValue.contains("jQuery('#" + tagId + "').data('iconTemplateName', 'cool-icon-%s.png');") &&
117                 scriptValue.contains("jQuery('#" + tagId + "').data('capitals', {kenya:'nairobi', uganda:'kampala', tanzania:'dar'});") &&
118                 scriptValue.contains("jQuery('#" + tagId + "').data('intervals', {short:2, medium:5, long:13});");
119     }
120 
121 
122     /**
123      * Tests that the data attributes are rendered as expected for all controls
124      */
125     @Test
126     public void testDataAttributesPresentInControls () {
127         assertEquals("Kuali Portal Index", getTitle());
128         open( "/kr-dev/kr-krad/data-attributes-test-uif-controller?viewId=dataAttributesView_selenium&methodToCall=start");
129         waitForPageToLoad(); // if this times out make a special one that 50000
130 
131         // custom suffix to mark  test bean ids
132         String testIdSuffix = "_attrs";
133         // input fields, whose controls are implemented as spring form tags, will have both simple and complex attributes set via a script
134         // KULRICE-7752 : UifDataAttributesIT testDataAttributesPresentInControls textInputField_attrs_control: complex data attributes script not found
135         String[] inputControls = {"textInputField", "textAreaInputField", "dropDown", "datePicker", "fileUpload", "userControl",
136                 "spinnerControl", "hiddenControl", "checkBox"};//, "radioButton",
137         for (int i=0; i<inputControls.length; i++) {
138             assertTrue(inputControls[i] + ": script does not contain expected code",
139                     verifyAllAttributesInScript(inputControls[i], testIdSuffix + UifConstants.IdSuffixes.CONTROL));
140             String tag = "input";
141             if (inputControls[i].equalsIgnoreCase("textAreaInputField")) {
142                 tag = "textarea";
143             } else if (inputControls[i].equalsIgnoreCase("dropDown")) {
144                 tag = "select";
145             }
146             try {
147                 verifyStaticDataAttributes(tag, inputControls[i] + testIdSuffix + UifConstants.IdSuffixes.CONTROL);
148             } catch (AssertionError ae) {
149                 assertTrue("KULRICE-7752 : UifDataAttributesIT testDataAttributesPresentInControls textInputField_attrs_control: complex data attributes script not found", false);
150             }
151         }
152         // these controls allow for simple attributes on the tag and complex attributes via js
153         Map<String, String[]> otherControlsMap = new HashMap<String, String[]>();
154         // controls whose simple attributes are set in an img tag
155         String[] imgControls = {"imageField_image"};
156         // fields whose simple attributes are set in an anchor tag
157         String[] anchorFields = {"navigationLink", "actionLink-noImage", "actionLink-imageRight", "actionLink-imageLeft",
158                 "linkField", "linkElement"};
159         // fields whose simple attributes are set in a span tag
160         String[] spanFields = {"messageField", "spaceField"};
161         // fields whose simple attributes are set in an input tag
162         String[] inputFields = {"imageAction"};
163         // fields whose simple attributes are set in button tag
164         String[] buttonElements = {"buttonTextOnly", "buttonImageBottom", "buttonImageLeft", "buttonImageTop", "buttonImageRight"};
165         // iframe field
166         String[] iframeField = {"iframe"};
167         
168         otherControlsMap.put("img", imgControls);
169         otherControlsMap.put("a", anchorFields);
170         otherControlsMap.put("span", spanFields);
171         otherControlsMap.put("input", inputFields);
172         otherControlsMap.put("button", buttonElements);
173         otherControlsMap.put("iframe", iframeField);
174 
175         // a map to hold the tags where the simple attributes are affixed
176         // if a tag is not here, a empty string will be used for the suffix
177         Map<String, String> simpleTagIdSuffix = new HashMap<String, String>();
178         simpleTagIdSuffix.put("span", "_span");
179         
180 
181         for (String tag: otherControlsMap.keySet()) {
182             String[] controlIds = otherControlsMap.get(tag);
183             for (int i=0; i<controlIds.length; i++) {
184                 String tagId = controlIds[i];
185 
186                 // check for complex attributes
187                 verifyComplexAttributes(tagId, testIdSuffix);
188 
189                 // determine whether we are using a tag id suffix for the simple attributes
190                 String tagIdSuffix = testIdSuffix;
191                 if (simpleTagIdSuffix.containsKey(tag)) {
192                     tagIdSuffix = tagIdSuffix + simpleTagIdSuffix.get(tag);
193                 }
194 
195                 // check for simple attributes
196                 verifySimpleAttributes(tag, tagId, tagIdSuffix);
197             }
198             
199             // test label field - which uses the tagId suffix for both the simple attributes and complex
200             String tagId = "textInputField";
201             String tagIdSuffix = testIdSuffix + "_label";
202             // check for complex attributes
203             verifyComplexAttributes(tagId, tagIdSuffix);
204             // check for simple attributes
205             verifySimpleAttributes("label", tagId, tagIdSuffix);
206 
207             //test that the radio buttons have the 3 data attributes that can appear in the tag
208             tagId = "radioButton" + testIdSuffix + UifConstants.IdSuffixes.CONTROL;
209             String[] radioButtonIds = {tagId + "1", tagId + "2"};
210             for (String id: radioButtonIds) {
211                 verifyStaticDataAttributes("input", id);
212             }
213             //test that all complex and simple attributes set via the list are in a script
214             verifyAllAttributesInScript(tagId, "");
215         }
216     }
217 }