/*
* 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.richTab;
import static org.jboss.arquillian.graphene.Graphene.guardAjax;
import static org.jboss.arquillian.graphene.Graphene.guardHttp;
import static org.jboss.arquillian.graphene.Graphene.guardNoRequest;
import static org.jboss.arquillian.graphene.Graphene.waitGui;
import static org.richfaces.fragment.switchable.SwitchType.CLIENT;
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.List;
import javax.faces.event.PhaseId;
import org.jboss.arquillian.graphene.Graphene;
import org.jboss.arquillian.graphene.findby.ByJQuery;
import org.jboss.arquillian.graphene.page.Page;
import org.openqa.selenium.TimeoutException;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Action;
import org.openqa.selenium.interactions.Actions;
import org.richfaces.tests.metamer.ftest.AbstractWebDriverTest;
import org.richfaces.tests.metamer.ftest.BasicAttributes;
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.testng.annotations.Test;
/**
* Test case for page /faces/components/richTab/simple.xhtml
*
* @author <a href="mailto:ppitonak@redhat.com">Pavol Pitonak</a>
* @author <a href="mailto:manovotn@redhat.com">Matej Novotny</a>
* @author <a href="mailto:manovotn@redhat.com">Juraj Huska</a>
* @version $Revision: 22963 $
*/
public class TestTab extends AbstractWebDriverTest {
@Page
private TabSimplePage page;
private final Action switchToTabAction = new Action() {
@Override
public void perform() {
page.getTabPanel().switchTo(0);
}
};
private final Attributes<TabAttributes> tabAttributes = getAttributes();
private boolean belongsClass(WebElement elem, String className) {
return elem.getAttribute("class").contains(className);
}
@Override
public String getComponentTestPagePath() {
return "richTab/simple.xhtml";
}
@Test
@CoversAttributes({ "action", "actionListener" })
@IssueTracking({ "https://issues.jboss.org/browse/RF-11427", "https://issues.jboss.org/browse/RF-13748" })
public void testActionAndActionListener() {
page.getTabPanel().switchTo(2);
page.assertPhases(PhaseId.RESTORE_VIEW, PhaseId.APPLY_REQUEST_VALUES, PhaseId.PROCESS_VALIDATIONS,
PhaseId.UPDATE_MODEL_VALUES, PhaseId.INVOKE_APPLICATION, PhaseId.RENDER_RESPONSE);
page.assertListener(PhaseId.UPDATE_MODEL_VALUES, "item changed: tab1 -> tab3");
page.getTabPanel().switchTo(0);
page.assertPhases(PhaseId.RESTORE_VIEW, PhaseId.APPLY_REQUEST_VALUES, PhaseId.PROCESS_VALIDATIONS,
PhaseId.UPDATE_MODEL_VALUES, PhaseId.INVOKE_APPLICATION, PhaseId.RENDER_RESPONSE);
page.assertListener(PhaseId.UPDATE_MODEL_VALUES, "item changed: tab3 -> tab1");
page.assertListener(PhaseId.INVOKE_APPLICATION, "action listener invoked");
page.assertListener(PhaseId.INVOKE_APPLICATION, "action invoked");
}
@Test
@CoversAttributes("bypassUpdates")
public void testBypassUpdates() {
tabAttributes.set(TabAttributes.bypassUpdates, true);
page.getTabPanel().switchTo(0);
page.assertPhases(PhaseId.RESTORE_VIEW, PhaseId.APPLY_REQUEST_VALUES, PhaseId.PROCESS_VALIDATIONS, PhaseId.RENDER_RESPONSE);
page.assertListener(PhaseId.PROCESS_VALIDATIONS, "action invoked");
page.assertListener(PhaseId.PROCESS_VALIDATIONS, "action listener invoked");
tabAttributes.set(TabAttributes.bypassUpdates, false);
page.getTabPanel().switchTo(0);
page.assertPhases(PhaseId.RESTORE_VIEW, PhaseId.APPLY_REQUEST_VALUES, PhaseId.PROCESS_VALIDATIONS,
PhaseId.UPDATE_MODEL_VALUES, PhaseId.INVOKE_APPLICATION, PhaseId.RENDER_RESPONSE);
page.assertListener(PhaseId.INVOKE_APPLICATION, "action invoked");
page.assertListener(PhaseId.INVOKE_APPLICATION, "action listener invoked");
}
@Test
@CoversAttributes("contentClass")
@Templates(value = "plain")
public void testContentClass() {
tabAttributes.set(TabAttributes.contentClass, "metamer-ftest-class");
assertTrue(belongsClass(page.getItemContents().get(0), "metamer-ftest-class"));
}
@Test
@CoversAttributes("data")
public void testData() {
testData(switchToTabAction);
}
@Test
@CoversAttributes("dir")
@Templates(value = "plain")
public void testDir() {
testDir(page.getFirstTabContentParentElement());
}
@Test
@CoversAttributes("disabled")
@Templates(value = "plain")
public void testDisabled() {
// enable the first tab, disabled is by default only 4th tab
tabAttributes.set(TabAttributes.disabled, Boolean.FALSE);
List<WebElement> disabledHeaders = page.getDisabledHeaders();
assertEquals(disabledHeaders.size(), 1);
assertEquals(disabledHeaders.get(0).getText(), "tab4 header");
// disable the first tab, now there should 2 disabled headers
tabAttributes.set(TabAttributes.disabled, Boolean.TRUE);
disabledHeaders = page.getDisabledHeaders();
assertEquals(disabledHeaders.size(), 2);
assertEquals(disabledHeaders.get(0).getText(), "tab1 header");
page.getTabPanel().advanced().setSwitchType(CLIENT);
page.getTabPanel().switchTo("tab2 header");
try {
page.getTabPanel().switchTo("tab1 header");
fail("It should not be possible to switch to disabled tab");
} catch (TimeoutException ex) {
//OK
}
assertEquals(page.getTabPanel().advanced().getActiveHeaderElement().getText(), "tab2 header");
}
@Test
@CoversAttributes("execute")
public void testExecute() {
tabAttributes.set(TabAttributes.execute, "@this executeChecker");
page.getTabPanel().switchTo(0);
page.assertListener(PhaseId.UPDATE_MODEL_VALUES, MetamerPage.STRING_EXECUTE_CHECKER_MSG);
}
@Test
@CoversAttributes("header")
@Templates(value = "plain")
public void testHeader() {
tabAttributes.set(TabAttributes.header, "new header");
assertEquals(page.getTabPanel().advanced().getActiveHeaderElement().getText(), "new header", "Header of the first tab did not change.");
tabAttributes.set(TabAttributes.header, "ľščťťžžôúňď ацущьмщфзщйцу");
assertEquals(page.getTabPanel().advanced().getActiveHeaderElement().getText(), "ľščťťžžôúňď ацущьмщфзщйцу",
"Header of the first tab did not change.");
}
@Test
@CoversAttributes("headerActiveClass")
@Templates(value = "plain")
public void testHeaderActiveClass() {
tabAttributes.set(TabAttributes.headerActiveClass, "metamer-ftest-class");
assertTrue(belongsClass(page.getTabPanel().advanced().getActiveHeaderElement(), "metamer-ftest-class"),
"headerActiveClass does not work");
assertFalse(belongsClass(page.getInactiveHeaders().get(0), "metamer-ftest-class"),
"headerActiveClass does not work");
assertFalse(belongsClass(page.getInactiveHeaders().get(1), "metamer-ftest-class"),
"headerActiveClass does not work");
assertFalse(belongsClass(page.getInactiveHeaders().get(2), "metamer-ftest-class"),
"headerActiveClass does not work");
assertFalse(belongsClass(page.getDisabledHeaders().get(0), "metamer-ftest-class"),
"headerActiveClass does not work");
}
@Test
@CoversAttributes("headerClass")
@IssueTracking("https://issues.jboss.org/browse/RF-11549")
@Templates(value = "plain")
public void testHeaderClass() {
tabAttributes.set(TabAttributes.headerClass, "metamer-ftest-class");
assertTrue(belongsClass(page.getTabPanel().advanced().getActiveHeaderElement(), "metamer-ftest-class"), "tabHeaderClass does not work");
}
@Test
@CoversAttributes("headerDisabledClass")
@Templates(value = "plain")
public void testHeaderDisabledClass() {
tabAttributes.set(TabAttributes.headerDisabledClass, "metamer-ftest-class");
assertFalse(belongsClass(page.getDisabledHeaders().get(0), "metamer-ftest-class"),
"headerDisabledClass does not work");
tabAttributes.set(TabAttributes.disabled, true);
assertTrue(belongsClass(page.getDisabledHeaders().get(0), "metamer-ftest-class"),
"headerDisabledClass does not work");
}
@Test
@CoversAttributes("headerInactiveClass")
@Templates(value = "plain")
public void testHeaderInactiveClass() {
tabAttributes.set(TabAttributes.headerInactiveClass, "metamer-ftest-class");
assertFalse(belongsClass(page.getTabPanel().advanced().getAllVisibleHeadersElements()
.get(0), "metamer-ftest-class"),
"headerInactiveClass does not work");
page.getTabPanel().switchTo(1);
assertTrue(belongsClass(page.getInactiveHeaders().get(0), "metamer-ftest-class"),
"headerInactiveClass does not work");
}
@Test
@CoversAttributes("headerStyle")
@Templates(value = "plain")
public void testHeaderStyle() {
testStyle(page.getTabPanel().advanced().getActiveHeaderElement(), BasicAttributes.headerStyle);
}
@Test
@CoversAttributes("immediate")
public void testImmediate() {
tabAttributes.set(TabAttributes.immediate, true);
page.getTabPanel().switchTo(0);
getMetamerPage().assertPhases(PhaseId.RESTORE_VIEW, PhaseId.APPLY_REQUEST_VALUES, PhaseId.RENDER_RESPONSE);
getMetamerPage().assertListener(PhaseId.APPLY_REQUEST_VALUES, "action invoked");
getMetamerPage().assertListener(PhaseId.APPLY_REQUEST_VALUES, "action listener invoked");
tabAttributes.set(TabAttributes.immediate, false);
page.getTabPanel().switchTo(0);
page.assertPhases(PhaseId.RESTORE_VIEW, PhaseId.APPLY_REQUEST_VALUES, PhaseId.PROCESS_VALIDATIONS,
PhaseId.UPDATE_MODEL_VALUES, PhaseId.INVOKE_APPLICATION, PhaseId.RENDER_RESPONSE);
page.assertListener(PhaseId.INVOKE_APPLICATION, "action invoked");
page.assertListener(PhaseId.INVOKE_APPLICATION, "action listener invoked");
}
@Test
public void testInit() {
assertVisible(page.getTabPanel().advanced().getRootElement(), "Tab panel is not present on the page.");
assertVisible(page.getTabPanel().advanced().getActiveHeaderElement(), "Header of tab1 should be active.");
assertVisible(page.getDisabledHeaders().get(0), "Header of tab4 should be disabled.");
String text = page.getTabPanel().advanced().getActiveHeaderElement().getText();
assertEquals(text, "tab1 header");
text = page.getInactiveHeaders().get(0).getText();
assertEquals(text, "tab2 header");
text = page.getDisabledHeaders().get(0).getText();
assertEquals(text, "tab4 header");
text = page.getItemContents().get(0).getText();
assertEquals(text, "content of tab 1");
}
@Test
@CoversAttributes("lang")
@Templates(value = "plain")
public void testLang() {
testLang(page.getFirstTabContentParentElement());
}
@Test
@CoversAttributes("limitRender")
public void testLimitRender() {
testLimitRenderWithSwitchTypeOrMode(switchToTabAction);
}
@Test
@CoversAttributes("name")
@IssueTracking("https://issues.jboss.org/browse/RF-10488")
public void testName() {
tabAttributes.set(TabAttributes.name, "metamer");
page.getTabPanel().switchTo(4);
waitGui(driver).until().element(ByJQuery.selector("div[id$=tab5] > div.rf-tab-cnt:visible")).is().present();
executeJS("RichFaces.component('" + page.getTabAsWebElement().getAttribute("id") + "').switchToItem('metamer')");
waitGui(driver).until().element(ByJQuery.selector("div[id$=tab1] > div.rf-tab-cnt:visible")).is().present();
}
@Test
@CoversAttributes("onbeforedomupdate")
@Templates(value = "plain")
public void testOnbeforedomupdate() {
testFireEvent("onbeforedomupdate", switchToTabAction);
}
@Test
@IssueTracking("https://issues.jboss.org/browse/RF-14076")
@CoversAttributes("onbegin")
@Templates(value = "plain")
public void testOnbegin() {
testFireEvent("onbegin", switchToTabAction);
}
@Test
@CoversAttributes("onclick")
@Templates(value = "plain")
public void testOnclick() {
Action action = new Actions(driver).click(page.getItemContents().get(0)).build();
testFireEvent(tabAttributes, TabAttributes.onclick, action);
}
@Test
@CoversAttributes("oncomplete")
@Templates(value = "plain")
public void testOncomplete() {
testFireEvent("oncomplete", switchToTabAction);
}
@Test
@CoversAttributes("ondblclick")
@Templates(value = "plain")
public void testOndblclick() {
Action action = new Actions(driver).doubleClick(page.getItemContents().get(0)).build();
testFireEvent(tabAttributes, TabAttributes.ondblclick, action);
}
@Test(groups = "smoke")
@CoversAttributes("onenter")
@IssueTracking("https://issues.jboss.org/browse/RF-9537 https://issues.jboss.org/browse/RF-10488")
public void testOnenter() {
testFireEvent(tabAttributes, TabAttributes.onenter, new Action() {
@Override
public void perform() {
Graphene.guardAjax(page.getTabPanel()).switchTo(1);
Graphene.guardAjax(page.getTabPanel()).switchTo(0);
}
});
}
@Test
@CoversAttributes("onheaderclick")
@Templates(value = "plain")
public void testOnheaderclick() {
Action action = new Actions(driver).click(page.getTabPanel().advanced().getActiveHeaderElement()).build();
testFireEvent(tabAttributes, TabAttributes.onheaderclick, action);
}
@Test
@CoversAttributes("onheaderdblclick")
@Templates(value = "plain")
public void testOnheaderdblclick() {
Action action = new Actions(driver).doubleClick(page.getTabPanel().advanced().getActiveHeaderElement()).build();
testFireEvent(tabAttributes, TabAttributes.onheaderdblclick, action);
}
@Test
@CoversAttributes("onheadermousedown")
@Templates(value = "plain")
public void testOnheadermousedown() {
Action action = new Actions(driver).clickAndHold(page.getTabPanel().advanced().getActiveHeaderElement()).build();
testFireEvent(tabAttributes, TabAttributes.onheadermousedown, action);
}
@Test
@CoversAttributes("onheadermousemove")
@Templates(value = "plain")
public void testOnheadermousemove() {
Action action = new Actions(driver).moveToElement(page.getInactiveHeaders().get(2))
.moveToElement(page.getTabPanel().advanced().getActiveHeaderElement()).build();
testFireEvent(tabAttributes, TabAttributes.onheadermousemove, action);
}
@Test
@CoversAttributes("onheadermouseup")
@Templates(value = "plain")
public void testOnheadermouseup() {
Action action = new Actions(driver).clickAndHold(page.getItemContents().get(0))
.moveToElement(page.getTabPanel().advanced().getActiveHeaderElement()).release().build();
testFireEvent(tabAttributes, TabAttributes.onheadermouseup, action);
}
@Test
@CoversAttributes("onleave")
@IssueTracking("https://issues.jboss.org/browse/RF-9537")
public void testOnleave() {
Action action = new Actions(driver).click(page.getInactiveHeaders().get(2)).build();
testFireEvent(tabAttributes, TabAttributes.onleave, action);
}
@Test
@CoversAttributes("onmousedown")
@Templates(value = "plain")
public void testOnmousedown() {
Action action = new Actions(driver).clickAndHold(page.getItemContents().get(0)).build();
testFireEvent(tabAttributes, TabAttributes.onmousedown, action);
}
@Test
@CoversAttributes("onmousemove")
@Templates(value = "plain")
public void testOnmousemove() {
Action action = new Actions(driver).moveToElement(page.getInactiveHeaders().get(2))
.moveToElement(page.getItemContents().get(0)).build();
testFireEvent(tabAttributes, TabAttributes.onmousemove, action);
}
@Test
@CoversAttributes("onmouseout")
@Templates(value = "plain")
public void testOnmouseout() {
Action action = new Actions(driver).moveToElement(page.getItemContents().get(0))
.moveToElement(page.getInactiveHeaders().get(2)).build();
testFireEvent(tabAttributes, TabAttributes.onmouseout, action);
}
@Test
@CoversAttributes("onmouseover")
@Templates(value = "plain")
public void testOnmouseover() {
Action action = new Actions(driver).moveToElement(page.getItemContents().get(0)).build();
testFireEvent(tabAttributes, TabAttributes.onmouseover, action);
}
@Test
@CoversAttributes("onmouseup")
@Templates(value = "plain")
public void testOnmouseup() {
new Actions(driver).clickAndHold(page.getItemContents().get(0)).perform();
Action action = new Actions(driver).release(page.getItemContents().get(0)).build();
testFireEvent(tabAttributes, TabAttributes.onmouseup, action);
}
@Test
@CoversAttributes("render")
public void testRender() {
testRenderWithSwitchTypeOrMode(switchToTabAction);
}
@Test
@CoversAttributes("rendered")
@Templates(value = "plain")
public void testRendered() {
tabAttributes.set(TabAttributes.rendered, Boolean.FALSE);
assertNotPresent(page.getFirstTabContentParentElement(), "Tab should not be rendered when rendered=false.");
}
@Test
@IssueTracking("https://issues.jboss.org/browse/RF-14076")
@CoversAttributes("status")
public void testStatus() {
testStatus(switchToTabAction);
}
@Test
@CoversAttributes("style")
@Templates(value = "plain")
public void testStyle() {
testStyle(page.getFirstTabContentParentElement());
}
@Test
@CoversAttributes("styleClass")
@Templates(value = "plain")
public void testStyleClass() {
testStyleClass(page.getFirstTabContentParentElement());
}
@Test(groups = "smoke")
@CoversAttributes("switchType")
@Templates(value = "plain")
public void testSwitchTypeAjax() {
tabAttributes.set(TabAttributes.switchType, "ajax");
testSwitchTypeNull();
}
@Test(groups = "smoke")
@CoversAttributes("switchType")
public void testSwitchTypeClient() {
tabAttributes.set(TabAttributes.switchType, "client");
guardAjax(page.getInactiveHeaders().get(1)).click();
waitGui(driver).withMessage("Tab 2 is not displayed.").until().element(page.getItemContents().get(1)).is()
.visible();
guardNoRequest(page.getInactiveHeaders().get(0)).click();
waitGui(driver).withMessage("Tab 1 is not displayed.").until().element(page.getItemContents().get(0)).is()
.visible();
}
@Test
@CoversAttributes("switchType")
@IssueTracking("https://issues.jboss.org/browse/RF-10488")
public void testSwitchTypeNull() {
guardAjax(page.getInactiveHeaders().get(1)).click();
waitGui(driver).withMessage("Tab 2 is not displayed.").until().element(page.getItemContents().get(1)).is()
.visible();
guardAjax(page.getInactiveHeaders().get(0)).click();
waitGui(driver).withMessage("Tab 1 is not displayed.").until().element(page.getItemContents().get(0)).is()
.visible();
}
@Test
@CoversAttributes("switchType")
public void testSwitchTypeServer() {
tabAttributes.set(TabAttributes.switchType, "server");
guardAjax(page.getInactiveHeaders().get(1)).click();
waitGui(driver).withMessage("Tab 2 is not displayed.").until().element(page.getItemContents().get(1)).is()
.visible();
guardHttp(page.getInactiveHeaders().get(0)).click();
waitGui(driver).withMessage("Tab 1 is not displayed.").until().element(page.getItemContents().get(0)).is()
.visible();
}
@Test
@CoversAttributes("title")
@Templates(value = "plain")
public void testTitle() {
testTitle(page.getFirstTabContentParentElement());
}
}