package org.qooxdoo.demo.feedreaderdesktop;
import java.util.Iterator;
import java.util.Random;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.oneandone.qxwebdriver.By;
import org.oneandone.qxwebdriver.ui.Widget;
import org.oneandone.qxwebdriver.ui.basic.Label;
import org.oneandone.qxwebdriver.ui.form.List;
import org.oneandone.qxwebdriver.ui.tree.Tree;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.qooxdoo.demo.IntegrationTest;
public class FeedReader extends IntegrationTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
IntegrationTest.setUpBeforeClass();
driver.jsExecutor.executeScript("qx.locale.Manager.getInstance().setLocale('en');");
}
public static String toolbarLocator = "qx.ui.container.Composite/feedreader.view.desktop.ToolBar";
public static String prefWinLocator = "feedreader.view.desktop.PreferenceWindow";
public static String treeLocator = "qx.ui.container.Composite/qx.ui.splitpane.Pane/qx.ui.tree.Tree";
public static String articleLoc = "qx.ui.container.Composite/qx.ui.splitpane.Pane/qx.ui.splitpane.Pane/feedreader.view.desktop.Article";
public static String addFeedLoc = "feedreader.view.desktop.AddFeedWindow";
@Before
public void waitUntilFeedsLoaded() {
new WebDriverWait(driver, 30, 250).until(feedsReady());
}
private List __postList;
public List getPostList() {
if (__postList == null) {
String listLoc = "qx.ui.container.Composite/qx.ui.splitpane.Pane/qx.ui.splitpane.Pane/feedreader.view.desktop.List";
Widget frList = (Widget) driver.findWidget(By.qxh(listLoc));
WebElement listEl = (WebElement) frList.executeJavascript("return qx.ui.core.Widget.getWidgetByElement(arguments[0]).getList().getContentElement().getDomElement()");
List list = (List) driver.getWidgetForElement(listEl);
__postList = list;
}
return __postList;
}
public ExpectedCondition<Boolean> feedsReady() {
return new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver webDriver) {
By treeLoc = By.qxh(treeLocator);
Tree tree = (Tree) driver.findWidget(treeLoc);
java.util.List<Widget> items = (java.util.List<Widget>) tree.getWidgetListFromProperty("items");
Iterator<Widget> itr = items.iterator();
while (itr.hasNext()) {
Widget item = (Widget) itr.next();
String iconSrc = (String) item.getChildControl("icon").getPropertyValue("source");
if (iconSrc.contains("loading")) {
return false;
}
}
return true;
}
@Override
public String toString() {
return "All feeds have finished loading.";
}
};
}
@Test
public void feedsLoaded() {
By treeLoc = By.qxh(treeLocator);
Tree tree = (Tree) driver.findWidget(treeLoc);
java.util.List<Widget> items = (java.util.List<Widget>) tree.getWidgetListFromProperty("items");
Iterator<Widget> itr = items.iterator();
while (itr.hasNext()) {
Widget item = (Widget) itr.next();
Label label = (Label) item.getChildControl("label");
String feedTitle = label.getValue();
String iconSrc = (String) item.getChildControl("icon").getPropertyValue("source");
if (iconSrc.contains("process-stop")) {
System.err.println("Feed '" + feedTitle + "' did not load!");
} else if (!iconSrc.contains("folder")) {
checkFeed(item);
}
}
}
public String escapeJsRegEx(String str) {
String result = str.replaceAll("([()\\[{*+.$^\\|?])", "\\\\$1");
return result;
}
public void checkFeed(Widget item) {
String title = item.getText();
System.out.println("Checking feed " + title);
Assert.assertNotNull("item is null", item);
item.click();
List postList = getPostList();
java.util.List<Widget> items = postList.getChildren();
Assert.assertNotEquals("Feed '" + title + "' has no entries.", items.size(), 0);
Random rnd = new Random();
Integer feedIndex = rnd.nextInt(items.size());
Widget listItem = items.get(feedIndex);
Assert.assertNotNull("list item is null", listItem);
String newItemLabel = (String) listItem.getPropertyValue("label");
Assert.assertNotNull("new item label is null", newItemLabel);
// scroll the feed item into view
Widget feedItem = postList.getSelectableItem("^" + escapeJsRegEx(newItemLabel) + "$");
if (feedItem == null) {
System.err.println("Feed item '" + newItemLabel + "' is null");
return;
}
String label = (String) feedItem.getPropertyValue("label");
Assert.assertNotNull(label);
Assert.assertEquals(newItemLabel, label);
feedItem.click();
checkFeedItem();
}
public void checkFeedItem() {
Widget article = driver.findWidget(By.qxh(articleLoc));
String html = (String) article.getPropertyValue("html");
Assert.assertNotEquals(0, html.length());
}
@Test
public void changeLocale() throws InterruptedException {
selectLocale("Italiano");
Thread.sleep(500);
// translate a string (only works if the locale was loaded correctly)
String preferences = driver.getTranslation("Preferences");
Assert.assertEquals("Preferenze", preferences);
String prefsLocator = toolbarLocator + "/[@label=" + preferences + "]";
Widget prefsButton = driver.findWidget(By.qxh(prefsLocator));
Assert.assertNotNull(prefsButton);
String folderLocator = treeLocator + "/child[0]/child[0]/child[0]/qx.ui.tree.TreeFolder/[@value=Feed statici]";
Widget treeFolder = driver.findWidget(By.qxh(folderLocator));
Assert.assertNotNull(treeFolder);
selectLocale("English");
folderLocator = treeLocator + "/child[0]/child[0]/child[0]/qx.ui.tree.TreeFolder/[@value=Static Feeds]";
treeFolder = driver.findWidget(By.qxh(folderLocator));
Assert.assertNotNull(treeFolder);
}
public void selectLocale(String language) {
String preferences = driver.getTranslation("Preferences");
String prefsLocator = toolbarLocator + "/[@label=" + preferences + "]";
Widget prefsButton = driver.findWidget(By.qxh(prefsLocator));
prefsButton.click();
String italianLocator = prefWinLocator + "/*/[@label=" + language + "]";
Widget italianLabel = driver.findWidget(By.qxh(italianLocator));
italianLabel.click();
String ok = driver.getTranslation("OK");
String okLocator = prefWinLocator + "/qx.ui.container.Composite/[@label=" + ok + "]";
Widget okButton = driver.findWidget(By.qxh(okLocator));
okButton.click();
}
@Test
public void addFeed() throws InterruptedException {
String newFeedTitle = "The Register";
String newFeedUrl = "http://www.theregister.co.uk/headlines.atom";
String addFeed = driver.getTranslation("Add feed");
String addWinLocator = toolbarLocator + "/[@label=" + addFeed + "]";
Widget addWinButton = driver.findWidget(By.qxh(addWinLocator));
addWinButton.click();
String title = driver.getTranslation("Title");
Widget titleInput = driver.findWidget(By.qxh(addFeedLoc + "/*/[@placeholder=" + title + "]"));
titleInput.sendKeys(newFeedTitle);
String url = driver.getTranslation("URL");
Widget urlInput = driver.findWidget(By.qxh(addFeedLoc + "/*/[@placeholder=" + url + "]"));
urlInput.sendKeys(newFeedUrl);
String add = driver.getTranslation("Add");
Widget addButton = driver.findWidget(By.qxh(addFeedLoc + "/*/[@label=" + add + "]"));
addButton.click();
Widget newFeedItem = driver.waitForWidget(By.qxh(treeLocator + "/*/[@label=" + newFeedTitle + "]"), 15);
Assert.assertNotNull(newFeedItem);
waitUntilFeedsLoaded();
checkFeed(newFeedItem);
}
}