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.admin;
017
018 import org.junit.Test;
019 import org.kuali.rice.krad.util.KRADConstants;
020 import org.kuali.rice.testtools.selenium.AutomatedFunctionalTestUtils;
021 import org.kuali.rice.testtools.selenium.WebDriverITBase;
022 import org.kuali.rice.testtools.selenium.WebDriverUtils;
023 import org.openqa.selenium.By;
024 import org.openqa.selenium.NoSuchElementException;
025 import org.openqa.selenium.WebElement;
026
027 import java.net.URLEncoder;
028 import java.util.HashMap;
029 import java.util.Map;
030 import java.util.concurrent.TimeUnit;
031
032 import static com.thoughtworks.selenium.SeleneseTestBase.assertFalse;
033 import static com.thoughtworks.selenium.SeleneseTestBase.assertTrue;
034 import static com.thoughtworks.selenium.SeleneseTestCase.assertEquals;
035
036 /**
037 * Tests docsearch url parameters
038 * @author Kuali Rice Team (rice.collab@kuali.org)
039 */
040 public class DocumentSearchUrlParametersAft extends WebDriverITBase {
041
042 @Override
043 public String getTestUrl() {
044 return AutomatedFunctionalTestUtils.PORTAL;
045 }
046
047 private static final String DOCUMENT_TYPE_NAME = "KualiNotification";
048 private static final String ADVANCED_SEARCH_ONLY_FIELD = "applicationDocumentId";
049
050 protected static final Map<String, String> CORE_FIELDS = new HashMap<String, String>();
051 static {
052 // basic
053 CORE_FIELDS.put("documentTypeName", DOCUMENT_TYPE_NAME);
054 CORE_FIELDS.put("documentId", "1234");
055 CORE_FIELDS.put("initiatorPrincipalName", "CURRENT_USER");
056 CORE_FIELDS.put("dateCreated", "11/11/11");
057
058 }
059 protected static final Map<String, String> BASIC_FIELDS = new HashMap<String, String>();
060 static {
061 BASIC_FIELDS.putAll(CORE_FIELDS);
062 // searchable attrs
063 BASIC_FIELDS.put("documentAttribute.notificationContentType", "testType");
064 BASIC_FIELDS.put("documentAttribute.notificationChannel", "testChannel");
065 BASIC_FIELDS.put("documentAttribute.notificationProducer", "testProducer");
066 BASIC_FIELDS.put("documentAttribute.notificationPriority", "testPriority");
067 BASIC_FIELDS.put("documentAttribute.notificationRecipients", "testRecipients");
068 BASIC_FIELDS.put("documentAttribute.notificationSenders", "testSenders");
069 BASIC_FIELDS.put("saveName", "testBasicSearchFields_saved_search");
070 BASIC_FIELDS.put("isAdvancedSearch", "NO");
071 }
072
073 protected static final Map<String, String> ADVANCED_FIELDS = new HashMap<String, String>();
074 static {
075 ADVANCED_FIELDS.put("approverPrincipalName", "testApproverName");
076 ADVANCED_FIELDS.put("viewerPrincipalName", "testViewerName");
077 ADVANCED_FIELDS.put("applicationDocumentId", "testApplicationDocumentId");
078 // ADVANCED_FIELDS.put("routeNodeName", "Adhoc Routing");
079 ADVANCED_FIELDS.put("dateApproved", "01/01/01");
080 ADVANCED_FIELDS.put("dateLastModified", "02/02/02");
081 ADVANCED_FIELDS.put("dateFinalized", "03/03/03");
082 ADVANCED_FIELDS.put("title", "test title");
083 ADVANCED_FIELDS.put("isAdvancedSearch", "YES");
084 }
085
086 String getDocSearchURL(Map<String, String> params) {
087 StringBuilder sb = new StringBuilder();
088 for (Map.Entry<String, String> entry: params.entrySet()) {
089 sb.append(URLEncoder.encode(entry.getKey()) + "=" + URLEncoder.encode(entry.getValue()) + "&");
090 }
091 return getDocSearchURL(sb.toString());
092
093 }
094 protected String getDocSearchURL(String params) {
095 return WebDriverUtils.getBaseUrlString() + "/kew/DocumentSearch.do?" + params;
096 }
097
098 private WebElement findElementByTagAndName(String tag, String name) {
099 return driver.findElement(By.cssSelector(tag + "[name=" + name + "]"));
100 }
101
102 private WebElement findInput(String name) {
103 return driver.findElement(By.xpath("//input[@name='" + name + "']"));
104 }
105
106 protected WebElement findModeToggleButton() {
107 WebElement toggleAdvancedSearch = null;
108 try {
109 return driver.findElement(By.id("toggleAdvancedSearch"));
110 } catch (NoSuchElementException e) {
111 fail("toggleAdvancedSearch button not found");
112 return null;
113 }
114 }
115
116 protected void assertSearchDetailMode(WebElement e, boolean advanced) {
117 assertEquals((advanced ? "basic" : "detailed") + " search", e.getAttribute("title"));
118
119 try {
120 findInput(ADVANCED_SEARCH_ONLY_FIELD);
121 if (!advanced) fail("Advanced search field found in basic search");
122 } catch (NoSuchElementException nsee) {
123 if (advanced) fail("Advanced search field not found in advancedsearch");
124 }
125 }
126
127 protected void assertInputValues(Map<String, String> fields) {
128 boolean quickmode = false;
129 for (Map.Entry<String, String> entry: fields.entrySet()) {
130 String value = findInput(entry.getKey()).getAttribute("value");
131 assertEquals("Field '" + entry.getKey() + "' expected '" + entry.getValue() + "' got '" + value + "'", entry.getValue(), value);
132 if (!quickmode) { // do the first find slow to make sure the screen has finished loading, then do them fast, else some tests take minutes to run
133 driver.manage().timeouts().implicitlyWait(WebDriverUtils.IMPLICIT_WAIT_TIME_LOOP_MS, TimeUnit.MILLISECONDS);
134 quickmode = true;
135 }
136 }
137 if (quickmode) {
138 driver.manage().timeouts().implicitlyWait(WebDriverUtils.configuredImplicityWait(), TimeUnit.SECONDS);
139 }
140 }
141
142 protected void assertInputPresence(Map<String, String> fields, boolean present) {
143 boolean quickmode = false;
144 for (String name: fields.keySet()) {
145 if (present) {
146 assertTrue("Expected field '" + name + "' to be present", driver.findElements(By.name(name)).size() != 0);
147 } else {
148 assertEquals("Expected field '" + name + "' not to be present", 0, driver.findElements(By.name(name)).size());
149 }
150 if (!quickmode) { // do the first find slow to make sure the screen has finished loading, then do them fast, else some tests take minutes to run
151 driver.manage().timeouts().implicitlyWait(WebDriverUtils.IMPLICIT_WAIT_TIME_LOOP_MS, TimeUnit.MILLISECONDS);
152 quickmode = true;
153 }
154 }
155 if (quickmode) {
156 driver.manage().timeouts().implicitlyWait(WebDriverUtils.configuredImplicityWait(), TimeUnit.SECONDS);
157 }
158 }
159
160 @Test
161 public void testAdvancedSearchFields() throws InterruptedException{
162 // criteria.initiator=delyea&criteria.docTypeFullName=" + documentTypeName +
163 Map<String, String> values = new HashMap<String, String>(BASIC_FIELDS);
164 values.putAll(ADVANCED_FIELDS);
165 driver.get(getDocSearchURL(values));
166
167 assertInputValues(values);
168
169 driver.findElement(By.id("toggleAdvancedSearch")).click();
170
171 assertInputValues(BASIC_FIELDS);
172 }
173
174 @Test
175 public void testAdvancedSearchFieldsAndExecuteSearch() throws InterruptedException{
176 // criteria.initiator=delyea&criteria.docTypeFullName=" + documentTypeName +
177 Map<String, String> expected = new HashMap<String, String>(BASIC_FIELDS);
178 expected.putAll(ADVANCED_FIELDS);
179
180 Map<String, String> values = new HashMap<String, String>(expected);
181 values.put("methodToCall", "search");
182 driver.get(getDocSearchURL(values));
183
184 assertInputValues(expected);
185
186 // verify that it attempted the search
187 assertTrue(driver.getPageSource().contains("No values match this search"));
188
189 driver.findElement(By.id("toggleAdvancedSearch")).click();
190
191 assertInputValues(BASIC_FIELDS);
192 }
193
194 @Test
195 public void testAdvancedSearchFieldsAndExecuteSearchWithHiddenCriteria() throws InterruptedException {
196 // criteria.initiator=delyea&criteria.docTypeFullName=" + documentTypeName +
197 Map<String, String> expected = new HashMap<String, String>(BASIC_FIELDS);
198 expected.putAll(ADVANCED_FIELDS);
199
200 Map<String, String> values = new HashMap<String, String>(expected);
201 values.put("methodToCall", "search");
202 values.put("searchCriteriaEnabled", "NO");
203 driver.get(getDocSearchURL(values));
204
205 assertInputPresence(expected, false);
206
207 // verify that it attempted the search
208 assertTrue(driver.getPageSource().contains("No values match this search"));
209
210 // NOTE: toggling modes re-enables the search criteria
211 }
212
213 @Test
214 public void testAdvancedSearchMode() {
215 driver.get(getDocSearchURL((KRADConstants.ADVANCED_SEARCH_FIELD + "=YES")));
216 WebElement toggle = findModeToggleButton();
217 assertSearchDetailMode(toggle, true);
218 toggle.click();
219 assertSearchDetailMode(findModeToggleButton(), false);
220 }
221
222 @Test
223 public void testBasicSearchFields() throws InterruptedException{
224 // criteria.initiator=delyea&criteria.docTypeFullName=" + documentTypeName +
225 driver.get(getDocSearchURL(BASIC_FIELDS));
226
227 assertInputValues(BASIC_FIELDS);
228
229 driver.findElement(By.id("toggleAdvancedSearch")).click();
230
231 Map<String, String> expected = new HashMap<String, String>(BASIC_FIELDS);
232 for (Map.Entry<String, String> entry: ADVANCED_FIELDS.entrySet()) {
233 if (!"isAdvancedSearch".equals(entry.getKey())) {
234 expected.put(entry.getKey(), "");
235 } else {
236 expected.put(entry.getKey(), entry.getValue());
237 }
238 }
239 assertInputValues(expected);
240 }
241
242 @Test
243 public void testBasicSearchFieldsAndExecuteSearch() throws InterruptedException {
244 // criteria.initiator=delyea&criteria.docTypeFullName=" + documentTypeName +
245 Map<String, String> fields = new HashMap<String, String>();
246 fields.putAll(BASIC_FIELDS);
247 fields.put("methodToCall", "search");
248 driver.get(getDocSearchURL(fields));
249
250 assertInputValues(BASIC_FIELDS);
251
252 // verify that it attempted the search
253 assertTrue(driver.getPageSource().contains("No values match this search"));
254
255 driver.findElement(By.id("toggleAdvancedSearch")).click();
256
257 Map<String, String> expected = new HashMap<String, String>(BASIC_FIELDS);
258 for (Map.Entry<String, String> entry: ADVANCED_FIELDS.entrySet()) {
259 if (!"isAdvancedSearch".equals(entry.getKey())) {
260 expected.put(entry.getKey(), "");
261 } else {
262 expected.put(entry.getKey(), entry.getValue());
263 }
264 }
265 assertInputValues(expected);
266
267 // I guess switching modes doesn't re-execute the search
268 // assertTrue(driver.getPageSource().contains("No values match this search"));
269 }
270
271 @Test
272 public void testBasicSearchFieldsAndExecuteSearchWithHiddenCriteria() throws InterruptedException {
273 // criteria.initiator=delyea&criteria.docTypeFullName=" + documentTypeName +
274 Map<String, String> fields = new HashMap<String, String>();
275 fields.putAll(BASIC_FIELDS);
276 fields.put("methodToCall", "search");
277 fields.put("searchCriteriaEnabled", "NO");
278 driver.get(getDocSearchURL(fields));
279
280 assertInputPresence(BASIC_FIELDS, false);
281
282 // verify that it attempted the search
283 assertTrue(driver.getPageSource().contains("No values match this search"));
284
285 // NOTE: toggling modes re-enables the search criteria
286 }
287
288 @Test
289 public void testBasicSearchMode() throws InterruptedException{
290 driver.get(getDocSearchURL(""));
291 WebElement toggle = findModeToggleButton();
292 assertSearchDetailMode(toggle, false);
293 toggle.click();
294 assertSearchDetailMode(findModeToggleButton(), true);
295 }
296
297 @Test
298 public void testCriteriaDisabled() throws InterruptedException{
299 driver.get(getDocSearchURL("searchCriteriaEnabled=NO"));
300 assertInputPresence(CORE_FIELDS, false);
301 driver.get(getDocSearchURL("searchCriteriaEnabled=true"));
302 assertInputPresence(CORE_FIELDS, true);
303 }
304
305 @Test
306 public void testHeaderBarDisabled() throws InterruptedException{
307 driver.get(getDocSearchURL("headerBarEnabled=false"));
308 assertTrue(driver.findElements(By.id("headerarea-small")).isEmpty());
309 assertInputPresence(CORE_FIELDS, true);
310 driver.get(getDocSearchURL("headerBarEnabled=true"));
311 assertFalse(driver.findElements(By.id("headerarea-small")).isEmpty());
312 assertInputPresence(CORE_FIELDS, true);
313 }
314
315 /**
316 * Supplying a saveName does not result in the saved search getting loaded.
317 * @throws InterruptedException
318 */
319 @Test
320 public void testSupplyingSavedSearchNameDoesNothing() throws InterruptedException {
321 // get the search saved
322 driver.get(getDocSearchURL(BASIC_FIELDS));
323
324 driver.get(getDocSearchURL("saveName=testBasicSearchFields_saved_search"));
325
326 Map<String, String> emptyForm = new HashMap<String, String>();
327 for (String key: CORE_FIELDS.keySet()) {
328 emptyForm.put(key, "");
329 }
330
331 assertInputValues(emptyForm);
332 }
333 }