/* * Copyright 2016 Hewlett-Packard Enterprise Development Company, L.P. * Licensed under the MIT License (the "License"); you may not use this file except in compliance with the License. */ package com.autonomy.abc.find; import com.autonomy.abc.base.FindTestBase; import com.autonomy.abc.selenium.find.FindPage; import com.autonomy.abc.selenium.find.FindService; import com.autonomy.abc.selenium.find.filters.AppliedFiltersPanel; import com.autonomy.abc.selenium.find.filters.DateOption; import com.autonomy.abc.selenium.find.filters.FilterContainer; import com.autonomy.abc.selenium.find.filters.FilterPanel; import com.autonomy.abc.selenium.find.filters.FindParametricFilter; import com.autonomy.abc.selenium.find.filters.ParametricFieldContainer; import com.autonomy.abc.selenium.find.filters.ParametricFilterModal; import com.autonomy.abc.selenium.find.results.DocumentViewer; import com.autonomy.abc.selenium.find.results.FindResult; import com.autonomy.abc.selenium.find.results.ListView; import com.autonomy.abc.selenium.query.IndexFilter; import com.autonomy.abc.selenium.query.Query; import com.autonomy.abc.selenium.query.StringDateFilter; import com.hp.autonomy.frontend.selenium.config.TestConfig; import com.hp.autonomy.frontend.selenium.framework.logging.ActiveBug; import com.hp.autonomy.frontend.selenium.framework.logging.ResolvedBug; import com.hp.autonomy.frontend.selenium.util.Waits; import org.apache.commons.lang3.text.WordUtils; import org.junit.Before; import org.junit.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.List; import java.util.stream.Collectors; import static com.hp.autonomy.frontend.selenium.framework.state.TestStateAssert.*; import static com.hp.autonomy.frontend.selenium.matchers.StringMatchers.containsString; import static org.hamcrest.Matchers.*; import static org.openqa.selenium.lift.Matchers.displayed; public class FilterITCase extends FindTestBase { private FindPage findPage; private FindService findService; public FilterITCase(final TestConfig config) { super(config); } @Before public void setUp() { findPage = getElementFactory().getFindPage(); findService = getApplication().findService(); findPage.goToListView(); } private ListView searchAndWait(final String searchTerm) { final ListView results = findService.search(searchTerm); findPage.waitForParametricValuesToLoad(); results.waitForResultsToLoad(); return results; } @Test public void testAllFiltersDefaultCollapsed() { searchAndWait("knee"); for (final FilterContainer container : filters().allFilterContainers()) { verifyThat("Container is collapsed", container.isCollapsed()); } } @Test @ResolvedBug("FIND-671") public void testDatabasesDisplayed() { searchAndWait("dark"); assertThat("Databases are not hidden", filters().indexesTreeContainer().getContainer(), displayed()); } @Test @ResolvedBug("FIND-638") public void testParametricFiltersResults() { final ListView results = searchAndWait("cheese"); final FilterPanel filterPanel = filters(); final List<ParametricFieldContainer> containers = filterPanel.parametricFieldContainers(); for (final ParametricFieldContainer container : containers) { final int numberFields = container.getFilters().size(); verifyThat("Field values: " + numberFields + " - less than or equal to 5", numberFields, lessThanOrEqualTo(5)); } final ParametricFieldContainer firstContainer = filterPanel.parametricField(filterPanel.nonZeroParamFieldContainer(0)); final FindParametricFilter firstField = firstContainer.getFilters().get(0); final String filterName = firstField.getName(); final int expectedResults = firstField.getResultsCount(); final int originalNumberOfResults = results.getTotalResultsNum(); assumeThat("Fewer results predicted w/ this filter", expectedResults, lessThan(originalNumberOfResults)); firstField.check(); results.waitForResultsToLoad(); verifyThat("Expected number of results (according to panel) equals actual number of results", results.getTotalResultsNum(), is(expectedResults)); Waits.loadOrFadeWait(); final ParametricFieldContainer container = filterPanel.parametricContainerOfFilter(filterName); final int filterNumber = container.getFilterCount(); final String filterCategory = container.filterCategoryName(); container.seeAll(); final ParametricFilterModal filterModal = ParametricFilterModal.getParametricModal(getDriver()); verifyThat("Filter category title shows the number of filters chosen from total", filterNumber, is(filterModal.filtersWithResultsForCurrentSearch())); filterPanel.checkboxForParametricValue(WordUtils.capitalize(filterCategory.toLowerCase()), filterName).uncheck(); findPage.waitForParametricValuesToLoad(); final int totalParametricFields = filterPanel.parametricFieldContainers().size(); searchAndWait("shouldhavenoresultsprobably"); findPage.ensureTermNotAutoCorrected(); findPage.waitForParametricValuesToLoad(); final int noResultsParametricFields = filterPanel.parametricFieldContainers().size(); verifyThat("Filters changed: no results -> parametric fields remain", noResultsParametricFields, is(totalParametricFields)); } @Test public void testModalOnlyContainsParametricFields() { searchAndWait("cheese"); final FilterPanel filterPanel = filters(); final List<String> parametricFields = filterPanel.parametricFieldContainers().stream() .map(ParametricFieldContainer::filterCategoryName) .collect(Collectors.toList()); final ParametricFieldContainer firstField = filterPanel.parametricField(0); firstField.expand(); firstField.seeAll(); final ParametricFilterModal filterModal = ParametricFilterModal.getParametricModal(getDriver()); filterModal.waitForLoad(); final List<String> modalFields = filterModal.tabNames() .stream() .map(String::toUpperCase) .collect(Collectors.toList()); modalFields.forEach(tabName -> verifyThat("Modal field with name " + tabName + " is parametric", parametricFields, hasItem(tabName))); verifyThat("Parametric filter and modal field ordering identical", modalFields, equalTo(parametricFields)); filterModal.cancel(); } @Test public void testFilterPanelAndModalLinked() { searchAndWait("cats"); final FilterPanel filterPanel = filters(); final ParametricFieldContainer container = filterPanel.parametricField(1); final String filterCategory = container.filterCategoryName(); final FindParametricFilter checkbox = filterPanel.checkboxForParametricValue(1, 1); final List<String> selectedFilter = Collections.singletonList(checkbox.getName()); checkbox.check(); findPage.waitForParametricValuesToLoad(); final ParametricFieldContainer refreshedContainer = filterPanel.parametricContainer(WordUtils.capitalize(filterCategory.toLowerCase())); refreshedContainer.expand(); refreshedContainer.seeAll(); final ParametricFilterModal filterModal = ParametricFilterModal.getParametricModal(getDriver()); filterModal.waitForLoad(); verifyThat("Modal not loading forever", !filterModal.isCurrentTabLoading()); verifyThat("Correct tab is active", filterModal.activeTabName(), equalToIgnoringCase(filterCategory)); verifyThat("Same fields selected in modal as panel", filterModal.checkedFiltersAllPanes(), is(selectedFilter)); final String filterType = filterModal.activeTabName(); final String checkedFilterName = filterModal.checkCheckBoxInActivePane(0); filterModal.apply(); final FindParametricFilter panelBox = filterPanel.checkboxForParametricValue(filterType, checkedFilterName); verifyThat("Filter: " + checkedFilterName + " is now checked on panel", panelBox.isChecked()); } //TODO this test makes many unreasonable assumptions @Test @ResolvedBug({"FIND-242", "FIND-406"}) public void testModalShowsALLFiltersRegardlessOfQuery() { searchAndWait("cheese"); final FilterPanel filterPanel = filters(); findPage.waitForParametricValuesToLoad(); final Collection<String> allFilterCategories = new ArrayList<>(); for (final ParametricFieldContainer container : filterPanel.parametricFieldContainers()) { allFilterCategories.add(container.filterCategoryName()); } filterPanel.parametricField(0).seeAll(); final ParametricFilterModal filterModal = ParametricFilterModal.getParametricModal(getDriver()); final int totalNumberFilters = filterModal.allFilters().size(); filterModal.goToTab(1); if (!isHosted()) { LOGGER.info("Test works on basis that Category should have has >10 filters"); assertThat(">10 filters shown in modal", filterModal.activePaneFilterList(), hasSize(greaterThan(10))); } filterModal.cancel(); filterPanel.checkboxForParametricValue(0, 1).check(); filterPanel.waitForParametricFields(); filterPanel.parametricField(0).seeAll(); final ParametricFilterModal refreshedFilterModal = ParametricFilterModal.getParametricModal(getDriver()); assertThat("Modal shows all filter categories", refreshedFilterModal.tabs(), hasSize(allFilterCategories.size())); verifyThat("Shows all filters for restricted search (some filters may have 0 docs)" , refreshedFilterModal.allFilters() , hasSize(totalNumberFilters)); refreshedFilterModal.cancel(); } @Test @ResolvedBug("FIND-231") public void testDeselectingFiltersNoFloatingTooltips() { searchAndWait("home"); final List<FindParametricFilter> boxes = checkAllVisibleFiltersInFirstParametrics(); for (final FindParametricFilter checkbox : boxes) { checkbox.name().click(); } verifyThat("Tooltips aren't floating everywhere", filters().toolTips(), hasSize(lessThan(boxes.size()))); } private List<FindParametricFilter> checkAllVisibleFiltersInFirstParametrics() { final List<FindParametricFilter> boxes = filters().checkBoxesForParametricFieldContainer(0); for (final FindParametricFilter checkBox : boxes) { checkBox.check(); } return boxes; } @Test @ResolvedBug("FIND-247") public void testSelectDifferentCategoryFiltersAndResultsLoad() throws InterruptedException { LOGGER.info("Because filter categories all collapse after selecting 1, must be quick or throws NoSuchElement"); final ListView results = findService.search("face"); final FilterPanel filterPanel = filters(); final FindParametricFilter filter1 = filterPanel.checkBoxesForParametricFieldContainer(0).get(0); final FindParametricFilter filter2 = filterPanel.checkBoxesForParametricFieldContainer(1).get(0); filter1.check(); filter2.check(); results.waitForResultsToLoad(); verifyThat("Loading indicator not present", !results.loadingIndicatorPresent()); } @Test public void testUnselectingContentTypeQuicklyDoesNotLeadToError() { final ListView results = findService.search("wolf"); final FindParametricFilter filter = filters().checkBoxesForParametricFieldContainer(0).get(0); filter.check(); filter.uncheck(); results.waitForResultsToLoad(); assertThat("No error message", !results.errorContainerShown()); } @Test public void testFilterByIndex() { final ListView results = findService.search("face"); final FindResult queryResult = results.searchResult(1); final String titleString = queryResult.getTitleString(); final DocumentViewer docPreview = queryResult.openDocumentPreview(); final String index = docPreview.getIndexName(); docPreview.close(); filters().indexesTreeContainer().expand(); findPage.filterBy(new IndexFilter(index)); assertThat(results.searchResult(1).getTitleString(), is(titleString)); } @Test public void testFilterByMultipleIndexes() { findService.search("unbelievable"); final FilterPanel filterPanel = filters(); filterPanel.indexesTreeContainer().expand(); final int numberOfIndexes = filterPanel.indexesTree().allIndexes().getIndexNodes().size(); assertThat("Need more than one database to perform test", numberOfIndexes, greaterThanOrEqualTo(2)); findPage.filterBy(IndexFilter.ALL); final IndexFilter filter = new IndexFilter(filterPanel.getIndex(0)); findPage.filterBy(filter); Waits.loadOrFadeWait(); final ListView results = getElementFactory().getListView(); final int firstFilterResults = results.getTotalResultsNum(); filter.add(filterPanel.getIndex(1)); findPage.filterBy(filter); Waits.loadOrFadeWait(); final int bothFilterResults = results.getTotalResultsNum(); findPage.filterBy(new IndexFilter(filterPanel.getIndex(1))); final int secondFilterResults = results.getTotalResultsNum(); assertThat("Both filter indexes thus both results", firstFilterResults + secondFilterResults, is(bothFilterResults)); } @Test public void testFilteredByIndexOnlyHasFilesFromIndex() { final ListView results = findService.search("Better"); final DocumentViewer docPreview = results.searchResult(1).openDocumentPreview(); final String chosenIndex = docPreview.getIndexName(); docPreview.close(); filters().indexesTreeContainer().expand(); findPage.filterBy(new IndexFilter(chosenIndex)); for (int i = 1; i < 6; i++) { final DocumentViewer docViewer = results.searchResult(1).openDocumentPreview(); assertThat(docPreview.getIndexName(), is(chosenIndex)); docViewer.close(); } } @Test public void testQuickDoubleClickOnDateFilterNotCauseError() { final ListView results = findService.search("wookie"); toggleDateSelection(DateOption.MONTH); toggleDateSelection(DateOption.MONTH); results.waitForResultsToLoad(); assertThat(results.resultsDiv().getText().toLowerCase(), not(containsString("an error"))); } @Test public void testPreDefinedWeekHasSameResultsAsCustomWeek() { preDefinedDateFiltersVersusCustomDateFilters(DateOption.WEEK); } @Test public void testPreDefinedMonthHasSameResultsAsCustomMonth() { preDefinedDateFiltersVersusCustomDateFilters(DateOption.MONTH); } @Test public void testPreDefinedYearHasSameResultsAsCustomYear() { preDefinedDateFiltersVersusCustomDateFilters(DateOption.YEAR); } private void preDefinedDateFiltersVersusCustomDateFilters(final DateOption period) { final ListView results = findService.search("cheese"); toggleDateSelection(period); final List<String> preDefinedResults = results.getResultTitles(); findPage.filterBy(new StringDateFilter().from(getDate(period)).until(new Date())); final List<String> customResults = results.getResultTitles(); assertThat(preDefinedResults, is(customResults)); } private Date getDate(final DateOption period) { final Calendar cal = Calendar.getInstance(); if (period != null) { switch (period) { case WEEK: cal.add(Calendar.DATE, -7); break; case MONTH: cal.set(Calendar.MONTH, cal.get(Calendar.MONTH) - 1); break; case YEAR: cal.set(Calendar.YEAR, cal.get(Calendar.YEAR) - 1); break; } } return cal.getTime(); } @Test @ActiveBug("FIND-152") public void testDateRemainsWhenClosingAndReopeningDateFilters() { final Date start = getDate(DateOption.MONTH); final Date end = getDate(DateOption.WEEK); findService.search(new Query("Corbyn")); findPage.filterBy(new StringDateFilter().from(start).until(end)); Waits.loadOrFadeWait(); for (int unused = 0; unused < 3; unused++) { toggleDateSelection(DateOption.CUSTOM); Waits.loadOrFadeWait(); } assertThat(findPage.fromDateInput().getValue(), is(findPage.formatInputDate(start))); assertThat(findPage.untilDateInput().getValue(), is(findPage.formatInputDate(end))); } @Test @ResolvedBug("CSA-1577") public void testClickingCustomDateFilterDoesNotRefreshResults() { final ListView results = findService.search("O Captain! My Captain!"); // may not happen the first time for (int unused = 0; unused < 5; unused++) { toggleDateSelection(DateOption.CUSTOM); assertThat(results.resultsDiv().getText(), not(containsString("Loading"))); } } private void toggleDateSelection(final DateOption date) { filters().toggleFilter(date); getElementFactory().getListView().waitForResultsToLoad(); } // Filters Applied section @Test public void testFiltersAppearInFiltersAppliedSection() { final ListView results = findService.search("truth"); final int initialLabelsSize = getFilterLabels().size(); final FilterPanel filterPanel = filters(); filterPanel.toggleFilter(DateOption.WEEK); results.waitForResultsToLoad(); assertThat("Filter label is in the Applied Filters Panel", getFilterLabels(), hasSize(greaterThan(initialLabelsSize))); } private List<WebElement> getFilterLabels() { return appliedFilters() .getPanel() .findElements(By.cssSelector(".filter-label")); } @Test public void testAppliedFiltersCounterDefaultsToZero() { assumeThat("Should only default to 0 filters on prem", !isHosted()); findService.search("bear"); final AppliedFiltersPanel appliedFiltersPanel = appliedFilters(); final List<WebElement> appliedFilters = appliedFiltersPanel.getAppliedFilters(); assertThat("By default there are no filters present", appliedFilters, is(empty())); final String headerText = appliedFiltersPanel.getHeader().getText(); assertThat("The header reports zero filters", headerText, endsWith("(" + appliedFilters.size() + ')')); } @SuppressWarnings("FeatureEnvy") @Test public void testApplyingFiltersIncrementsTheHeaderCounter() { final ListView results = findService.search("truth"); final FilterPanel filterPanel = filters(); final AppliedFiltersPanel appliedFiltersPanel = appliedFilters(); List<WebElement> appliedFilters = appliedFiltersPanel.getAppliedFilters(); final int initialLabelsSize = appliedFilters.size(); if (!isHosted()) { assertThat("By default there are no filters present", initialLabelsSize, is(0)); } filterPanel.toggleFilter(DateOption.WEEK); results.waitForResultsToLoad(); appliedFilters = appliedFiltersPanel.getAppliedFilters(); assertThat("A filter label appears", appliedFilters, hasSize(initialLabelsSize + 1)); String headerText = appliedFiltersPanel.appliedFilterCounter().getText(); assertThat("The header reports the number of filter labels", headerText, containsString("(" + appliedFilters.size() + ')')); filterPanel.toggleFilter(DateOption.WEEK); results.waitForResultsToLoad(); appliedFilters = appliedFiltersPanel.getAppliedFilters(); assertThat("The filter label disappears", appliedFilters, hasSize(initialLabelsSize)); headerText = appliedFiltersPanel.appliedFilterCounter().getText(); assertThat("The header again reports number of filters", headerText, containsString("(" + appliedFilters.size() + ')')); } @SuppressWarnings("FeatureEnvy") @Test public void testTheRemoveAllFiltersButtonIsHiddenWhenThereAreNoFilters() { final ListView results = findService.search("truth"); final WebElement removeAllButton = appliedFilters().getRemoveAllFiltersButton(); if (!isHosted()) { assertThat("Button is hidden at startup", !removeAllButton.isDisplayed()); } final FilterPanel filterPanel = filters(); filterPanel.toggleFilter(DateOption.WEEK); results.waitForResultsToLoad(); assertThat("Button is displayed when filter is present", removeAllButton.isDisplayed()); removeAllButton.click(); results.waitForResultsToLoad(); assertThat("Button disappears after removing filter", !removeAllButton.isDisplayed()); } @SuppressWarnings("FeatureEnvy") @Test public void testClickingTheRemoveAllButtonRemovesAllFilters() { final ListView results = findService.search("truth"); results.waitForResultsToLoad(); final AppliedFiltersPanel appliedFiltersPanel = appliedFilters(); List<WebElement> appliedFilters = appliedFiltersPanel.getAppliedFilters(); final int initialLabelsSize = appliedFilters.size(); final FilterPanel filterPanel = filters(); final int index = filterPanel.nonZeroParamFieldContainer(0); assumeThat("There are non-zero parametric filters", index > -1); final FindParametricFilter parametricFilter = filterPanel.parametricField(index).getFilters().get(0); parametricFilter.check(); results.waitForResultsToLoad(); filterPanel.toggleFilter(DateOption.YEAR); results.waitForResultsToLoad(); appliedFilters = appliedFiltersPanel.getAppliedFilters(); assertThat("Two more filters are applied", appliedFilters, hasSize(initialLabelsSize + 2)); appliedFiltersPanel.getRemoveAllFiltersButton().click(); appliedFilters = appliedFiltersPanel.getAppliedFilters(); assertThat("All filters are removed", appliedFilters, is(empty())); } private FilterPanel filters() { return getElementFactory().getFilterPanel(); } private AppliedFiltersPanel appliedFilters() { return getElementFactory().getAppliedFiltersPanel(); } }