/* * 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.a4jJSFunction; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotSame; import javax.faces.event.PhaseId; import org.jboss.arquillian.graphene.Graphene; import org.jboss.arquillian.graphene.page.Page; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.interactions.Action; import org.richfaces.tests.metamer.ftest.AbstractWebDriverTest; import org.richfaces.tests.metamer.ftest.annotations.IssueTracking; 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.webdriver.Attributes; import org.richfaces.tests.metamer.ftest.webdriver.MetamerPage; import org.richfaces.tests.metamer.ftest.webdriver.MetamerPage.WaitRequestType; import org.testng.annotations.Test; /** * Test case for page /faces/components/a4jJSFunction/simple.xhtml * * @author <a href="https://community.jboss.org/people/ppitonak">Pavol Pitonak</a> * @since 5.0.0.Alpha1 */ public class TestJSFunctionSimple extends AbstractWebDriverTest { private final Attributes<JSFunctionAttributes> jsFunctionAttributes = getAttributes(); @Page private JSFunctionPage page; @Override public String getComponentTestPagePath() { return "a4jJSFunction/simple.xhtml"; } @Test public void testSimpleClick() { String time1Value = page.getTime1Element().getText(); String time2Value = page.getTime2Element().getText(); String yearValue = page.getYearElement().getText(); String ajaxRenderedTimeValue = page.getAjaxRenderedTimeElement().getText(); Graphene.guardAjax(page.getLinkElement()).click(); Graphene.waitAjax().withMessage("Time1 did not change.").until().element(page.getTime1Element()).text().not() .equalTo(time1Value); assertNotSame(page.getTime2Element().getText(), time2Value, "Time2 did not change"); assertEquals(page.getYearElement().getText(), yearValue, "Year should not change"); assertNotSame(page.getAjaxRenderedTimeElement().getText(), ajaxRenderedTimeValue, "Ajax rendered time did not change"); } @Test(groups = "smoke") @CoversAttributes("action") public void testAction() { jsFunctionAttributes.set(JSFunctionAttributes.action, "increaseYearAction"); int yearValue = Integer.parseInt(page.getYearElement().getText()); String time1Value = page.getTime1Element().getText(); Graphene.guardAjax(page.getLinkElement()).click(); Graphene.waitAjax().withMessage("Time1 did not change.").until().element(page.getTime1Element()).text().not() .equalTo(time1Value); assertEquals(Integer.parseInt(page.getYearElement().getText()), yearValue + 1, "Action was not invoked in first request."); Graphene.guardAjax(page.getLinkElement()).click(); Graphene.waitAjax().withMessage("Time1 did not change.").until().element(page.getTime1Element()).text().not() .equalTo(time1Value); assertEquals(Integer.parseInt(page.getYearElement().getText()), yearValue + 2, "Action was not invoked in second request."); page.assertListener(PhaseId.INVOKE_APPLICATION, MetamerPage.STRING_ACTION_MSG); } @Test @CoversAttributes("actionListener") public void testActionListener() { jsFunctionAttributes.set(JSFunctionAttributes.actionListener, "increaseYearActionListener"); int yearValue = Integer.parseInt(page.getYearElement().getText()); String time1Value = page.getTime1Element().getText(); Graphene.guardAjax(page.getLinkElement()).click(); Graphene.waitAjax().withMessage("Time1 did not change.").until().element(page.getTime1Element()).text().not() .equalTo(time1Value); assertEquals(Integer.parseInt(page.getYearElement().getText()), yearValue + 1, "Action listener was not invoked in first request."); Graphene.guardAjax(page.getLinkElement()).click(); Graphene.waitAjax().withMessage("Time1 did not change.").until().element(page.getTime1Element()).text().not() .equalTo(time1Value); assertEquals(Integer.parseInt(page.getYearElement().getText()), yearValue + 2, "Action listener was not invoked in second request."); page.assertListener(PhaseId.INVOKE_APPLICATION, MetamerPage.STRING_ACTIONLISTENER_MSG); } @Test @CoversAttributes({ "action", "bypassUpdates" }) public void testBypassUpdates() { jsFunctionAttributes.set(JSFunctionAttributes.action, "decreaseYearAction"); jsFunctionAttributes.set(JSFunctionAttributes.bypassUpdates, true); String time1Value = page.getTime1Element().getText(); Graphene.guardAjax(page.getLinkElement()).click(); Graphene.waitAjax().withMessage("Time1 did not change.").until().element(page.getTime1Element()).text().not() .equalTo(time1Value); page.assertPhases(PhaseId.RESTORE_VIEW, PhaseId.APPLY_REQUEST_VALUES, PhaseId.PROCESS_VALIDATIONS, PhaseId.RENDER_RESPONSE); page.assertListener(PhaseId.PROCESS_VALIDATIONS, MetamerPage.STRING_ACTION_MSG); } @Test @CoversAttributes("data") public void testData() { testData(new Action() { @Override public void perform() { MetamerPage.waitRequest(page.getLinkElement(), WaitRequestType.XHR).click(); } }); } @Test @CoversAttributes("execute") public void testExecute() { jsFunctionAttributes.set(JSFunctionAttributes.execute, "input executeChecker"); MetamerPage.waitRequest(page.getLinkElement(), WaitRequestType.XHR).click(); page.assertListener(PhaseId.UPDATE_MODEL_VALUES, MetamerPage.STRING_EXECUTE_CHECKER_MSG); } @Test @CoversAttributes({ "actionListener", "immediate" }) public void testImmediate() { jsFunctionAttributes.set(JSFunctionAttributes.actionListener, "decreaseYearActionListener"); jsFunctionAttributes.set(JSFunctionAttributes.immediate, true); MetamerPage.waitRequest(page.getLinkElement(), WaitRequestType.XHR).click(); page.assertPhases(PhaseId.RESTORE_VIEW, PhaseId.APPLY_REQUEST_VALUES, PhaseId.RENDER_RESPONSE); page.assertListener(PhaseId.APPLY_REQUEST_VALUES, MetamerPage.STRING_ACTIONLISTENER_MSG); } @Test @CoversAttributes("limitRender") @IssueTracking("https://issues.jboss.org/browse/RF-10011") public void testLimitRender() { jsFunctionAttributes.set(JSFunctionAttributes.limitRender, true); String time1Value = page.getTime1Element().getText(); String time2Value = page.getTime2Element().getText(); String yearValue = page.getYearElement().getText(); String ajaxRenderedTimeValue = page.getAjaxRenderedTimeElement().getText(); Graphene.guardAjax(page.getLinkElement()).click(); Graphene.waitAjax().withMessage("Time1 did not change.").until().element(page.getTime1Element()).text().not() .equalTo(time1Value); assertNotSame(page.getTime2Element().getText(), time2Value, "Time2 did not change"); assertEquals(page.getYearElement().getText(), yearValue, "Year should not change"); assertEquals(page.getAjaxRenderedTimeElement().getText(), ajaxRenderedTimeValue, "Ajax rendered time should not change"); } @Test @CoversAttributes("name") public void testName() { jsFunctionAttributes.set(JSFunctionAttributes.name, "metamer"); testSimpleClick(); } @Test @CoversAttributes({ "onbegin", "onbeforedomupdate", "oncomplete" }) public void testEvents() { jsFunctionAttributes.set(JSFunctionAttributes.onbegin, "metamerEvents += \"begin \""); jsFunctionAttributes.set(JSFunctionAttributes.onbeforedomupdate, "metamerEvents += \"beforedomupdate \""); jsFunctionAttributes.set(JSFunctionAttributes.oncomplete, "metamerEvents += \"complete \""); ((JavascriptExecutor) driver).executeScript("metamerEvents = \"\""); MetamerPage.waitRequest(page.getLinkElement(), WaitRequestType.XHR).click(); String[] events = ((JavascriptExecutor) driver).executeScript("return metamerEvents").toString().split(" "); assertEquals(events.length, 3, "3 events should be fired."); assertEquals(events[0], "begin", "Attribute onbegin doesn't work"); assertEquals(events[1], "beforedomupdate", "Attribute onbeforedomupdate doesn't work"); assertEquals(events[2], "complete", "Attribute oncomplete doesn't work"); } @Test @CoversAttributes("onerror") public void testOnerror() { jsFunctionAttributes.set(JSFunctionAttributes.action, "causeAjaxErrorAction"); testFireEvent("onerror", new Action() { @Override public void perform() { Graphene.guardAjax(page.getLinkElement()).click(); } }); } @Test @CoversAttributes("render") public void testRender() { jsFunctionAttributes.set(JSFunctionAttributes.render, "time1"); String time1Value = page.getTime1Element().getText(); String time2Value = page.getTime2Element().getText(); String yearValue = page.getYearElement().getText(); String ajaxRenderedTimeValue = page.getAjaxRenderedTimeElement().getText(); MetamerPage.waitRequest(page.getLinkElement(), WaitRequestType.XHR).click(); assertNotSame(page.getTime1Element().getText(), time1Value, "Time1 should not change"); assertEquals(page.getTime2Element().getText(), time2Value, "Time2 did not change"); assertEquals(page.getYearElement().getText(), yearValue, "Year should not change"); assertNotSame(page.getAjaxRenderedTimeElement().getText(), ajaxRenderedTimeValue, "Ajax rendered time should change"); } @Test @CoversAttributes("rendered") @Templates(value = "plain") public void testRendered() { jsFunctionAttributes.set(JSFunctionAttributes.rendered, false); String time1Value = page.getTime1Element().getText(); MetamerPage.waitRequest(page.getLinkElement(), WaitRequestType.NONE).click(); assertEquals(page.getTime1Element().getText(), time1Value, "Time1 should not change"); } @Test @CoversAttributes("status") public void testStatus() { jsFunctionAttributes.set(JSFunctionAttributes.status, "statusChecker"); String statusCheckerTime = page.getStatusCheckerOutputElement().getText(); MetamerPage.waitRequest(page.getLinkElement(), WaitRequestType.XHR).click(); assertNotSame(page.getStatusCheckerOutputElement().getText(), statusCheckerTime, "Attribute status doesn't work"); } }