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 017 package edu.samplu.admin.test; 018 019 020 021 import java.net.URL; 022 import java.net.URLEncoder; 023 import java.util.Arrays; 024 import java.util.HashMap; 025 import java.util.Iterator; 026 import java.util.List; 027 import java.util.Map; 028 029 import com.thoughtworks.selenium.DefaultSelenium; 030 import com.thoughtworks.selenium.Selenium; 031 import org.apache.commons.lang.StringUtils; 032 import org.junit.After; 033 import org.junit.Before; 034 import org.junit.Ignore; 035 import org.junit.Test; 036 import org.kuali.rice.kew.docsearch.DocumentSearchCriteriaProcessorKEWAdapter; 037 import org.kuali.rice.kew.impl.document.search.DocumentSearchCriteriaBoLookupableHelperService; 038 import org.kuali.rice.kew.util.Utilities; 039 040 import com.gargoylesoftware.htmlunit.ElementNotFoundException; 041 import com.gargoylesoftware.htmlunit.html.HtmlAnchor; 042 import com.gargoylesoftware.htmlunit.html.HtmlInput; 043 import com.gargoylesoftware.htmlunit.html.HtmlPage; 044 import org.kuali.rice.krad.util.KRADConstants; 045 import org.openqa.selenium.By; 046 import org.openqa.selenium.NoSuchElementException; 047 import org.openqa.selenium.WebDriver; 048 import org.openqa.selenium.WebDriverBackedSelenium; 049 import org.openqa.selenium.WebElement; 050 import org.openqa.selenium.firefox.FirefoxDriver; 051 import org.openqa.selenium.remote.DesiredCapabilities; 052 import org.openqa.selenium.remote.RemoteWebDriver; 053 054 import static org.junit.Assert.*; 055 import static org.junit.Assert.assertEquals; 056 057 /** 058 * Tests docsearch url parameters 059 */ 060 @Ignore 061 public class DocumentSearchURLParametersIT { 062 private static final String ADMIN_USER_NETWORK_ID = "admin"; 063 064 private WebDriver driver; 065 private String base; 066 067 private static final String DOCUMENT_TYPE_NAME = "KualiNotification"; 068 private static final String ADVANCED_SEARCH_ONLY_FIELD = "applicationDocumentId"; 069 070 private static final Map<String, String> CORE_FIELDS = new HashMap<String, String>(); 071 static { 072 // basic 073 CORE_FIELDS.put("documentTypeName", DOCUMENT_TYPE_NAME); 074 CORE_FIELDS.put("documentId", "1234"); 075 CORE_FIELDS.put("initiatorPrincipalName", "CURRENT_USER"); 076 CORE_FIELDS.put("dateCreated", "11/11/11"); 077 078 } 079 private static final Map<String, String> BASIC_FIELDS = new HashMap<String, String>(); 080 static { 081 BASIC_FIELDS.putAll(CORE_FIELDS); 082 // searchable attrs 083 BASIC_FIELDS.put("documentAttribute.notificationContentType", "testType"); 084 BASIC_FIELDS.put("documentAttribute.notificationChannel", "testChannel"); 085 BASIC_FIELDS.put("documentAttribute.notificationProducer", "testProducer"); 086 BASIC_FIELDS.put("documentAttribute.notificationPriority", "testPriority"); 087 BASIC_FIELDS.put("documentAttribute.notificationRecipients", "testRecipients"); 088 BASIC_FIELDS.put("documentAttribute.notificationSenders", "testSenders"); 089 BASIC_FIELDS.put("saveName", "testBasicSearchFields_saved_search"); 090 BASIC_FIELDS.put("isAdvancedSearch", "NO"); 091 } 092 093 private static final Map<String, String> ADVANCED_FIELDS = new HashMap<String, String>(); 094 static { 095 ADVANCED_FIELDS.put("approverPrincipalName", "testApproverName"); 096 ADVANCED_FIELDS.put("viewerPrincipalName", "testViewerName"); 097 ADVANCED_FIELDS.put("applicationDocumentId", "testApplicationDocumentId"); 098 // ADVANCED_FIELDS.put("routeNodeName", "Adhoc Routing"); 099 ADVANCED_FIELDS.put("dateApproved", "01/01/01"); 100 ADVANCED_FIELDS.put("dateLastModified", "02/02/02"); 101 ADVANCED_FIELDS.put("dateFinalized", "03/03/03"); 102 ADVANCED_FIELDS.put("title", "test title"); 103 ADVANCED_FIELDS.put("isAdvancedSearch", "YES"); 104 } 105 106 @Before 107 public void setUp() throws Exception { 108 driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), DesiredCapabilities.firefox()); 109 // default to locally running dev sampleapp 110 base = StringUtils.defaultIfEmpty(System.getProperty("remote.public.url"), "http://localhost:8080/kr-dev"); 111 } 112 113 @After 114 public void tearDown() throws Exception { 115 driver.quit(); 116 } 117 118 private void performLogin() { 119 driver.get(base); 120 assertEquals("Login", driver.getTitle()); 121 driver.findElement(By.name("__login_user")).sendKeys(ADMIN_USER_NETWORK_ID); 122 driver.findElement(By.xpath("//input[@value='Login']")).click(); 123 } 124 125 private String getDocSearchURL(Map<String, String> params) { 126 StringBuilder sb = new StringBuilder(); 127 for (Map.Entry<String, String> entry: params.entrySet()) { 128 sb.append(URLEncoder.encode(entry.getKey()) + "=" + URLEncoder.encode(entry.getValue()) + "&"); 129 } 130 return getDocSearchURL(sb.toString()); 131 132 } 133 private String getDocSearchURL(String params) { 134 return base + "/kew/DocumentSearch.do?" + params; 135 } 136 137 private WebElement findElementByTagAndName(String tag, String name) { 138 return driver.findElement(By.xpath("//" + tag + "[@name='" + name + "']")); 139 } 140 141 private WebElement findInput(String name) { 142 return findElementByTagAndName("input", name); 143 } 144 145 private WebElement findModeToggleButton() { 146 WebElement toggleAdvancedSearch = null; 147 try { 148 return driver.findElement(By.id("toggleAdvancedSearch")); 149 } catch (NoSuchElementException e) { 150 fail("toggleAdvancedSearch button not found"); 151 return null; 152 } 153 } 154 155 private void assertSearchDetailMode(WebElement e, boolean advanced) { 156 assertEquals((advanced ? "basic" : "detailed") + " search", e.getAttribute("title")); 157 158 try { 159 findInput(ADVANCED_SEARCH_ONLY_FIELD); 160 if (!advanced) fail("Advanced search field found in basic search"); 161 } catch (NoSuchElementException nsee) { 162 if (advanced) fail("Advanced search field not found in advancedsearch"); 163 } 164 } 165 166 @Test 167 public void testBasicSearchMode() throws InterruptedException{ 168 performLogin(); 169 driver.get(getDocSearchURL("")); 170 WebElement toggle = findModeToggleButton(); 171 assertSearchDetailMode(toggle, false); 172 toggle.click(); 173 assertSearchDetailMode(findModeToggleButton(), true); 174 } 175 176 @Test 177 public void testAdvancedSearchMode() { 178 performLogin(); 179 driver.get(getDocSearchURL((KRADConstants.ADVANCED_SEARCH_FIELD + "=YES"))); 180 WebElement toggle = findModeToggleButton(); 181 assertSearchDetailMode(toggle, true); 182 toggle.click(); 183 assertSearchDetailMode(findModeToggleButton(), false); 184 } 185 186 @Test 187 public void testHeaderBarDisabled() throws InterruptedException{ 188 performLogin(); 189 190 driver.get(getDocSearchURL("headerBarEnabled=false")); 191 assertTrue(driver.findElements(By.id("headerarea-small")).isEmpty()); 192 assertInputPresence(CORE_FIELDS, true); 193 driver.get(getDocSearchURL("headerBarEnabled=true")); 194 assertFalse(driver.findElements(By.id("headerarea-small")).isEmpty()); 195 assertInputPresence(CORE_FIELDS, true); 196 } 197 198 @Test 199 public void testCriteriaDisabled() throws InterruptedException{ 200 performLogin(); 201 driver.get(getDocSearchURL("searchCriteriaEnabled=NO")); 202 assertInputPresence(CORE_FIELDS, false); 203 driver.get(getDocSearchURL("searchCriteriaEnabled=true")); 204 assertInputPresence(CORE_FIELDS, true); 205 } 206 207 @Test 208 public void testBasicSearchFields() throws InterruptedException{ 209 performLogin(); 210 211 // criteria.initiator=delyea&criteria.docTypeFullName=" + documentTypeName + 212 driver.get(getDocSearchURL(BASIC_FIELDS)); 213 214 assertInputValues(BASIC_FIELDS); 215 216 driver.findElement(By.id("toggleAdvancedSearch")).click(); 217 218 Map<String, String> expected = new HashMap<String, String>(BASIC_FIELDS); 219 for (Map.Entry<String, String> entry: ADVANCED_FIELDS.entrySet()) { 220 if (!"isAdvancedSearch".equals(entry.getKey())) { 221 expected.put(entry.getKey(), ""); 222 } else { 223 expected.put(entry.getKey(), entry.getValue()); 224 } 225 } 226 assertInputValues(expected); 227 } 228 229 @Test 230 public void testBasicSearchFieldsAndExecuteSearch() throws InterruptedException { 231 performLogin(); 232 233 // criteria.initiator=delyea&criteria.docTypeFullName=" + documentTypeName + 234 Map<String, String> fields = new HashMap<String, String>(); 235 fields.putAll(BASIC_FIELDS); 236 fields.put("methodToCall", "search"); 237 driver.get(getDocSearchURL(fields)); 238 239 assertInputValues(BASIC_FIELDS); 240 241 // verify that it attempted the search 242 assertTrue(driver.getPageSource().contains("No values match this search")); 243 244 driver.findElement(By.id("toggleAdvancedSearch")).click(); 245 246 Map<String, String> expected = new HashMap<String, String>(BASIC_FIELDS); 247 for (Map.Entry<String, String> entry: ADVANCED_FIELDS.entrySet()) { 248 if (!"isAdvancedSearch".equals(entry.getKey())) { 249 expected.put(entry.getKey(), ""); 250 } else { 251 expected.put(entry.getKey(), entry.getValue()); 252 } 253 } 254 assertInputValues(expected); 255 256 // I guess switching modes doesn't re-execute the search 257 // assertTrue(driver.getPageSource().contains("No values match this search")); 258 } 259 260 @Test 261 public void testBasicSearchFieldsAndExecuteSearchWithHiddenCriteria() throws InterruptedException { 262 performLogin(); 263 264 // criteria.initiator=delyea&criteria.docTypeFullName=" + documentTypeName + 265 Map<String, String> fields = new HashMap<String, String>(); 266 fields.putAll(BASIC_FIELDS); 267 fields.put("methodToCall", "search"); 268 fields.put("searchCriteriaEnabled", "NO"); 269 driver.get(getDocSearchURL(fields)); 270 271 assertInputPresence(BASIC_FIELDS, false); 272 273 // verify that it attempted the search 274 assertTrue(driver.getPageSource().contains("No values match this search")); 275 276 // NOTE: toggling modes re-enables the search criteria 277 } 278 279 @Test 280 public void testAdvancedSearchFields() throws InterruptedException{ 281 performLogin(); 282 283 // criteria.initiator=delyea&criteria.docTypeFullName=" + documentTypeName + 284 Map<String, String> values = new HashMap<String, String>(BASIC_FIELDS); 285 values.putAll(ADVANCED_FIELDS); 286 driver.get(getDocSearchURL(values)); 287 288 assertInputValues(values); 289 290 driver.findElement(By.id("toggleAdvancedSearch")).click(); 291 292 assertInputValues(BASIC_FIELDS); 293 } 294 295 @Test 296 public void testAdvancedSearchFieldsAndExecuteSearch() throws InterruptedException{ 297 performLogin(); 298 299 // criteria.initiator=delyea&criteria.docTypeFullName=" + documentTypeName + 300 Map<String, String> expected = new HashMap<String, String>(BASIC_FIELDS); 301 expected.putAll(ADVANCED_FIELDS); 302 303 Map<String, String> values = new HashMap<String, String>(expected); 304 values.put("methodToCall", "search"); 305 driver.get(getDocSearchURL(values)); 306 307 assertInputValues(expected); 308 309 // verify that it attempted the search 310 assertTrue(driver.getPageSource().contains("No values match this search")); 311 312 driver.findElement(By.id("toggleAdvancedSearch")).click(); 313 314 assertInputValues(BASIC_FIELDS); 315 } 316 317 @Test 318 public void testAdvancedSearchFieldsAndExecuteSearchWithHiddenCriteria() throws InterruptedException { 319 performLogin(); 320 321 // criteria.initiator=delyea&criteria.docTypeFullName=" + documentTypeName + 322 Map<String, String> expected = new HashMap<String, String>(BASIC_FIELDS); 323 expected.putAll(ADVANCED_FIELDS); 324 325 Map<String, String> values = new HashMap<String, String>(expected); 326 values.put("methodToCall", "search"); 327 values.put("searchCriteriaEnabled", "NO"); 328 driver.get(getDocSearchURL(values)); 329 330 assertInputPresence(expected, false); 331 332 // verify that it attempted the search 333 assertTrue(driver.getPageSource().contains("No values match this search")); 334 335 // NOTE: toggling modes re-enables the search criteria 336 } 337 338 /** 339 * Supplying a saveName does not result in the saved search getting loaded. 340 * @throws InterruptedException 341 */ 342 @Test 343 public void testSupplyingSavedSearchNameDoesNothing() throws InterruptedException { 344 performLogin(); 345 346 // get the search saved 347 driver.get(getDocSearchURL(BASIC_FIELDS)); 348 349 driver.get(getDocSearchURL("saveName=testBasicSearchFields_saved_search")); 350 351 Map<String, String> emptyForm = new HashMap<String, String>(); 352 for (String key: CORE_FIELDS.keySet()) { 353 emptyForm.put(key, ""); 354 } 355 356 assertInputValues(emptyForm); 357 } 358 359 private void assertInputValues(Map<String, String> fields) { 360 for (Map.Entry<String, String> entry: fields.entrySet()) { 361 String value = findInput(entry.getKey()).getAttribute("value"); 362 assertEquals("Field '" + entry.getKey() + "' expected '" + entry.getValue() + "' got '" + value + "'", entry.getValue(), value); 363 } 364 } 365 366 private void assertInputPresence(Map<String, String> fields, boolean present) { 367 for (String name: fields.keySet()) { 368 if (present) { 369 assertTrue("Expected field '" + name + "' to be present", driver.findElements(By.name(name)).size() != 0); 370 } else { 371 assertEquals("Expected field '" + name + "' not to be present", 0, driver.findElements(By.name(name)).size()); 372 } 373 } 374 } 375 }