/*
* 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.richDropDownMenu;
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.jboss.arquillian.graphene.Graphene.waitModel;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.fail;
import org.jboss.arquillian.graphene.Graphene;
import org.jboss.arquillian.graphene.page.Page;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.TimeoutException;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Action;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.interactions.HasInputDevices;
import org.openqa.selenium.interactions.Mouse;
import org.openqa.selenium.interactions.internal.Coordinates;
import org.openqa.selenium.internal.Locatable;
import org.richfaces.fragment.common.Event;
import org.richfaces.fragment.common.Locations;
import org.richfaces.fragment.common.Utils;
import org.richfaces.fragment.dropDownMenu.RichFacesDropDownMenu;
import org.richfaces.tests.metamer.ftest.AbstractWebDriverTest;
import org.richfaces.tests.metamer.ftest.extension.attributes.coverage.annotations.CoversAttributes;
import org.richfaces.tests.metamer.ftest.richContextMenu.ContextMenuSimplePage;
import org.richfaces.tests.metamer.ftest.webdriver.Attributes;
/**
* Abstract test used for testing both drop down menus - top and side
*
* @author <a href="mailto:manovotn@redhat.com">Matej Novotny</a>
*/
public abstract class AbstractDropDownMenuTest extends AbstractWebDriverTest {
protected Integer delay;
protected Integer[] delays = { 1000, 1500, 1900 };
private final Attributes<DropDownMenuAttributes> dropDownMenuAttributes = getAttributes();
@Page
private DropDownMenuPage page;
protected RichFacesDropDownMenu getCurrentMenu() {
return page.getFileDropDownMenu(driver.getCurrentUrl());
}
public DropDownMenuPage getPage() {
return page;
}
public String returnPopupWidth(String minWidth, RichFacesDropDownMenu dropDownMenu) {
dropDownMenuAttributes.set(DropDownMenuAttributes.popupWidth, minWidth);
dropDownMenu.advanced().show(page.getTarget1());
return page.getDropDownMenuContent().getCssValue("min-width");
}
@CoversAttributes("dir")
public void testDir() {
updateDropDownMenuInvoker();
String expected = "rtl";
dropDownMenuAttributes.set(DropDownMenuAttributes.dir, expected);
getCurrentMenu().advanced().show(page.getTarget1());
String directionCSS = getCurrentMenu().advanced().getItemsElements().get(0)
.getCssValue("direction");
assertEquals(directionCSS, expected, "The direction attribute was not applied correctly!");
}
@CoversAttributes("direction")
public void testDirection() {
updateDropDownMenuInvoker();
testDirection(new ShowElementAndReturnAction() {
@Override
public WebElement perform() {
getCurrentMenu().advanced().show(page.getTarget1());
return getCurrentMenu().advanced().getMenuPopup();
}
});
}
@CoversAttributes("disabled")
public void testDisabled() {
updateDropDownMenuInvoker();
getCurrentMenu().advanced().show(page.getTarget1());
dropDownMenuAttributes.set(DropDownMenuAttributes.disabled, true);
try {
getCurrentMenu().advanced().show(page.getTarget1());
fail("The context menu should not be invoked when disabled!");
} catch (TimeoutException ex) {
// OK
}
}
@CoversAttributes("hideDelay")
public void testHideDelay(int delay) {
WebElement menuRoot = driver.findElement(By.cssSelector("[id$='menu1']"));
new MenuDelayTester().testHideDelay(menuRoot, delay, new Event[] { Event.MOUSEOVER, Event.MOUSEOUT }, menuRoot);
}
@CoversAttributes("horizontalOffset")
public void testHorizontalOffset() {
updateDropDownMenuInvoker();
testHorizontalOffset(new ShowElementAndReturnAction() {
@Override
public WebElement perform() {
getCurrentMenu().advanced().show(page.getTarget1());
return getCurrentMenu().advanced().getMenuPopup();
}
});
}
public void testInit() {
page.fullPageRefresh();
updateDropDownMenuInvokerToClick();
getAttributes().set(DropDownMenuAttributes.hideDelay, 3000);
assertPresent(page.getFileMenu(), "Drop down menu \"File\" should be present on the page.");
assertVisible(page.getFileMenu(), "Drop down menu \"File\" should be visible on the page.");
assertPresent(page.getGroup(), "Menu group \"Save As...\" should be present on the page.");
assertNotVisible(page.getGroup(), "Menu group \"Save As...\" should not be visible on the page.");
assertNotVisible(page.getFileMenuList(), "Menu should not be expanded.");
page.getTarget1().click();
assertVisible(page.getFileMenuList(), "Menu should be expanded.");
assertPresent(page.getGroup(), "Menu group \"Save As...\" should be present on the page.");
assertVisible(page.getGroup(), "Menu group \"Save As...\" should be visible on the page.");
assertPresent(page.getMenuItem41(), "Menu item \"Save\" should be present on the page.");
assertNotVisible(page.getMenuItem41(), "Menu item \"Save\" should not be visible on the page.");
assertNotVisible(page.getGroupList(), "Submenu should not be expanded.");
guardNoRequest(new Actions(driver).click(getCurrentMenu().advanced().getItemsElements().get(3)).build())
.perform();
assertVisible(page.getGroupList(), "Submenu should be expanded.");
assertPresent(page.getMenuItem41(), "Menu item \"Save\" should be present on the page.");
assertVisible(page.getMenuItem41(), "Menu item \"Save\" should be visible on the page.");
assertPresent(page.getIcon(), "Icon of menu group should not be present on the page.");
assertPresent(page.getFileMenuLabelOriginal(), "Label of menu should be present on the page.");
assertVisible(page.getFileMenuLabelOriginal(), "Label of menu should be visible on the page.");
assertEquals(page.getFileMenuLabelOriginal().getText(), "File", "Label of the menu");
}
@CoversAttributes("jointPoint")
public void testJointPoint() {
updateDropDownMenuInvoker();
getCurrentMenu().advanced().show(page.getTarget1());
Locations l = Utils.getLocations(page.getFileMenu());
testJointPoint(l.getWidth(), l.getHeight(), new ShowElementAndReturnAction() {
@Override
public WebElement perform() {
getCurrentMenu().advanced().show(page.getTarget1());
return getCurrentMenu().advanced().getMenuPopup();
}
});
}
@CoversAttributes("lang")
public void testLang() {
updateDropDownMenuInvoker();
String langVal = "cs";
dropDownMenuAttributes.set(DropDownMenuAttributes.lang, langVal);
getCurrentMenu().advanced().show(page.getTarget1());
assertEquals(getCurrentMenu().advanced().getLangAttribute(), langVal,
"The lang attribute was not set correctly!");
}
@CoversAttributes("mode")
public void testMode() {
updateDropDownMenuInvokerToClick();
// ajax
dropDownMenuAttributes.set(DropDownMenuAttributes.mode, "ajax");
getAttributes().set(DropDownMenuAttributes.hideDelay, 2000);
page.getTarget1().click();
guardAjax(new Actions(driver).click(getCurrentMenu().advanced().getItemsElements().get(0)).build())
.perform();
assertEquals(page.getOutput().getText(), "New", "Menu action was not performed.");
// server
dropDownMenuAttributes.set(DropDownMenuAttributes.mode, "server");
page.getTarget1().click();
guardHttp(new Actions(driver).click(getCurrentMenu().advanced().getItemsElements().get(1)).build())
.perform();
assertEquals(page.getOutput().getText(), "Open", "Menu action was not performed.");
// client
dropDownMenuAttributes.set(DropDownMenuAttributes.mode, "client");
getCurrentMenu().advanced().show(page.getTarget1());
guardNoRequest(getCurrentMenu().advanced().getItemsElements().get(0)).click();
// null
dropDownMenuAttributes.set(DropDownMenuAttributes.mode, "server");
getCurrentMenu().advanced().show(page.getTarget1());
guardHttp(getCurrentMenu().advanced().getItemsElements().get(1)).click();
assertEquals(page.getOutput().getText(), "Open", "Menu action was not performed.");
}
public void testNoResourceErrorPresent() {
checkNoResourceErrorPresent(new Action() {
@Override
public void perform() {
updateDropDownMenuInvoker();
getCurrentMenu().advanced().show(page.getTarget1());
}
});
}
@CoversAttributes("onclick")
public void testOnclick() {
updateDropDownMenuInvoker();
testFireEvent(dropDownMenuAttributes, DropDownMenuAttributes.onclick, new Action() {
@Override
public void perform() {
getCurrentMenu().advanced().show(page.getTarget1());
getCurrentMenu().advanced().getItemsElements().get(1).click();
}
});
}
@CoversAttributes("ondblclick")
public void testOndblclick() {
updateDropDownMenuInvoker();
testFireEvent(dropDownMenuAttributes, DropDownMenuAttributes.ondblclick, new Action() {
@Override
public void perform() {
getCurrentMenu().advanced().show(page.getTarget1());
new Actions(driver)
.doubleClick(getCurrentMenu().advanced().getItemsElements().get(2))
.build().perform();
}
});
}
@CoversAttributes("ongrouphide")
public void testOngrouphide() {
updateDropDownMenuInvokerToClick();
getAttributes().set(DropDownMenuAttributes.hideDelay, 3000);
testFireEvent(dropDownMenuAttributes, DropDownMenuAttributes.ongrouphide, new Action() {
@Override
public void perform() {
page.getTarget1().click();
new Actions(driver)
.click(
getCurrentMenu().advanced().getItemsElements().get(3)).build()
.perform();
waitGui().until().element(page.getGroupList()).is().visible();
new Actions(driver)
.click(getCurrentMenu().advanced().getItemsElements().get(1))
.build().perform();
waitGui().until().element(page.getGroupList()).is().not().visible();
}
});
}
@CoversAttributes("ongroupshow")
public void testOngroupshow() {
updateDropDownMenuInvokerToClick();
getAttributes().set(DropDownMenuAttributes.hideDelay, 500);
testFireEvent(dropDownMenuAttributes, DropDownMenuAttributes.ongroupshow, new Action() {
@Override
public void perform() {
page.getTarget1().click();
new Actions(driver)
.click(
getCurrentMenu().advanced().getItemsElements().get(3)).build()
.perform();
waitGui().until().element(page.getGroupList()).is().visible();
}
});
}
@CoversAttributes("onhide")
public void testOnhide() {
updateDropDownMenuInvoker();
testFireEvent(dropDownMenuAttributes, DropDownMenuAttributes.onhide, new Action() {
@Override
public void perform() {
getCurrentMenu().advanced().show(page.getTarget1());
getCurrentMenu().advanced().hide();
}
});
}
@CoversAttributes("onitemclick")
public void testOnitemclick() {
updateDropDownMenuInvoker();
testOnclick();
}
@CoversAttributes("onkeydown")
public void testOnkeydown() {
updateDropDownMenuInvoker();
testFireEvent(dropDownMenuAttributes, DropDownMenuAttributes.onkeydown, new Action() {
@Override
public void perform() {
getCurrentMenu().advanced().show(page.getTarget1());
new Actions(driver)
.keyDown(getCurrentMenu().advanced().getItemsElements().get(2),
Keys.CONTROL)
.keyUp(getCurrentMenu().advanced().getItemsElements().get(2),
Keys.CONTROL).build().perform();
}
});
}
@CoversAttributes("onkeypress")
public void testOnkeypress() {
updateDropDownMenuInvoker();
testFireEvent(dropDownMenuAttributes, DropDownMenuAttributes.onkeypress, new Action() {
@Override
public void perform() {
getCurrentMenu().advanced().show(page.getTarget1());
new Actions(driver).sendKeys("a").build().perform();
}
});
}
@CoversAttributes("onkeyup")
public void testOnkeyup() {
testFireEventWithJS(getCurrentMenu().advanced().getMenuPopup(),
dropDownMenuAttributes, DropDownMenuAttributes.onkeyup);
}
@CoversAttributes("onmousedown")
public void testOnmousedown() {
updateDropDownMenuInvoker();
testFireEvent(dropDownMenuAttributes, DropDownMenuAttributes.onmousedown, new Action() {
@Override
public void perform() {
getCurrentMenu().advanced().show(page.getTarget1());
Mouse mouse = ((HasInputDevices) driver).getMouse();
mouse.mouseDown(((Locatable) getCurrentMenu().advanced()
.getItemsElements().get(1)).getCoordinates());
}
});
}
@CoversAttributes("onmousemove")
public void testOnmousemove() {
testFireEventWithJS(getCurrentMenu().advanced().getMenuPopup(),
dropDownMenuAttributes, DropDownMenuAttributes.onmousemove);
}
@CoversAttributes("onmouseout")
public void testOnmouseout() {
updateDropDownMenuInvoker();
testFireEvent(dropDownMenuAttributes, DropDownMenuAttributes.onmouseout, new Action() {
@Override
public void perform() {
getCurrentMenu().advanced().show(page.getTarget1());
new Actions(driver)
.moveToElement(
getCurrentMenu().advanced().getItemsElements().get(3)).build()
.perform();
waitModel().until().element(page.getGroupList()).is().visible();
new Actions(driver).moveToElement(page.getRequestTimeElement()).build().perform();
waitGui().until().element(page.getGroupList()).is().not().visible();
}
});
}
@CoversAttributes("onmouseover")
public void testOnmouseover() {
testFireEventWithJS(getCurrentMenu().advanced().getMenuPopup(),
dropDownMenuAttributes, DropDownMenuAttributes.onmouseover);
}
@CoversAttributes("onmouseup")
public void testOnmouseup() {
updateDropDownMenuInvoker();
testFireEvent(dropDownMenuAttributes, DropDownMenuAttributes.onmouseup, new Action() {
@Override
public void perform() {
getCurrentMenu().advanced().show(page.getTarget1());
Mouse mouse = ((HasInputDevices) driver).getMouse();
Coordinates coords = ((Locatable) getCurrentMenu().advanced()
.getItemsElements().get(1)).getCoordinates();
mouse.mouseDown(coords);
mouse.mouseUp(coords);
}
});
}
@CoversAttributes("onshow")
public void testOnshow() {
updateDropDownMenuInvoker();
testFireEvent(dropDownMenuAttributes, DropDownMenuAttributes.onshow, new Action() {
@Override
public void perform() {
new Actions(driver).moveToElement(page.getTarget1()).perform();
// page.getFileDropDownMenu(driver.getCurrentUrl()).advanced().invoke(page.getTarget1());
}
});
new Actions(driver).moveToElement(page.getRequestTimeElement()).perform();
}
@CoversAttributes("popupWidth")
public void testPopupWidth() {
updateDropDownMenuInvoker();
String minWidth = "333";
assertEquals(returnPopupWidth(minWidth, getCurrentMenu()), minWidth + "px");
minWidth = "250";
assertEquals(returnPopupWidth(minWidth, getCurrentMenu()), minWidth + "px");
minWidth = "250";
assertEquals(returnPopupWidth(minWidth, getCurrentMenu()), minWidth + "px");
}
@CoversAttributes("rendered")
public void testRendered() {
updateDropDownMenuInvoker();
dropDownMenuAttributes.set(DropDownMenuAttributes.rendered, Boolean.FALSE);
assertNotPresent(page.getFileMenuLabel(), "The drop down menu for file can not be rendered!");
}
@CoversAttributes("showDelay")
public void testShowDelay(int delay) {
WebElement menuRoot = driver.findElement(By.cssSelector("[id$='menu1']"));
new MenuDelayTester().testShowDelay(menuRoot, delay, Event.MOUSEOVER, menuRoot.findElement(By.tagName("div")));
}
@CoversAttributes("showEvent")
public void testShowEvent() {
dropDownMenuAttributes.set(DropDownMenuAttributes.showEvent, "contextmenu");
getCurrentMenu().advanced().setShowEvent(Event.CONTEXTCLICK);
getCurrentMenu().advanced().show(page.getTarget1());
dropDownMenuAttributes.set(DropDownMenuAttributes.showEvent, "mouseover");
getCurrentMenu().advanced().setShowEvent(Event.MOUSEOVER);
getCurrentMenu().advanced().show(page.getTarget1());
dropDownMenuAttributes.set(DropDownMenuAttributes.showEvent, "click");
getCurrentMenu().advanced().setShowEvent(Event.CLICK);
getCurrentMenu().advanced().show(page.getTarget1());
}
@CoversAttributes("style")
public void testStyle() {
updateDropDownMenuInvoker();
String color = "yellow";
String styleVal = "background-color: " + color + ";";
dropDownMenuAttributes.set(DropDownMenuAttributes.style, styleVal);
getCurrentMenu().advanced().show(page.getTarget1());
String backgroundColor = getCurrentMenu().advanced().getTopLevelElement()
.getCssValue("background-color");
// webdriver retrieves the color in rgba format
assertEquals(ContextMenuSimplePage.trimTheRGBAColor(backgroundColor), "rgba(255,255,0,1)",
"The style was not applied correctly!");
}
@CoversAttributes("styleClass")
public void testStyleClass() {
testStyleClass(getCurrentMenu().advanced().getTopLevelElement());
}
@CoversAttributes("styleClass")
public void testStyleClassWhenDisabled() {
setAttribute("disabled", true);
testStyleClass();
}
public void testSubMenuOpening() {
updateDropDownMenuInvokerToClick();
jsUtils.scrollToView(getCurrentMenu().advanced().getTopLevelElement());
Graphene.guardAjax(getCurrentMenu().expandGroup("Save As...", page.getTarget1())).selectItem("Save All");
assertEquals(page.getOutput().getText(), "Save All");
}
@CoversAttributes("title")
public void testTitle() {
updateDropDownMenuInvoker();
String titleVal = "test title";
dropDownMenuAttributes.set(DropDownMenuAttributes.title, titleVal);
assertEquals(
getCurrentMenu().advanced().getTopLevelElement().getAttribute("title"),
titleVal);
}
@CoversAttributes("verticalOffset")
public void testVerticalOffset() {
updateDropDownMenuInvoker();
testVerticalOffset(new ShowElementAndReturnAction() {
@Override
public WebElement perform() {
getCurrentMenu().advanced().show(page.getTarget1());
return getCurrentMenu().advanced().getMenuPopup();
}
});
}
private void updateDropDownMenuInvoker() {
getCurrentMenu().advanced().setShowEvent(Event.MOUSEOVER);
}
private void updateDropDownMenuInvokerToClick() {
getCurrentMenu().advanced().setShowEvent(Event.CLICK);
}
}