blob: 63380a2df8003debe7e6ac5c9e185d5ddbd435cd [file] [log] [blame]
/* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.portals.pluto.demo.integration.test;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.NoSuchElementException;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.Keys;
import org.openqa.selenium.support.ui.Select;
import static org.apache.portals.pluto.demo.integration.test.Util.*;
import org.openqa.selenium.JavascriptExecutor;
import static org.openqa.selenium.support.ui.ExpectedConditions.*;
/**
*
* @author Kyle Stiemann
*/
public class PortletHubDemoIT extends DemoTestDriver {
private static final List<String> IMAGE_OPTIONS = Util.unmodifiableList("golfball", "baseball", "fussball");
private static final String TOKEN = "{0}";
private static final String IMAGE_XPATH_TEMPLATE =
"//img[contains(@src,'/hub-demo-portlet/resources/images/" + TOKEN + ".gif')]";
@Test
public void testPortletHubDemo() throws UnsupportedEncodingException {
navigateToPage("V3.0 Portlet Hub Demo");
// Verify that all the different images appear when clicking each radio button.
By imageByXpath = By.xpath(IMAGE_XPATH_TEMPLATE.replace(TOKEN, "FullMoon"));
waitingAsserter.assertTrue(visibilityOfElementLocated(imageByXpath));
for (String imageName : IMAGE_OPTIONS) {
clickElement(driver, waitingAsserter,
getXpath("div", "hub_demo_portlet", "ImageSelPortlet") + "/input[@value='" + imageName + "']");
waitingAsserter.assertTrue(elementNotPresentOrNotVisible(imageByXpath));
imageByXpath = By.xpath(IMAGE_XPATH_TEMPLATE.replace(TOKEN, imageName + "-trans"));
waitingAsserter.assertTrue(visibilityOfElementLocated(imageByXpath));
}
// Verify that all the different images appear when clicking each dropdown option.
clickElement(driver, waitingAsserter, "input", "hub_demo_portlet", "ImageSelPortlet", "dropdown");
By imageSelectByXpath = By.xpath(getXpath("select", "hub_demo_portlet", "ImageSelPortlet") + "[@name='imgName']");
waitingAsserter.waitFor(elementToBeClickable(imageSelectByXpath));
Select select = new Select(driver.findElement(imageSelectByXpath));
select.selectByValue("default");
imageByXpath = By.xpath(IMAGE_XPATH_TEMPLATE.replace(TOKEN, "FullMoon"));
waitingAsserter.assertTrue(visibilityOfElementLocated(imageByXpath));
for (String imageName : IMAGE_OPTIONS) {
select = new Select(driver.findElement(imageSelectByXpath));
select.selectByValue(imageName);
waitingAsserter.assertTrue(elementNotPresentOrNotVisible(imageByXpath));
imageByXpath = By.xpath(IMAGE_XPATH_TEMPLATE.replace(TOKEN, imageName + "-trans"));
waitingAsserter.assertTrue(visibilityOfElementLocated(imageByXpath));
}
// Verify that the border checkbox shows and hides the border on the image.
waitingAsserter.assertTrue(and(visibilityOfElementLocated(imageByXpath), attributeEmpty(imageByXpath, "style")));
clickElement(driver, waitingAsserter, "input", "hub_demo_portlet", "PH", "ResourcePortlet", "PRP", "border");
waitingAsserter.assertTrue(and(visibilityOfElementLocated(imageByXpath),
attributeContains(imageByXpath, "style", "border:")));
// Verify that the different cacheability radion buttons change the visible cacheability text.
String cacheabilityRadioButtonXpathTemplate =
getXpath("input", "hub_demo_portlet", "PH", "ResourcePortlet", "PRP") + "[@value='" + TOKEN + "']";
String resourcePortletDivXpath = getXpath("div", "hub_demo_portlet", "PH", "ResourcePortlet", "PRP");
By actionButtonByXpath = By.xpath(resourcePortletDivXpath + "//input[@value='Action']");
for (String cacheability : Util.unmodifiableList("Portlet", "Full", "Page")) {
String cacheabilityResultXpath = resourcePortletDivXpath + "//p[contains(text(),'Cacheability')]";
waitingAsserter.assertTrue(elementNotPresentOrNotVisible(By.xpath(cacheabilityResultXpath +
"[contains(text(),'" + cacheability + "')]")));
String cacheabilityRadioButtonXpath = cacheabilityRadioButtonXpathTemplate.replace(TOKEN,
cacheability.toUpperCase(Locale.ENGLISH));
clickElement(driver, waitingAsserter, cacheabilityRadioButtonXpath);
By cacheabilityResultByXpath = By.xpath(cacheabilityResultXpath);
waitingAsserter.assertTrue(and(visibilityOfElementLocated(cacheabilityResultByXpath),
textToBePresentInElementLocated(cacheabilityResultByXpath, cacheability)));
if ("Page".equalsIgnoreCase(cacheability)) {
waitingAsserter.assertTrue(visibilityOfElementLocated(actionButtonByXpath));
} else {
waitingAsserter.assertTrue(visibilityOfElementLocated(By.xpath(resourcePortletDivXpath +
"[contains(.,'Action URL could not be created.')]")));
}
}
// Click the Action button.
clickElement(driver, waitingAsserter, actionButtonByXpath);
waitingAsserter.assertTrue(visibilityOfElementLocated(actionButtonByXpath));
// Verify the background color changes.
navigateToPage("V3.0 Portlet Hub Demo");
((JavascriptExecutor)driver).executeScript("window.scrollTo(0,document.body.scrollHeight);");
By coloredTableByXpath =
By.xpath(getXpath("div", "hub_demo_portlet", "PH", "ResourcePortlet", "PRP", "putResourceHere") +
"//table[@style]");
waitingAsserter.assertTrue(and(visibilityOfElementLocated(coloredTableByXpath),
backgroundColor(coloredTableByXpath, 0xFF, 0xFF, 0xFF)));
String colorInputXpath = getXpath("input", "hub_demo_portlet", "PH", "ColorSelPortlet", "color");
sendKeysToElement(driver, waitingAsserter, colorInputXpath, "#FF0000", Keys.ENTER);
waitingAsserter.assertTrue(and(visibilityOfElementLocated(coloredTableByXpath),
backgroundColor(coloredTableByXpath, 0xFF, 0, 0)));
// Verify that messages can be sent in different colors by different methods.
for (String formSubmissionMethod : Util.unmodifiableList("URL", "form")) {
for (ColorCombo colorCombo : ColorCombo.getAllPossibleCombos()) {
String lowerCaseFormSubmissionMethod = formSubmissionMethod.toLowerCase(Locale.ENGLISH);
clickElement(driver, waitingAsserter, "input", "hub_demo_portlet", "PH", "ColorSelPortlet",
lowerCaseFormSubmissionMethod);
testMessageSent(colorCombo);
}
clickElement(driver, waitingAsserter, "input", "hub_demo_portlet", "MessageBoxPortlet", "clear");
}
// Click the Do Partial Action button and check that the reponse text appears.
By responseDivByXpath = By.xpath(getXpath("div", "hub_demo_portlet", "PartialActionPortlet", "responseDiv"));
waitingAsserter.assertTrue(textEmpty(responseDivByXpath));
for (int i = 1; i <= 10; i++) {
clickElement(driver, waitingAsserter, "input", "hub_demo_portlet", "PartialActionPortlet", "doPA");
waitingAsserter.assertTrue(and(visibilityOfElementLocated(responseDivByXpath),
textToBePresentInElementLocated(responseDivByXpath,
"Partial Action has been executed " + i + " times.")));
}
}
private void testMessageSent(ColorCombo colorCombo) {
handleColorCheckbox("red", colorCombo.isRedSelected());
handleColorCheckbox("green", colorCombo.isGreenSelected());
handleColorCheckbox("blue", colorCombo.isBlueSelected());
String messageInputXpath = getXpath("input", "hub_demo_portlet", "PH", "ColorSelPortlet", "msg");
String message = colorCombo.getHexString();
sendKeysToElement(driver, waitingAsserter, messageInputXpath, message);
clickElement(driver, waitingAsserter, "input", "hub_demo_portlet", "PH", "ColorSelPortlet", "send");
By messageOutputByXpath =
By.xpath(getXpath("div", "hub_demo_portlet", "MessageBoxPortlet", "responseDiv") +
"/p[contains(text(),'" + colorCombo.getIndex() + ": " + message + "')]");
waitingAsserter.assertTrue(and(visibilityOfElementLocated(messageOutputByXpath),
or(attributeContains(messageOutputByXpath, "style", "color:#" + message + ";"),
attributeContains(messageOutputByXpath, "style", "color: " + colorCombo.getCSS_RGBString() + ";"))));
}
private void handleColorCheckbox(String colorName, boolean colorSelected) {
WebElement colorCheckbox =
driver.findElement(By.xpath(getXpath("input", "hub_demo_portlet", "PH", "ColorSelPortlet", colorName)));
if ((colorSelected && !colorCheckbox.isSelected()) || (!colorSelected && colorCheckbox.isSelected())) {
colorCheckbox.click();
}
}
private static final class ColorCombo {
// Constants
private static final byte BLUE_BIT_POSITION = 0;
private static final byte GREEN_BIT_POSITION = BLUE_BIT_POSITION + 1;
private static final byte RED_BIT_POSITION = GREEN_BIT_POSITION + 1;
private static final byte BINARY_STRING_LENGTH = RED_BIT_POSITION + 1;
// Data
private final byte selectedColorsInBinary;
public ColorCombo(byte selectedColorsInBinary) {
this.selectedColorsInBinary = selectedColorsInBinary;
}
public boolean isRedSelected() {
return isColorSelected(selectedColorsInBinary, RED_BIT_POSITION);
}
public boolean isGreenSelected() {
return isColorSelected(selectedColorsInBinary, GREEN_BIT_POSITION);
}
public boolean isBlueSelected() {
return isColorSelected(selectedColorsInBinary, BLUE_BIT_POSITION);
}
public String getCSS_RGBString() {
return "rgb(" +
getBinaryString()
.replace("", " ").trim().replace(" ", ", ")
.replace("1", Integer.toString(0xFF)) +
")";
}
public String getHexString() {
return "#" + getBinaryString().replace("1", "F");
}
public String getIndex() {
return Integer.toString(selectedColorsInBinary + 1);
}
private String getBinaryString() {
return getZeroPaddedString(Integer.toBinaryString(selectedColorsInBinary), BINARY_STRING_LENGTH);
}
private static boolean isColorSelected(byte selectedColors, byte colorBitPosition) {
return ((selectedColors >> colorBitPosition) & 1) == 1;
}
public static Iterable<ColorCombo> getAllPossibleCombos() {
return new AllPossibleCombosIterable();
}
private static final class AllPossibleCombosIterator implements Iterator<ColorCombo> {
// Constants
private static final byte ALL_COLORS = 0b111;
private static final byte NO_COLORS = 0b000;
// Data
private byte selectedColorsInBinary = NO_COLORS;
@Override
public boolean hasNext() {
return selectedColorsInBinary <= ALL_COLORS;
}
@Override
public ColorCombo next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
ColorCombo colorCombo = new ColorCombo(selectedColorsInBinary);
selectedColorsInBinary++;
return colorCombo;
}
}
private static final class AllPossibleCombosIterable implements Iterable<ColorCombo> {
@Override
public Iterator<ColorCombo> iterator() {
return new AllPossibleCombosIterator();
}
}
}
}