/* * JBoss, Home of Professional Open Source * Copyright 2010-2016, Red Hat, Inc. and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.richfaces.tests.metamer.ftest.richDataScroller; import static org.richfaces.tests.metamer.ftest.extension.configurator.use.annotation.ValuesFrom.FROM_ENUM; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; import java.util.Arrays; import javax.faces.event.PhaseId; import org.jboss.arquillian.graphene.Graphene; import org.jboss.arquillian.graphene.page.Page; import org.openqa.selenium.By; import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Action; import org.richfaces.fragment.dataScroller.DataScroller.DataScrollerSwitchButton; import org.richfaces.tests.metamer.ftest.AbstractWebDriverTest; import org.richfaces.tests.metamer.ftest.extension.attributes.coverage.annotations.CoversAttributes; import org.richfaces.tests.metamer.ftest.extension.configurator.templates.annotation.Templates; import org.richfaces.tests.metamer.ftest.extension.configurator.use.annotation.UseForAllTests; import org.richfaces.tests.metamer.ftest.richDataScroller.SimplePage.ScrollerPosition; import org.richfaces.tests.metamer.ftest.richDataTable.DataTableAttributes; import org.richfaces.tests.metamer.ftest.webdriver.Attributes; import org.richfaces.tests.metamer.ftest.webdriver.MetamerPage; import org.richfaces.tests.metamer.ftest.webdriver.MetamerPage.WaitRequestType; import org.testng.annotations.Test; /** * @author <a href="mailto:jpapouse@redhat.com">Jan Papousek</a> * @author <a href="https://community.jboss.org/people/ppitonak">Pavol Pitonak</a> */ public class TestDataScrollerAttributes extends AbstractWebDriverTest { private final Attributes<DataScrollerAttributes> attributes = getAttributes("attributes"); @Page private SimplePage page; @UseForAllTests(valuesFrom = FROM_ENUM, value = "") private ScrollerPosition scroller; private final Attributes<DataTableAttributes> tableAttributes = getAttributes("tableAttributes"); @Override public String getComponentTestPagePath() { return "richDataScroller/simple.xhtml"; } private int getNumberOfRows() { return driver.findElements(By.cssSelector("table[id$=richDataTable].rf-dt tbody tr.rf-dt-r")).size(); } private void movePopupTemplateWhenUsingScrollerOutsideTable() { if (isInPopupTemplate() && scroller.equals(ScrollerPosition.DATA_SCROLLER_OUTSIDE_TABLE)) { popupTemplate.advanced().moveByOffset(100, 200); } } @Test @CoversAttributes("boundaryControls") public void testBoundaryControls() { // init - show assertTrue(page.getScroller(scroller).advanced().isButtonPresent(DataScrollerSwitchButton.FIRST), "The first button should be present."); assertTrue(page.getScroller(scroller).advanced().isButtonPresent(DataScrollerSwitchButton.LAST), "The last button should be present."); // hide attributes.set(DataScrollerAttributes.boundaryControls, "hide"); assertFalse(page.getScroller(scroller).advanced().isButtonPresent(DataScrollerSwitchButton.FIRST), "The first button shouldn't be present."); assertFalse(page.getScroller(scroller).advanced().isButtonPresent(DataScrollerSwitchButton.LAST), "The last button shouldn't be present."); } @Test @CoversAttributes("data") public void testData() { testData(new Action() { @Override public void perform() { movePopupTemplateWhenUsingScrollerOutsideTable(); page.getScroller(scroller).switchTo(DataScrollerSwitchButton.FAST_FORWARD); } }); } @Test @CoversAttributes({ "onbegin", "onbeforedomupdate", "oncomplete" }) public void testEvents() throws InterruptedException { // set event attributes attsSetter() .setAttribute(DataScrollerAttributes.onbeforedomupdate).toValue("metamerEvents += \"beforedomupdate \"") .setAttribute(DataScrollerAttributes.onbegin).toValue("metamerEvents += \"begin \"") .setAttribute(DataScrollerAttributes.oncomplete).toValue("metamerEvents += \"complete \"") .asSingleAction().perform(); // reset events executor.executeScript("metamerEvents = \"\";"); movePopupTemplateWhenUsingScrollerOutsideTable(); // action MetamerPage.waitRequest(page.getScroller(scroller), WaitRequestType.XHR).switchTo( DataScrollerSwitchButton.FAST_FORWARD); // check events String[] events = executor.executeScript("return metamerEvents;").toString().split(" "); assertEquals(events.length, 3, "3 events should be fired, found events are " + Arrays.toString(events) + "."); assertEquals(events[0], "begin", "Attribute onbegin doesn't work, found events are " + Arrays.toString(events) + "."); assertEquals(events[1], "beforedomupdate", "Attribute onbeforedomupdate doesn't work, found events are " + Arrays.toString(events) + "."); assertEquals(events[2], "complete", "Attribute oncomplete doesn't work, found events are " + Arrays.toString(events) + "."); } @Test @CoversAttributes("execute") public void testExecute() { // attributes attributes.set(DataScrollerAttributes.execute, "executeChecker"); movePopupTemplateWhenUsingScrollerOutsideTable(); // action MetamerPage.waitRequest(page.getScroller(scroller), WaitRequestType.XHR).switchTo( DataScrollerSwitchButton.FAST_FORWARD); // check for (WebElement element : page.getPhasesElements()) { if ("* executeChecker".equals(element.getText())) { return; } } fail("Attribute execute does not work"); } @Test @CoversAttributes("fastControls") public void testFastControls() { // init - show assertTrue(page.getScroller(scroller).advanced().isButtonPresent(DataScrollerSwitchButton.FAST_FORWARD), "The fast forward button should be present."); assertTrue(page.getScroller(scroller).advanced().isButtonPresent(DataScrollerSwitchButton.FAST_REWIND), "The fast rewind button should be present."); // hide attributes.set(DataScrollerAttributes.fastControls, "hide"); assertFalse(page.getScroller(scroller).advanced().isButtonPresent(DataScrollerSwitchButton.FAST_FORWARD), "The fast forward button shouldn't be present."); assertFalse(page.getScroller(scroller).advanced().isButtonPresent(DataScrollerSwitchButton.FAST_REWIND), "The fast rewind button shouldn't be present."); } @Test @CoversAttributes("fastStep") public void testFastStep() { attributes.set(DataScrollerAttributes.fastStep, 3); movePopupTemplateWhenUsingScrollerOutsideTable(); MetamerPage.waitRequest(page.getScroller(scroller), WaitRequestType.XHR).switchTo( DataScrollerSwitchButton.FAST_FORWARD); assertEquals(page.getScroller(scroller).getActivePageNumber(), 4, "After clicking on the fast forward button, the current page doesn't match."); MetamerPage.waitRequest(page.getScroller(scroller), WaitRequestType.XHR).switchTo( DataScrollerSwitchButton.FAST_REWIND); assertEquals(page.getScroller(scroller).getActivePageNumber(), 1, "After clicking on the fast rewind button, the current page doesn't match."); } @Test @CoversAttributes("lastPageMode") public void testLastPageMode() { movePopupTemplateWhenUsingScrollerOutsideTable(); MetamerPage.waitRequest(page.getScroller(scroller), WaitRequestType.XHR) .switchTo(DataScrollerSwitchButton.LAST); // init - short assertEquals(getNumberOfRows(), 5, "Attribute lastPageMode doesn't work. The number of rows doesn't match, when the value is set to <short>"); // full attributes.set(DataScrollerAttributes.lastPageMode, "full"); assertEquals(getNumberOfRows(), 9, "Attribute lastPageMode doesn't work. The number of rows doesn't match, when the value is set to <full>"); } @Test @CoversAttributes("limitRender") public void testLimitRender() { attributes.set(DataScrollerAttributes.limitRender, false); movePopupTemplateWhenUsingScrollerOutsideTable(); MetamerPage.waitRequest(page.getScroller(scroller), WaitRequestType.XHR).switchTo( DataScrollerSwitchButton.FAST_FORWARD); assertEquals(page.getScroller(scroller).getActivePageNumber(), 2, "Data scroller's active page with limitRender=false"); attributes.set(DataScrollerAttributes.limitRender, true); movePopupTemplateWhenUsingScrollerOutsideTable(); String timeBefore = page.getRequestTimeElement().getText(); Graphene.guardAjax(page.getScroller(scroller)).switchTo(DataScrollerSwitchButton.FAST_FORWARD); String timeAfter = page.getRequestTimeElement().getText(); assertEquals(timeAfter, timeBefore, "The panel was rerendered despite the fact that the attribute 'limitRender' is set to <true>."); assertEquals(page.getScroller(scroller).getActivePageNumber(), 3, "Data scroller's active page with limitRender=true"); } @Test @CoversAttributes("maxPages") public void testMaxPages() { // initial value is 10 which means that 6 pages (i.e. all) should be displayed assertEquals(page.getScroller(scroller).advanced().getCountOfVisiblePages(), 6 /* * it means - all pages */, "The number of visible pages doesn't match."); attributes.set(DataScrollerAttributes.maxPages, 3); assertEquals(page.getScroller(scroller).advanced().getCountOfVisiblePages(), 3, "The number of visible pages doesn't match."); } @Test @CoversAttributes("page") public void testPage() { attributes.set(DataScrollerAttributes.page, 4); assertEquals(page.getScroller(scroller).getActivePageNumber(), 4, "The number of current page doesn't match."); } @Test @CoversAttributes("render") public void testRender() { attributes.set(DataScrollerAttributes.render, "@this renderChecker"); movePopupTemplateWhenUsingScrollerOutsideTable(); String renderCheckerText = getMetamerPage().getRenderCheckerOutputElement().getText(); String requestTime = getMetamerPage().getRequestTimeElement().getText(); Graphene.guardAjax(page.getScroller(scroller)).switchTo(DataScrollerSwitchButton.NEXT); Graphene.waitGui().until().element(getMetamerPage().getRenderCheckerOutputElement()).text().not() .equalTo(renderCheckerText); Graphene.waitGui().until().element(getMetamerPage().getRequestTimeElement()).text().not() .equalTo(requestTime); } @Test @CoversAttributes("renderIfSinglePage") public void testRenderIfSinglePage() { // prepare table to display all data at once tableAttributes.set(DataTableAttributes.rows, 200); // default value - true Graphene.waitGui().until("The attribute 'renderIfSinglePage' doesn't work.") .element(page.getScroller(scroller).advanced().getRootElement()).is().present(); assertTrue(page.getScroller(scroller).advanced().getRootElement().isDisplayed(), "Data scroller should be displayed"); // false attributes.set(DataScrollerAttributes.renderIfSinglePage, false); assertFalse(page.getScroller(scroller).advanced().getRootElement().isDisplayed(), "Data scroller should not be displayed"); } @Test @CoversAttributes("rendered") @Templates(value = "plain") public void testRendered() { attributes.set(DataScrollerAttributes.rendered, false); Graphene.waitGui().until().element(page.getScroller(scroller).advanced().getRootElement()).is().not().present(); } @Test @CoversAttributes("scrollListener") public void testScrollListener() { movePopupTemplateWhenUsingScrollerOutsideTable(); Graphene.guardAjax(page.getScroller(scroller)).switchTo(DataScrollerSwitchButton.NEXT); getMetamerPage().assertListener(PhaseId.INVOKE_APPLICATION, "scroll event: 1 -> next"); Graphene.guardAjax(page.getScroller(scroller)).switchTo(DataScrollerSwitchButton.FAST_FORWARD); getMetamerPage().assertListener(PhaseId.INVOKE_APPLICATION, "scroll event: 2 -> fastForward"); Graphene.guardAjax(page.getScroller(scroller)).switchTo(DataScrollerSwitchButton.LAST); getMetamerPage().assertListener(PhaseId.INVOKE_APPLICATION, "scroll event: 3 -> last"); Graphene.guardAjax(page.getScroller(scroller)).switchTo(DataScrollerSwitchButton.PREVIOUS); getMetamerPage().assertListener(PhaseId.INVOKE_APPLICATION, "scroll event: 6 -> previous"); Graphene.guardAjax(page.getScroller(scroller)).switchTo(DataScrollerSwitchButton.FAST_REWIND); getMetamerPage().assertListener(PhaseId.INVOKE_APPLICATION, "scroll event: 5 -> fastRewind"); Graphene.guardAjax(page.getScroller(scroller)).switchTo(DataScrollerSwitchButton.FIRST); getMetamerPage().assertListener(PhaseId.INVOKE_APPLICATION, "scroll event: 4 -> first"); Graphene.guardAjax(page.getScroller(scroller)).switchTo(5); getMetamerPage().assertListener(PhaseId.INVOKE_APPLICATION, "scroll event: 1 -> 5"); } @Test @CoversAttributes("status") public void testStatus() { attributes.set(DataScrollerAttributes.status, "statusChecker"); movePopupTemplateWhenUsingScrollerOutsideTable(); String statusCheckerTime = page.getStatusCheckerOutputElement().getText(); MetamerPage.waitRequest(page.getScroller(scroller), WaitRequestType.XHR).switchTo( DataScrollerSwitchButton.FAST_FORWARD); Graphene.waitModel().until("Page was not updated").element(page.getStatusCheckerOutputElement()).text().not() .equalTo(statusCheckerTime); } @Test public void testStep() { movePopupTemplateWhenUsingScrollerOutsideTable(); MetamerPage.waitRequest(page.getScroller(scroller), WaitRequestType.XHR) .switchTo(DataScrollerSwitchButton.NEXT); assertEquals(page.getScroller(scroller).getActivePageNumber(), 2, "After clicking on the next button, the current page doesn't match."); MetamerPage.waitRequest(page.getScroller(scroller), WaitRequestType.XHR) .switchTo(DataScrollerSwitchButton.NEXT); assertEquals(page.getScroller(scroller).getActivePageNumber(), 3, "After clicking on the next button, the current page doesn't match."); MetamerPage.waitRequest(page.getScroller(scroller), WaitRequestType.XHR).switchTo( DataScrollerSwitchButton.PREVIOUS); assertEquals(page.getScroller(scroller).getActivePageNumber(), 2, "After clicking on the previous button, the current page doesn't match."); MetamerPage.waitRequest(page.getScroller(scroller), WaitRequestType.XHR).switchTo( DataScrollerSwitchButton.PREVIOUS); assertEquals(page.getScroller(scroller).getActivePageNumber(), 1, "After clicking on the previous button, the current page doesn't match."); } @Test @CoversAttributes("stepControls") public void testStepControls() { // default value - show assertTrue(page.getScroller(scroller).advanced().isButtonPresent(DataScrollerSwitchButton.NEXT), "The next button should be present."); assertTrue(page.getScroller(scroller).advanced().isButtonPresent(DataScrollerSwitchButton.PREVIOUS), "The previous button should be present."); // hide attributes.set(DataScrollerAttributes.stepControls, "hide"); assertFalse(page.getScroller(scroller).advanced().isButtonPresent(DataScrollerSwitchButton.NEXT), "The next button shouldn't be present."); assertFalse(page.getScroller(scroller).advanced().isButtonPresent(DataScrollerSwitchButton.PREVIOUS), "The previous button shouldn't be present."); } @Test @CoversAttributes("style") @Templates(value = "plain") public void testStyle() { super.testStyle(page.getScroller(scroller).advanced().getRootElement()); } @Test @CoversAttributes("styleClass") @Templates("plain") public void testStyleClass() { super.testStyleClass(page.getScroller(scroller).advanced().getRootElement()); } @Test @CoversAttributes("title") @Templates("plain") public void testTitle() { super.testTitle(page.getScroller(scroller).advanced().getRootElement()); } }