001 /* 002 * Copyright 2006-2012 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.samplu.travel.krad.test; 017 018 import edu.samplu.common.ITUtil; 019 import edu.samplu.common.UpgradedSeleniumITBase; 020 import org.apache.commons.logging.Log; 021 import org.apache.commons.logging.LogFactory; 022 import org.junit.Test; 023 import org.kuali.rice.krad.uif.UifConstants; 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 UifDataAttributesIT extends UpgradedSeleniumITBase { 036 @Override 037 public String getTestUrl() { 038 return ITUtil.PORTAL; 039 } 040 041 private Log log = LogFactory.getLog(getClass()); 042 043 /** 044 * verify that a tag has simple data attributes 045 * 046 * @param tag - html tag e.g. img or a 047 * @param tagId - derived from the bean id set in the view 048 * @param tagIdSuffix - where applicable, a suffix that is appended to the control by krad e.g. _control 049 */ 050 private void verifySimpleAttributes(String tag, String tagId, String tagIdSuffix) { 051 // test the attributes that are set via the data attributes list 052 tagId = tagId + tagIdSuffix; 053 String simpleAttributesXpath="//" + tag + "[(@id='" + tagId + "') and (@data-iconTemplateName='cool-icon-%s.png') and (@data-transitions='3')]"; 054 assertTrue(tagId + " does not have simple data attributes (via list) present", isElementPresent(simpleAttributesXpath)); 055 verifyStaticDataAttributes(tag, tagId); 056 057 } 058 059 /** 060 * test the attributes that are set via the data*Attribute properties 061 * 062 * @param tag - html tag e.g. img or a 063 * @param tagId - the html tag id - a combination of bean id and any suffix 064 */ 065 private void verifyStaticDataAttributes(String tag, String tagId) { 066 final String simpleAttributesXpath; 067 simpleAttributesXpath="//" + tag + "[(@id='" + tagId + "')" 068 + " and (@data-role='role') and (@data-type='type') and (@data-meta='meta')]"; 069 assertTrue(tagId + " does not have simple data attributes (via data*Attribute) properties present", 070 isElementPresent(simpleAttributesXpath)); 071 } 072 073 /** 074 * check that complex attributes exist in the script 075 * 076 * @param tagId - the expected tag id 077 * @param suffix - the expected suffix e.g. _button 078 */ 079 private void verifyComplexAttributes(String tagId, String suffix) { 080 tagId = tagId + suffix; 081 String complexAttributesXpath="//input[(@type='hidden') and (@data-role='dataScript') and (@data-for='"+ tagId + "')]"; 082 assertTrue(tagId + ": complex data attributes script not found", isElementPresent(complexAttributesXpath)); 083 084 // the message field does not support complex attributes 085 //if (!tagId.equalsIgnoreCase("messageField")) { 086 String scriptValue = getAttribute(complexAttributesXpath + "@value"); 087 assertNotNull("script value is null",scriptValue); 088 boolean ok = scriptValue.contains( 089 "jQuery('#" + tagId + "').data('capitals', {kenya:'nairobi', uganda:'kampala', tanzania:'dar'});") 090 && scriptValue.contains("jQuery('#" + tagId + "').data('intervals', {short:2, medium:5, long:13});"); 091 if (!ok) { 092 log.info("scriptValue for " + tagId + " is " + scriptValue); 093 } 094 // check for complex attributes 095 assertTrue(tagId + ": complex attributes script does not contain expected code", ok); 096 //} 097 } 098 099 /** 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 }