PageRenderTime 47ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/plugin/src/test/java/it/com/atlassian/labs/speakeasy/SpeakeasyUserPage.java

https://github.com/mrdon/speakeasy-plugin
Java | 414 lines | 342 code | 69 blank | 3 comment | 10 complexity | 5c3d899ea0f7c88e3b5ab36cbb3bc040 MD5 | raw file
  1. package it.com.atlassian.labs.speakeasy;
  2. import com.atlassian.pageobjects.Page;
  3. import com.atlassian.pageobjects.PageBinder;
  4. import com.atlassian.pageobjects.ProductInstance;
  5. import com.atlassian.pageobjects.TestedProduct;
  6. import com.atlassian.pageobjects.binder.Init;
  7. import com.atlassian.pageobjects.binder.WaitUntil;
  8. import com.atlassian.webdriver.AtlassianWebDriver;
  9. import com.google.common.base.Function;
  10. import it.com.atlassian.labs.speakeasy.proxy.ApplinksTab;
  11. import org.openqa.selenium.By;
  12. import org.openqa.selenium.NoSuchElementException;
  13. import org.openqa.selenium.WebElement;
  14. import org.openqa.selenium.support.FindBy;
  15. import javax.inject.Inject;
  16. import java.io.IOException;
  17. import java.util.*;
  18. import static it.com.atlassian.labs.speakeasy.ProductUtils.flushMailQueue;
  19. import static java.lang.Integer.parseInt;
  20. /**
  21. *
  22. */
  23. public class SpeakeasyUserPage implements Page
  24. {
  25. @Inject
  26. protected AtlassianWebDriver driver;
  27. @Inject
  28. ProductInstance productInstance;
  29. @Inject
  30. PageBinder pageBinder;
  31. MessagesBar messagesBar;
  32. @FindBy(id = "plugins-table")
  33. private WebElement pluginsTable;
  34. @FindBy(id = "jsdoc-tab")
  35. private WebElement jsdocTab;
  36. @FindBy(id = "applinks-tab")
  37. private WebElement applinksTab;
  38. @Inject
  39. private TestedProduct testedProduct;
  40. @Init
  41. public void init()
  42. {
  43. messagesBar = pageBinder.bind(MessagesBar.class);
  44. }
  45. @WaitUntil
  46. public void waitForSpeakeasyInit()
  47. {
  48. driver.waitUntilElementIsLocated(By.id("speakeasy-loaded"));
  49. final WebElement loaded = driver.findElement(By.id("speakeasy-loaded"));
  50. driver.waitUntil(new Function()
  51. {
  52. public Object apply(Object from)
  53. {
  54. return "".equals(loaded.getText());
  55. }
  56. });
  57. }
  58. public List<String> getPluginKeys()
  59. {
  60. List<String> pluginKeys = new ArrayList<String>();
  61. for (WebElement e : pluginsTable.findElements(By.tagName("tr")))
  62. {
  63. pluginKeys.add(e.getAttribute("data-pluginkey"));
  64. }
  65. return pluginKeys;
  66. }
  67. public Map<String, PluginRow> getPlugins()
  68. {
  69. Map<String,PluginRow> plugins = new LinkedHashMap<String,PluginRow>();
  70. for (WebElement e : pluginsTable.findElements(By.tagName("tr")))
  71. {
  72. PluginRow row = new PluginRow();
  73. final String key = e.getAttribute("data-pluginkey");
  74. if (key != null)
  75. {
  76. row.setKey(key);
  77. row.setName(e.findElement(By.className("plugin-name")).getText());
  78. row.setDescription(e.findElement(By.className("plugin-description")).getText());
  79. row.setAuthor(e.findElement(By.className("plugin-author")).getText());
  80. row.setUsers(parseInt(e.findElement(By.className("plugin-users")).getText()));
  81. row.setFavorites(parseInt(e.findElement(By.className("plugin-favorites")).getText()));
  82. row.setVersion(e.findElement(By.className("plugin-version")).getText());
  83. plugins.put(key,row);
  84. }
  85. }
  86. return plugins;
  87. }
  88. public String getUrl()
  89. {
  90. return "/plugins/servlet/speakeasy/user";
  91. }
  92. public SpeakeasyUserPage enablePlugin(String pluginKey) throws IOException
  93. {
  94. getPluginRow(pluginKey).findElement(By.className("pk-enable")).click();
  95. waitForMessages();
  96. flushMailQueue(productInstance);
  97. return this;
  98. }
  99. public SpeakeasyUserPage disablePlugin(String pluginKey)
  100. {
  101. getPluginRow(pluginKey).findElement(By.className("pk-disable")).click();
  102. waitForMessages();
  103. return this;
  104. }
  105. public boolean isPluginEnabled(String pluginKey)
  106. {
  107. return "true".equalsIgnoreCase(getPluginRow(pluginKey).getAttribute("data-enabled"));
  108. }
  109. public boolean canEnable(String pluginKey)
  110. {
  111. final String disabled = getPluginRow(pluginKey).findElement(By.className("pk-enable")).getAttribute("disabled");
  112. return disabled == null || "false".equalsIgnoreCase(disabled);
  113. }
  114. public boolean canDisable(String pluginKey)
  115. {
  116. final String enabled = getPluginRow(pluginKey).findElement(By.className("pk-disable")).getAttribute("disabled");
  117. return enabled == null || "false".equalsIgnoreCase(enabled);
  118. }
  119. private WebElement getPluginRow(String key)
  120. {
  121. for (WebElement row : pluginsTable.findElements(By.tagName("tr")))
  122. {
  123. if (key.equals(row.getAttribute("data-pluginkey")))
  124. {
  125. return row;
  126. }
  127. }
  128. return null;
  129. }
  130. public SpeakeasyUserPage waitForMessages()
  131. {
  132. messagesBar.waitForMessages();
  133. return this;
  134. }
  135. public List<String> getSuccessMessages()
  136. {
  137. return messagesBar.getSuccessMessages();
  138. }
  139. public DownloadDialog openDownloadDialog(String pluginKey) throws IOException
  140. {
  141. clickActionLink(pluginKey, ExtensionOperations.DOWNLOAD);
  142. return pageBinder.bind(DownloadDialog.class, pluginKey);
  143. }
  144. public InstallDialog openInstallDialog() throws IOException
  145. {
  146. driver.findElement(By.id("sp-install")).click();
  147. return pageBinder.bind(InstallDialog.class);
  148. }
  149. public SpeakeasyUserPage uninstallPlugin(String pluginKey)
  150. {
  151. clickActionLink(pluginKey, ExtensionOperations.UNINSTALL);
  152. waitForMessages();
  153. return this;
  154. }
  155. private void clickActionLink(String pluginKey, ExtensionOperations action)
  156. {
  157. WebElement pluginRow = getPluginRow(pluginKey);
  158. WebElement actionElement = getActionLink(action, pluginRow);
  159. actionElement.click();
  160. }
  161. private WebElement getActionLink(ExtensionOperations action, WebElement pluginRow)
  162. {
  163. triggerOptionsDropdown(pluginRow);
  164. return pluginRow.findElement(By.className("pk-" + action.toString().toLowerCase()));
  165. }
  166. private void triggerOptionsDropdown(WebElement pluginRow)
  167. {
  168. pluginRow.findElement(By.className("aui-dd-trigger")).click();
  169. }
  170. public boolean canExecute(String pluginKey, ExtensionOperations action)
  171. {
  172. WebElement pluginRow = getPluginRow(pluginKey);
  173. try
  174. {
  175. getActionLink(action, pluginRow);
  176. return true;
  177. }
  178. catch (NoSuchElementException ex)
  179. {
  180. return false;
  181. }
  182. finally
  183. {
  184. triggerOptionsDropdown(pluginRow);
  185. }
  186. }
  187. public List<String> getErrorMessages()
  188. {
  189. return messagesBar.getErrorMessages();
  190. }
  191. public List<String> getWarningMessages()
  192. {
  193. return messagesBar.getWarningMessages();
  194. }
  195. public IdeDialog openEditDialog(String pluginKey)
  196. {
  197. clickActionLink(pluginKey, ExtensionOperations.EDIT);
  198. return pageBinder.bind(IdeDialog.class, pluginKey, false);
  199. }
  200. public ForkDialog openForkDialog(String pluginKey)
  201. {
  202. clickActionLink(pluginKey, ExtensionOperations.FORK);
  203. return pageBinder.bind(ForkDialog.class, pluginKey);
  204. }
  205. public FeedbackDialog openFeedbackDialog(String pluginKey)
  206. {
  207. clickActionLink(pluginKey, ExtensionOperations.FEEDBACK);
  208. return pageBinder.bind(FeedbackDialog.class, pluginKey);
  209. }
  210. public FeedbackDialog reportBroken(String pluginKey)
  211. {
  212. WebElement pluginRow = getPluginRow(pluginKey);
  213. WebElement link = pluginRow.findElement(By.className("broken-icon"));
  214. link.click();
  215. return pageBinder.bind(FeedbackDialog.class, pluginKey);
  216. }
  217. public CommonJsModulesTab viewCommonJsModulesTab()
  218. {
  219. jsdocTab.click();
  220. return pageBinder.bind(CommonJsModulesTab.class);
  221. }
  222. public boolean canCreateExtension()
  223. {
  224. return driver.elementExists(By.id("sp-install"));
  225. }
  226. public SpeakeasyUserPage unsubscribeFromAllPlugins()
  227. {
  228. driver.findElement(By.id("unsubscribe-all")).click();
  229. driver.waitUntilElementIsLocated(By.className("success"));
  230. return pageBinder.navigateToAndBind(SpeakeasyUserPage.class);
  231. }
  232. public SpeakeasyUserPage restoreEnabledPlugins()
  233. {
  234. driver.findElement(By.id("restore-enabled")).click();
  235. driver.waitUntilElementIsLocated(By.className("success"));
  236. return pageBinder.navigateToAndBind(SpeakeasyUserPage.class);
  237. }
  238. public IdeDialog openViewSourceDialog(String pluginKey)
  239. {
  240. clickActionLink(pluginKey, ExtensionOperations.VIEWSOURCE);
  241. return pageBinder.bind(IdeDialog.class, pluginKey, true);
  242. }
  243. public SpeakeasyUserPage favorite(String pluginKey)
  244. {
  245. WebElement pluginRow = getPluginRow(pluginKey);
  246. WebElement link = pluginRow.findElement(By.className("unfavorite-icon"));
  247. link.click();
  248. waitForMessages();
  249. return this;
  250. }
  251. public SpeakeasyUserPage unfavorite(String pluginKey)
  252. {
  253. WebElement pluginRow = getPluginRow(pluginKey);
  254. WebElement link = pluginRow.findElement(By.className("favorite-icon"));
  255. link.click();
  256. waitForMessages();
  257. return this;
  258. }
  259. public boolean isFavorite(String pluginKey)
  260. {
  261. WebElement pluginRow = getPluginRow(pluginKey);
  262. return driver.elementIsVisible(By.className("favorite-icon"));
  263. }
  264. public ApplinksTab viewApplinksTab()
  265. {
  266. applinksTab.click();
  267. return pageBinder.bind(ApplinksTab.class);
  268. }
  269. public ConfirmDialog enablePluginForEveryone(String pluginKey)
  270. {
  271. clickActionLink(pluginKey, ExtensionOperations.ENABLEGLOBALLY);
  272. return pageBinder.bind(ConfirmDialog.class);
  273. }
  274. public ConfirmDialog disablePluginForEveryone(String pluginKey)
  275. {
  276. clickActionLink(pluginKey, ExtensionOperations.DISABLEGLOBALLY);
  277. return pageBinder.bind(ConfirmDialog.class);
  278. }
  279. public static class PluginRow
  280. {
  281. private String key;
  282. private String name;
  283. private String author;
  284. private int users;
  285. private String description;
  286. private String version;
  287. private int favorites;
  288. public String getKey()
  289. {
  290. return key;
  291. }
  292. public void setKey(String key)
  293. {
  294. this.key = key;
  295. }
  296. public int getUsers()
  297. {
  298. return users;
  299. }
  300. public void setUsers(int users)
  301. {
  302. this.users = users;
  303. }
  304. public String getName()
  305. {
  306. return name;
  307. }
  308. public void setName(String name)
  309. {
  310. this.name = name;
  311. }
  312. public String getAuthor()
  313. {
  314. return author;
  315. }
  316. public void setAuthor(String author)
  317. {
  318. this.author = author;
  319. }
  320. public String getDescription()
  321. {
  322. return description;
  323. }
  324. public void setDescription(String description)
  325. {
  326. this.description = description;
  327. }
  328. public String getVersion()
  329. {
  330. return version;
  331. }
  332. public void setVersion(String version)
  333. {
  334. this.version = version;
  335. }
  336. public void setFavorites(int marks)
  337. {
  338. this.favorites = marks;
  339. }
  340. public int getFavorites()
  341. {
  342. return favorites;
  343. }
  344. }
  345. }