001/*
002    Licensed to the Apache Software Foundation (ASF) under one
003    or more contributor license agreements.  See the NOTICE file
004    distributed with this work for additional information
005    regarding copyright ownership.  The ASF licenses this file
006    to you under the Apache License, Version 2.0 (the
007    "License"); you may not use this file except in compliance
008    with the License.  You may obtain a copy of the License at
009
010       http://www.apache.org/licenses/LICENSE-2.0
011
012    Unless required by applicable law or agreed to in writing,
013    software distributed under the License is distributed on an
014    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015    KIND, either express or implied.  See the License for the
016    specific language governing permissions and limitations
017    under the License.
018 */
019package org.apache.wiki.pages.haddock;
020
021import com.codeborne.selenide.CollectionCondition;
022import com.codeborne.selenide.ElementsCollection;
023import com.codeborne.selenide.Selenide;
024import org.apache.wiki.pages.Page;
025import org.openqa.selenium.By;
026
027import java.util.List;
028
029/**
030 * Actions available on the Search Results page.
031 */
032public class SearchResultsPage implements HaddockPage {
033
034    private static final String SEARCH_PAGE_NAME_RESULTS = ".wikitable.table-striped tr:not(:first-child) td:first-child";
035
036    /**
037     * Open the search results page with a given query text to search for.
038     *
039     * @param pageName Wiki page name to View.
040     * @return {@link ViewWikiPage} instance, to allow chaining of actions.
041     */
042    public static SearchResultsPage open( final String pageName ) {
043        return Page.withUrl( Page.baseUrl() + "/Search.jsp?query=" + pageName ).openAs( new SearchResultsPage() );
044    }
045
046    /**
047     * Returns the search result page names.
048     *
049     * @return the list of page names returned by the search query.
050     */
051    public List< String > pagesFound() {
052        return Selenide.$$( By.cssSelector( SEARCH_PAGE_NAME_RESULTS ) ).texts();
053    }
054
055    /**
056     * Ensures that the given page names are present on the search results.
057     *
058     * @param pageNames page names to look for.
059     * @return {@link SearchResultsPage} instance, to allow chaining of actions.
060     */
061    public SearchResultsPage shouldContain( final String... pageNames ) {
062        final ElementsCollection resultsTableRows = Selenide.$$( By.cssSelector( SEARCH_PAGE_NAME_RESULTS ) );
063        for( final String pageName : pageNames ) {
064            resultsTableRows.shouldHave( CollectionCondition.itemWithText( pageName ) );
065        }
066
067        return this;
068    }
069
070    /**
071     * Navigates to a view page from the search results.
072     *
073     * @param result wikipage name to navigate to.
074     * @return {@link ViewWikiPage} instance, to allow chaining of actions.
075     */
076    public ViewWikiPage navigateTo(final String result ) {
077        Selenide.$( By.cssSelector( ".wikitable.table-striped" ) ).find( By.linkText( result ) ).click();
078        return new ViewWikiPage();
079    }
080
081}