package it.com.atlassian.labs.speakeasy; import com.atlassian.pageobjects.Page; import com.atlassian.pageobjects.PageBinder; import com.atlassian.pageobjects.ProductInstance; import com.atlassian.pageobjects.TestedProduct; import com.atlassian.pageobjects.binder.Init; import com.atlassian.pageobjects.binder.WaitUntil; import com.atlassian.webdriver.AtlassianWebDriver; import com.google.common.base.Function; import it.com.atlassian.labs.speakeasy.proxy.ApplinksTab; import org.openqa.selenium.By; import org.openqa.selenium.NoSuchElementException; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import javax.inject.Inject; import java.io.IOException; import java.util.*; import static it.com.atlassian.labs.speakeasy.ProductUtils.flushMailQueue; import static java.lang.Integer.parseInt; /** * */ public class SpeakeasyUserPage implements Page { @Inject protected AtlassianWebDriver driver; @Inject ProductInstance productInstance; @Inject PageBinder pageBinder; MessagesBar messagesBar; @FindBy(id = "plugins-table") private WebElement pluginsTable; @FindBy(id = "jsdoc-tab") private WebElement jsdocTab; @FindBy(id = "applinks-tab") private WebElement applinksTab; @Inject private TestedProduct testedProduct; @Init public void init() { messagesBar = pageBinder.bind(MessagesBar.class); } @WaitUntil public void waitForSpeakeasyInit() { driver.waitUntilElementIsLocated(By.id("speakeasy-loaded")); final WebElement loaded = driver.findElement(By.id("speakeasy-loaded")); driver.waitUntil(new Function() { public Object apply(Object from) { return "".equals(loaded.getText()); } }); } public List<String> getPluginKeys() { List<String> pluginKeys = new ArrayList<String>(); for (WebElement e : pluginsTable.findElements(By.tagName("tr"))) { pluginKeys.add(e.getAttribute("data-pluginkey")); } return pluginKeys; } public Map<String, PluginRow> getPlugins() { Map<String,PluginRow> plugins = new LinkedHashMap<String,PluginRow>(); for (WebElement e : pluginsTable.findElements(By.tagName("tr"))) { PluginRow row = new PluginRow(); final String key = e.getAttribute("data-pluginkey"); if (key != null) { row.setKey(key); row.setName(e.findElement(By.className("plugin-name")).getText()); row.setDescription(e.findElement(By.className("plugin-description")).getText()); row.setAuthor(e.findElement(By.className("plugin-author")).getText()); row.setUsers(parseInt(e.findElement(By.className("plugin-users")).getText())); row.setFavorites(parseInt(e.findElement(By.className("plugin-favorites")).getText())); row.setVersion(e.findElement(By.className("plugin-version")).getText()); plugins.put(key,row); } } return plugins; } public String getUrl() { return "/plugins/servlet/speakeasy/user"; } public SpeakeasyUserPage enablePlugin(String pluginKey) throws IOException { getPluginRow(pluginKey).findElement(By.className("pk-enable")).click(); waitForMessages(); flushMailQueue(productInstance); return this; } public SpeakeasyUserPage disablePlugin(String pluginKey) { getPluginRow(pluginKey).findElement(By.className("pk-disable")).click(); waitForMessages(); return this; } public boolean isPluginEnabled(String pluginKey) { return "true".equalsIgnoreCase(getPluginRow(pluginKey).getAttribute("data-enabled")); } public boolean canEnable(String pluginKey) { final String disabled = getPluginRow(pluginKey).findElement(By.className("pk-enable")).getAttribute("disabled"); return disabled == null || "false".equalsIgnoreCase(disabled); } public boolean canDisable(String pluginKey) { final String enabled = getPluginRow(pluginKey).findElement(By.className("pk-disable")).getAttribute("disabled"); return enabled == null || "false".equalsIgnoreCase(enabled); } private WebElement getPluginRow(String key) { for (WebElement row : pluginsTable.findElements(By.tagName("tr"))) { if (key.equals(row.getAttribute("data-pluginkey"))) { return row; } } return null; } public SpeakeasyUserPage waitForMessages() { messagesBar.waitForMessages(); return this; } public List<String> getSuccessMessages() { return messagesBar.getSuccessMessages(); } public DownloadDialog openDownloadDialog(String pluginKey) throws IOException { clickActionLink(pluginKey, ExtensionOperations.DOWNLOAD); return pageBinder.bind(DownloadDialog.class, pluginKey); } public InstallDialog openInstallDialog() throws IOException { driver.findElement(By.id("sp-install")).click(); return pageBinder.bind(InstallDialog.class); } public SpeakeasyUserPage uninstallPlugin(String pluginKey) { clickActionLink(pluginKey, ExtensionOperations.UNINSTALL); waitForMessages(); return this; } private void clickActionLink(String pluginKey, ExtensionOperations action) { WebElement pluginRow = getPluginRow(pluginKey); WebElement actionElement = getActionLink(action, pluginRow); actionElement.click(); } private WebElement getActionLink(ExtensionOperations action, WebElement pluginRow) { triggerOptionsDropdown(pluginRow); return pluginRow.findElement(By.className("pk-" + action.toString().toLowerCase())); } private void triggerOptionsDropdown(WebElement pluginRow) { pluginRow.findElement(By.className("aui-dd-trigger")).click(); } public boolean canExecute(String pluginKey, ExtensionOperations action) { WebElement pluginRow = getPluginRow(pluginKey); try { getActionLink(action, pluginRow); return true; } catch (NoSuchElementException ex) { return false; } finally { triggerOptionsDropdown(pluginRow); } } public List<String> getErrorMessages() { return messagesBar.getErrorMessages(); } public List<String> getWarningMessages() { return messagesBar.getWarningMessages(); } public IdeDialog openEditDialog(String pluginKey) { clickActionLink(pluginKey, ExtensionOperations.EDIT); return pageBinder.bind(IdeDialog.class, pluginKey, false); } public ForkDialog openForkDialog(String pluginKey) { clickActionLink(pluginKey, ExtensionOperations.FORK); return pageBinder.bind(ForkDialog.class, pluginKey); } public FeedbackDialog openFeedbackDialog(String pluginKey) { clickActionLink(pluginKey, ExtensionOperations.FEEDBACK); return pageBinder.bind(FeedbackDialog.class, pluginKey); } public FeedbackDialog reportBroken(String pluginKey) { WebElement pluginRow = getPluginRow(pluginKey); WebElement link = pluginRow.findElement(By.className("broken-icon")); link.click(); return pageBinder.bind(FeedbackDialog.class, pluginKey); } public CommonJsModulesTab viewCommonJsModulesTab() { jsdocTab.click(); return pageBinder.bind(CommonJsModulesTab.class); } public boolean canCreateExtension() { return driver.elementExists(By.id("sp-install")); } public SpeakeasyUserPage unsubscribeFromAllPlugins() { driver.findElement(By.id("unsubscribe-all")).click(); driver.waitUntilElementIsLocated(By.className("success")); return pageBinder.navigateToAndBind(SpeakeasyUserPage.class); } public SpeakeasyUserPage restoreEnabledPlugins() { driver.findElement(By.id("restore-enabled")).click(); driver.waitUntilElementIsLocated(By.className("success")); return pageBinder.navigateToAndBind(SpeakeasyUserPage.class); } public IdeDialog openViewSourceDialog(String pluginKey) { clickActionLink(pluginKey, ExtensionOperations.VIEWSOURCE); return pageBinder.bind(IdeDialog.class, pluginKey, true); } public SpeakeasyUserPage favorite(String pluginKey) { WebElement pluginRow = getPluginRow(pluginKey); WebElement link = pluginRow.findElement(By.className("unfavorite-icon")); link.click(); waitForMessages(); return this; } public SpeakeasyUserPage unfavorite(String pluginKey) { WebElement pluginRow = getPluginRow(pluginKey); WebElement link = pluginRow.findElement(By.className("favorite-icon")); link.click(); waitForMessages(); return this; } public boolean isFavorite(String pluginKey) { WebElement pluginRow = getPluginRow(pluginKey); return driver.elementIsVisible(By.className("favorite-icon")); } public ApplinksTab viewApplinksTab() { applinksTab.click(); return pageBinder.bind(ApplinksTab.class); } public ConfirmDialog enablePluginForEveryone(String pluginKey) { clickActionLink(pluginKey, ExtensionOperations.ENABLEGLOBALLY); return pageBinder.bind(ConfirmDialog.class); } public ConfirmDialog disablePluginForEveryone(String pluginKey) { clickActionLink(pluginKey, ExtensionOperations.DISABLEGLOBALLY); return pageBinder.bind(ConfirmDialog.class); } public static class PluginRow { private String key; private String name; private String author; private int users; private String description; private String version; private int favorites; public String getKey() { return key; } public void setKey(String key) { this.key = key; } public int getUsers() { return users; } public void setUsers(int users) { this.users = users; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getVersion() { return version; } public void setVersion(String version) { this.version = version; } public void setFavorites(int marks) { this.favorites = marks; } public int getFavorites() { return favorites; } } }