/* * (C) Copyright 2014 Nuxeo SA (http://nuxeo.com/) and others. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Contributors: * <a href="mailto:grenard@nuxeo.com">Guillaume</a> */ package org.nuxeo.ftest.cap; import java.io.File; import java.io.IOException; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.nuxeo.functionaltests.AbstractTest; import org.nuxeo.functionaltests.AjaxRequestManager; import org.nuxeo.functionaltests.Assert; import org.nuxeo.functionaltests.Locator; import org.nuxeo.functionaltests.RestHelper; import org.nuxeo.functionaltests.ScreenshotTaker; import org.nuxeo.functionaltests.contentView.ContentViewElement; import org.nuxeo.functionaltests.contentView.ContentViewElement.ResultLayout; import org.nuxeo.functionaltests.forms.Select2WidgetElement; import org.nuxeo.functionaltests.pages.DocumentBasePage; import org.nuxeo.functionaltests.pages.DocumentBasePage.UserNotConnectedException; import org.nuxeo.functionaltests.pages.FileDocumentBasePage; import org.nuxeo.functionaltests.pages.HomePage; import org.nuxeo.functionaltests.pages.search.DefaultSearchSubPage; import org.nuxeo.functionaltests.pages.search.QuickSearchSubPage; import org.nuxeo.functionaltests.pages.search.SearchPage; import org.nuxeo.functionaltests.pages.search.SearchResultsSubPage; import org.nuxeo.functionaltests.pages.tabs.EditTabSubPage; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import static org.nuxeo.functionaltests.Constants.NXDOC_URL_FORMAT; import static org.nuxeo.functionaltests.Constants.WORKSPACES_PATH; import static org.nuxeo.functionaltests.Constants.WORKSPACE_TYPE; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; /** * @since 6.0 */ public class ITSearchTabTest extends AbstractTest { private final static String WORKSPACE1_TITLE = ITSearchTabTest.class.getSimpleName() + "_WorkspaceTitle1_" + new Date().getTime(); private final static String WORKSPACE2_TITLE = ITSearchTabTest.class.getSimpleName() + "_WorkspaceTitle2_" + new Date().getTime(); private static final String SEARCH_PATH = "/Domain/Workspaces/" + WORKSPACE1_TITLE; private static final String MY_FAVORITES_COLLECTION = "My Favorites"; public final static String[] SUBJECTS = { "Comics", "Religion", "Education" }; public final static String[] FULL_PATH_SUBJECTS = { "Art/Comics", "Society/Religion", "Society/Education" }; public final static String COVERAGE = "France"; public final static String FULL_PATH_COVERAGE = "Europe/France"; protected static final String SELECT_ALL_SAVED_SEARCHES_BUTTON_ID = "all_saved_searches:all_saved_searches_repeat:0:nxl_document_listing_table_1:listing_ajax_selection_box_with_current_document_header"; protected static final String PERMANENT_DELETE_SAVED_SEARCHES_BUTTON_ID = "all_saved_searches_buttons:nxw_savedSearchesCurrentSelectionDelete_form:nxw_savedSearchesCurrentSelectionDelete"; static final Log log = LogFactory.getLog(AbstractTest.class); @Before public void setup() throws UserNotConnectedException, IOException { RestHelper.createUser(TEST_USERNAME, TEST_PASSWORD, TEST_USERNAME, "lastname1", "company1", "email1", "members"); String wsId = RestHelper.createDocument(WORKSPACES_PATH, WORKSPACE_TYPE, WORKSPACE1_TITLE, null); RestHelper.createDocument(WORKSPACES_PATH, WORKSPACE_TYPE, WORKSPACE2_TITLE, null); RestHelper.addPermission(wsId, TEST_USERNAME, "Everything"); loginAsTestUser(); open(String.format(NXDOC_URL_FORMAT, wsId)); FileDocumentBasePage filePage = asPage(DocumentBasePage.class).createFile("Test file for ITSearchTabTest", "Test File description", false, null, null, null); EditTabSubPage editTabSubPage = filePage.getEditTab(); Select2WidgetElement subjectsWidget = new Select2WidgetElement(driver, driver.findElement(By.xpath("//*[@id='s2id_document_edit:nxl_dublincore:nxw_subjects_1_select2']")), true); subjectsWidget.selectValues(SUBJECTS); Select2WidgetElement coverageWidget = new Select2WidgetElement(driver, driver.findElement(By.xpath("//*[@id='s2id_document_edit:nxl_dublincore:nxw_coverage_1_select2']")), false); coverageWidget.selectValue(COVERAGE); editTabSubPage.save(); logout(); } @After public void after() throws UserNotConnectedException { RestHelper.cleanupUsers(); try { // test aggregate on deleted user, on user workspace DocumentBasePage documentBasePage = login(); SearchPage searchPage = documentBasePage.goToSearchPage(); DefaultSearchSubPage searchLayoutSubPage = searchPage.getDefaultSearch(); Map<String, Integer> authorAggs = searchLayoutSubPage.getAvailableAuthorAggregate(); // NXP-19617: take screenshot to help understanding potential randoms ScreenshotTaker taker = new ScreenshotTaker(); File screenShot = taker.takeScreenshot(driver, "ITSearchTabTest-after-authorAggs-"); log.warn("Screenshot taken for author '" + TEST_USERNAME + "' and aggs='" + authorAggs + "': " + screenShot.getAbsolutePath()); boolean testUserFound = false; for (Entry<String, Integer> e : authorAggs.entrySet()) { if (e.getKey().equals(TEST_USERNAME)) { testUserFound = true; break; } } assertTrue(testUserFound); } finally { RestHelper.cleanupDocuments(); } } @Test public void testSearch() throws UserNotConnectedException, IOException { DocumentBasePage documentBasePage = loginAsTestUser(); // navigate to saved searches tab to init cache (non regression test for NXP-18624) HomePage home = documentBasePage.goToHomePage().goToSavedSearches(); // no searches assertEquals(1, driver.findElements(By.className("emptyResult")).size()); SearchPage searchPage = home.goToSearchPage(); SearchResultsSubPage resultPanelSubPage = searchPage.getSearchResultsSubPage(); final int nbCurrentDoc = resultPanelSubPage.getNumberOfDocumentInCurrentPage(); assertTrue(nbCurrentDoc > 1); DefaultSearchSubPage searchLayoutSubPage = searchPage.getDefaultSearch(); // Test aggregates Map<String, Integer> coverageAgg = searchLayoutSubPage.getAvailableCoverageAggregate(); assertEquals(1, coverageAgg.size()); assertEquals(new Integer(1), coverageAgg.get(FULL_PATH_COVERAGE)); Map<String, Integer> subjectsAgg = searchLayoutSubPage.getAvailableSubjectsAggregate(); assertEquals(3, subjectsAgg.size()); for (String subject : FULL_PATH_SUBJECTS) { assertEquals(new Integer(1), subjectsAgg.get(subject)); } // Select and unselect France searchPage = searchLayoutSubPage.selectCoverageAggregate(FULL_PATH_COVERAGE); resultPanelSubPage = searchPage.getSearchResultsSubPage(); assertEquals(1, resultPanelSubPage.getNumberOfDocumentInCurrentPage()); searchPage = searchLayoutSubPage.selectCoverageAggregate(FULL_PATH_COVERAGE); assertEquals(nbCurrentDoc, resultPanelSubPage.getNumberOfDocumentInCurrentPage()); // Test select path widget resultPanelSubPage = searchPage.getSearchResultsSubPage(); searchLayoutSubPage = searchPage.getDefaultSearch(); searchLayoutSubPage.selectPath(SEARCH_PATH); searchPage = searchLayoutSubPage.filter(); resultPanelSubPage = searchPage.getSearchResultsSubPage(); assertEquals(1, resultPanelSubPage.getNumberOfDocumentInCurrentPage()); searchLayoutSubPage = searchPage.getDefaultSearch(); searchLayoutSubPage.deselectPath(SEARCH_PATH); searchPage = searchLayoutSubPage.filter(); resultPanelSubPage = searchPage.getSearchResultsSubPage(); assertEquals(nbCurrentDoc, resultPanelSubPage.getNumberOfDocumentInCurrentPage()); // Test Collections Widget resultPanelSubPage = searchPage.getSearchResultsSubPage(); searchLayoutSubPage = searchPage.getDefaultSearch(); searchLayoutSubPage.selectCollections(new String[] { MY_FAVORITES_COLLECTION }); searchPage = searchLayoutSubPage.filter(); searchLayoutSubPage = searchPage.getDefaultSearch(); resultPanelSubPage = searchPage.getSearchResultsSubPage(); assertEquals(0, resultPanelSubPage.getNumberOfDocumentInCurrentPage()); List<String> selectedCollections = searchLayoutSubPage.getSelectedCollections(); assertEquals(1, selectedCollections.size()); assertEquals(MY_FAVORITES_COLLECTION, selectedCollections.get(0)); // save this search String saveAsPath = "//input[contains(@id, 'nxw_saveSearch_link')]"; assertEquals(1, driver.findElements(By.xpath(saveAsPath)).size()); AjaxRequestManager arm = new AjaxRequestManager(driver); arm.begin(); Locator.findElementWaitUntilEnabledAndClick(By.xpath(saveAsPath)); arm.end(); WebElement fancybox = Locator.findElementWithTimeout(By.id("nxw_saveSearch_after_view_box")); String ssTitle = "Test Saved Search " + new Date().getTime(); fancybox.findElement(By.xpath(".//input[@type='text']")).sendKeys(ssTitle); arm.begin(); Locator.findElementWaitUntilEnabledAndClick(fancybox, By.xpath(".//input[@value='Save']")); arm.end(); SearchPage sp = asPage(SearchPage.class); assertEquals(ssTitle, sp.getSelectedSearch()); // check that search was saved in home sp.goToHomePage().goToSavedSearches(); assertEquals(1, driver.findElements(By.linkText(ssTitle)).size()); // navigate to it Locator.findElementWaitUntilEnabledAndClick(By.linkText(ssTitle)); // check home tab context is ok HomePage hp = asPage(HomePage.class); assertTrue(hp.isMainTabSelected(hp.homePageLink)); // delete saved searches hp.goToHomePage().goToSavedSearches(); arm = new AjaxRequestManager(driver); arm.begin(); Locator.findElementWaitUntilEnabledAndClick(By.id(SELECT_ALL_SAVED_SEARCHES_BUTTON_ID)); arm.end(); Locator.findElementWaitUntilEnabledAndClick(By.id(PERMANENT_DELETE_SAVED_SEARCHES_BUTTON_ID)); driver.switchTo().alert().accept(); logout(); } /* * NXP-19898 */ @Test public void testResultColumnSimpleSearch() throws UserNotConnectedException, IOException { DocumentBasePage documentBasePage = loginAsTestUser(); // Run a quick search SearchPage searchPage = documentBasePage.goToSearchPage(); QuickSearchSubPage quickSearch = searchPage.getQuickSearch(); quickSearch.filter(); // switch to listing SearchResultsSubPage resultSubPage = searchPage.getSearchResultsSubPage(); ContentViewElement contentView = resultSubPage.getContentView().switchToResultLayout(ResultLayout.LISTING); // add column WebElement addColumn = contentView.getActionByTitle("Edit Result Columns"); AjaxRequestManager arm = new AjaxRequestManager(driver); arm.begin(); addColumn.click(); arm.end(); WebElement fancybox = Locator.findElementWithTimeout(By.id("fancybox-content")); WebElement listShuttle = fancybox.findElement(By.className("listShuttleTable")); listShuttle.findElement( By.xpath(".//td[@class=\"listShuttleSelectElements\"]//option[@value=\"contributors\"]")).click(); listShuttle.findElement(By .xpath(".//td[@class=\"listShuttleSelectionActions\"]/a[contains(@id, 'nxw_template_addToSelection')]")) .click(); arm.begin(); Locator.findElementWaitUntilEnabledAndClick(fancybox, By.xpath(".//input[@value='Save']")); arm.end(); // save this search arm.begin(); Locator.findElementWaitUntilEnabledAndClick(By.xpath("//input[contains(@id, 'nxw_saveSearch_link')]")); arm.end(); fancybox = Locator.findElementWithTimeout(By.id("nxw_saveSearch_after_view_box")); String ssTitle = "Test Saved Search " + new Date().getTime(); fancybox.findElement(By.xpath(".//input[@type='text']")).sendKeys(ssTitle); arm.begin(); Locator.findElementWaitUntilEnabledAndClick(fancybox, By.xpath(".//input[@value='Save']")); arm.end(); // get default search searchPage.getDefaultSearch(); // get saved search quickSearch = searchPage.getSearch(ssTitle, QuickSearchSubPage.class); resultSubPage = searchPage.getSearchResultsSubPage(); assertEquals(ResultLayout.LISTING, resultSubPage.getContentView().getResultLayout()); Assert.hasElement(By.xpath("//span[@class=\"colHeader\" && text()='Contributors'")); // delete saved searches documentBasePage.goToHomePage().goToSavedSearches(); arm = new AjaxRequestManager(driver); arm.begin(); Locator.findElementWaitUntilEnabledAndClick(By.id(SELECT_ALL_SAVED_SEARCHES_BUTTON_ID)); arm.end(); Locator.findElementWaitUntilEnabledAndClick(By.id(PERMANENT_DELETE_SAVED_SEARCHES_BUTTON_ID)); driver.switchTo().alert().accept(); logout(); } }