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