PageRenderTime 59ms CodeModel.GetById 29ms RepoModel.GetById 0ms app.codeStats 0ms

/src/test/java/it/com/atlassian/labs/speakeasy/TestUserProfile.java

https://github.com/Rosencrantz/speakeasy-plugin
Java | 544 lines | 453 code | 88 blank | 3 comment | 4 complexity | 549f30750523efb2e350a5413f3fd072 MD5 | raw file
  1. package it.com.atlassian.labs.speakeasy;
  2. import com.atlassian.pageobjects.TestedProduct;
  3. import com.atlassian.pageobjects.page.HomePage;
  4. import com.atlassian.pageobjects.page.LoginPage;
  5. import com.atlassian.plugin.test.PluginJarBuilder;
  6. import com.atlassian.plugin.util.zip.FileUnzipper;
  7. import com.atlassian.webdriver.pageobjects.WebDriverTester;
  8. import com.dumbster.smtp.SimpleSmtpServer;
  9. import com.dumbster.smtp.SmtpMessage;
  10. import com.google.common.collect.Sets;
  11. import it.com.atlassian.labs.speakeasy.util.TempHelp;
  12. import org.apache.commons.io.FileUtils;
  13. import org.junit.After;
  14. import org.junit.Before;
  15. import org.junit.Test;
  16. import org.slf4j.Logger;
  17. import org.slf4j.LoggerFactory;
  18. import javax.mail.MessagingException;
  19. import java.io.File;
  20. import java.io.IOException;
  21. import java.util.*;
  22. import java.util.zip.ZipEntry;
  23. import java.util.zip.ZipFile;
  24. import static com.google.common.collect.Lists.newArrayList;
  25. import static com.google.common.collect.Sets.newHashSet;
  26. import static it.com.atlassian.labs.speakeasy.ExtensionBuilder.buildSimplePluginFile;
  27. import static it.com.atlassian.labs.speakeasy.ExtensionBuilder.startSimpleBuilder;
  28. import static java.util.Arrays.asList;
  29. import static org.junit.Assert.*;
  30. public class TestUserProfile
  31. {
  32. private static TestedProduct<?> product = OwnerOfTestedProduct.INSTANCE;
  33. private SimpleSmtpServer mailServer;
  34. private static Logger log = LoggerFactory.getLogger(TestUserProfile.class);
  35. @Before
  36. public void login()
  37. {
  38. product.visit(LoginPage.class).loginAsSysAdmin(HomePage.class);
  39. }
  40. @After
  41. public void logout()
  42. {
  43. ((WebDriverTester)product.getTester()).getDriver().manage().deleteAllCookies();
  44. }
  45. @Before
  46. public void startMailServer()
  47. {
  48. mailServer = SimpleSmtpServer.start(2525);
  49. }
  50. @After
  51. public void stopMailServer()
  52. {
  53. mailServer.stop();
  54. }
  55. @Test
  56. public void testPluginList()
  57. {
  58. List<String> pluginKeys = product.visit(SpeakeasyUserPage.class)
  59. .getPluginKeys();
  60. assertTrue(pluginKeys.size() > 0);
  61. assertTrue(pluginKeys.contains("plugin-tests"));
  62. }
  63. @Test
  64. public void testEditPlugin() throws IOException
  65. {
  66. SpeakeasyUserPage page = product.visit(SpeakeasyUserPage.class)
  67. .uploadPlugin(startSimpleBuilder("edit", "Edit").addFormattedResource("foo-min.js", "var bar;").build());
  68. IdeDialog ide = page.openEditDialog("edit");
  69. assertEquals(asList("bar/baz.js", "modules/test.js", "atlassian-plugin.xml", "foo.js"), ide.getFileNames());
  70. ide = ide.editAndSaveFile("foo.js", "var foo;")
  71. .done()
  72. .openEditDialog("edit");
  73. String contents = ide.getFileContents("foo.js");
  74. assertEquals("var foo;", contents);
  75. page = ide.done();
  76. assertFalse(getZipEntries(page.openDownloadDialog("edit").downloadAsExtension()).contains("foo-min.js"));
  77. page.uninstallPlugin("edit");
  78. }
  79. @Test
  80. public void testEditAndBreakWithMissingModuleThenFixPlugin() throws IOException
  81. {
  82. product.visit(SpeakeasyUserPage.class)
  83. .uploadPlugin(buildSimplePluginFile());
  84. IdeDialog ide = product.visit(SpeakeasyUserPage.class)
  85. .uploadPlugin(buildSimplePluginFile())
  86. .openEditDialog("test-2")
  87. .editAndSaveFile("modules/test.js", "require('nonexistent/module');", "nonexistent/module");
  88. assertTrue(ide.getStatus().contains("nonexistent/module"));
  89. SpeakeasyUserPage page = ide.done();
  90. assertTrue(page.getPlugins().get("test-2").getDescription().contains("nonexistent/module"));
  91. page = page
  92. .openEditDialog("test-2")
  93. .editAndSaveFile("modules/test.js", "require('speakeasy/jquery');")
  94. .done();
  95. assertEquals("Desc", page.getPlugins().get("test-2").getDescription());
  96. page.uninstallPlugin("test-2");
  97. }
  98. @Test
  99. public void testDownloadPluginJarAsAmpsProject() throws IOException
  100. {
  101. final SpeakeasyUserPage page = product.visit(SpeakeasyUserPage.class).uploadPlugin(buildSimplePluginFile("download.jar-project", "Download Jar"));
  102. File file = page
  103. .openDownloadDialog("download.jar-project")
  104. .downloadAsAmpsProject();
  105. assertNotNull(file);
  106. File unzippedPluginDir = TempHelp.getTempDir("download.jar-project-amps-unzip");
  107. FileUnzipper unzipper = new FileUnzipper(file, unzippedPluginDir);
  108. Set<String> entries = new HashSet<String>();
  109. for (ZipEntry entry : unzipper.entries())
  110. {
  111. entries.add(entry.getName());
  112. }
  113. unzipper.unzip();
  114. assertEquals(Sets.newHashSet(
  115. "pom.xml",
  116. "src/",
  117. "src/main/",
  118. "src/main/resources/",
  119. "src/main/resources/atlassian-plugin.xml",
  120. "src/main/resources/foo.js",
  121. "src/main/resources/bar/",
  122. "src/main/resources/bar/baz.js",
  123. "src/main/resources/modules/",
  124. "src/main/resources/modules/test.js"
  125. ), entries);
  126. File fooFile = new File(unzippedPluginDir, "src/main/resources/foo.js");
  127. assertEquals("alert(\"hi\");", FileUtils.readFileToString(fooFile).trim());
  128. String pomContents = FileUtils.readFileToString(new File(unzippedPluginDir, "pom.xml"));
  129. assertFalse(pomContents.contains("${"));
  130. assertTrue(pomContents.contains("plugin.key>download.jar-project</plugin.key"));
  131. page.uninstallPlugin("download.jar-project");
  132. }
  133. @Test
  134. public void testDownloadPluginJarAsExtension() throws IOException
  135. {
  136. final SpeakeasyUserPage page = product.
  137. visit(SpeakeasyUserPage.class).
  138. uploadPlugin(buildSimplePluginFile("download.jar-file", "Jar File"));
  139. File file = page
  140. .openDownloadDialog("download.jar-file")
  141. .downloadAsExtension();
  142. assertNotNull(file);
  143. assertTrue(file.getName().endsWith(".jar"));
  144. File unzippedPluginDir = TempHelp.getTempDir("download.jar-file-extension-unzip");
  145. FileUnzipper unzipper = new FileUnzipper(file, unzippedPluginDir);
  146. Set<String> entries = new HashSet<String>();
  147. for (ZipEntry entry : unzipper.entries())
  148. {
  149. entries.add(entry.getName());
  150. }
  151. unzipper.unzip();
  152. assertEquals(Sets.newHashSet(
  153. "atlassian-plugin.xml",
  154. "foo.js",
  155. "bar/",
  156. "bar/baz.js",
  157. "modules/",
  158. "modules/test.js"
  159. ), entries);
  160. File fooFile = new File(unzippedPluginDir, "foo.js");
  161. assertEquals("alert(\"hi\");", FileUtils.readFileToString(fooFile).trim());
  162. page.uninstallPlugin("download.jar-file");
  163. }
  164. @Test
  165. public void testEnableTestPlugin() throws IOException
  166. {
  167. SpeakeasyUserPage page = product.visit(SpeakeasyUserPage.class);
  168. assertEquals(0, page.getPlugins().get("plugin-tests").getUsers());
  169. PluginTestActivated activated = product.getPageBinder().bind(PluginTestActivated.class);
  170. assertFalse(activated.isBannerVisible());
  171. assertTrue(activated.isUploadFormVisible());
  172. assertFalse(activated.isGoogleLinkVisible());
  173. page.enablePlugin("plugin-tests");
  174. assertEquals(1, page.getPlugins().get("plugin-tests").getUsers());
  175. page = product.visit(SpeakeasyUserPage.class);
  176. assertEquals(1, page.getPlugins().get("plugin-tests").getUsers());
  177. activated.waitForBanner();
  178. assertTrue(activated.isBannerVisible());
  179. assertFalse(activated.isUploadFormVisible());
  180. assertTrue(activated.isGoogleLinkVisible());
  181. page.disablePlugin("plugin-tests");
  182. assertEquals(0, page.getPlugins().get("plugin-tests").getUsers());
  183. product.visit(SpeakeasyUserPage.class);
  184. assertEquals(0, page.getPlugins().get("plugin-tests").getUsers());
  185. activated = product.getPageBinder().bind(PluginTestActivated.class);
  186. assertFalse(activated.isBannerVisible());
  187. assertTrue(activated.isUploadFormVisible());
  188. assertFalse(activated.isGoogleLinkVisible());
  189. }
  190. @Test
  191. public void testInstallPlugin() throws IOException
  192. {
  193. File jar = buildSimplePluginFile();
  194. SpeakeasyUserPage page = product.visit(SpeakeasyUserPage.class)
  195. .uploadPlugin(jar);
  196. List<String> messages = page.getSuccessMessages();
  197. assertEquals(1, messages.size());
  198. assertTrue(messages.get(0).contains("Test Plugin"));
  199. assertTrue(page.getPluginKeys().contains("test-2"));
  200. SpeakeasyUserPage.PluginRow row = page.getPlugins().get("test-2");
  201. assertNotNull(row);
  202. assertEquals("test-2", row.getKey());
  203. assertEquals("Test Plugin", row.getName());
  204. assertEquals("Desc", row.getDescription());
  205. assertEquals("A. D. Ministrator (Sysadmin)", row.getAuthor());
  206. assertTrue(page.canExecute("test-2", ExtensionOperations.UNINSTALL));
  207. assertTrue(page.canExecute("test-2", ExtensionOperations.EDIT));
  208. assertTrue(page.canExecute("test-2", ExtensionOperations.DOWNLOAD));
  209. assertFalse(page.canExecute("test-2", ExtensionOperations.FORK));
  210. // verify on reload
  211. page = product.visit(SpeakeasyUserPage.class);
  212. assertTrue(page.getPluginKeys().contains("test-2"));
  213. row = page.getPlugins().get("test-2");
  214. assertNotNull(row);
  215. assertEquals("test-2", row.getKey());
  216. assertEquals("Test Plugin", row.getName());
  217. assertEquals("Desc", row.getDescription());
  218. assertEquals("A. D. Ministrator (Sysadmin)", row.getAuthor());
  219. page.uninstallPlugin("test-2");
  220. }
  221. @Test
  222. public void testEmailAuthorOnEnable() throws IOException, MessagingException
  223. {
  224. File jar = buildSimplePluginFile();
  225. product.visit(SpeakeasyUserPage.class)
  226. .uploadPlugin(jar);
  227. logout();
  228. SpeakeasyUserPage page = product.visit(LoginPage.class)
  229. .login("barney", "barney", SpeakeasyUserPage.class)
  230. .enablePlugin("test-2");
  231. assertEmailExists("admin@example.com", "Barney User has enabled your Speakeasy extension!", asList(
  232. "you may want to try",
  233. "Test Plugin"
  234. ));
  235. page.disablePlugin("test-2");
  236. logout();
  237. product.visit(LoginPage.class)
  238. .loginAsSysAdmin(SpeakeasyUserPage.class)
  239. .enablePlugin("test-2");
  240. logout();
  241. page = product.visit(LoginPage.class)
  242. .login("barney", "barney", SpeakeasyUserPage.class)
  243. .enablePlugin("test-2");
  244. assertEmailExists("admin@example.com", "Barney User has enabled your Speakeasy extension!", asList(
  245. "extensions in common",
  246. "Test Plugin"
  247. ));
  248. page.disablePlugin("test-2");
  249. logout();
  250. product.visit(LoginPage.class)
  251. .loginAsSysAdmin(SpeakeasyUserPage.class)
  252. .disablePlugin("test-2");
  253. }
  254. @Test
  255. public void testForkPlugin() throws IOException, MessagingException
  256. {
  257. File jar = buildSimplePluginFile("test", "First Plugin");
  258. File jar2 = buildSimplePluginFile("test-2", "Second Plugin");
  259. product.visit(SpeakeasyUserPage.class)
  260. .uploadPlugin(jar)
  261. .uploadPlugin(jar2);
  262. logout();
  263. SpeakeasyUserPage page = product.visit(LoginPage.class)
  264. .login("barney", "barney", SpeakeasyUserPage.class)
  265. .openForkDialog("test")
  266. .setDescription("Fork Description")
  267. .fork()
  268. .enablePlugin("test-2")
  269. .openForkDialog("test-2")
  270. .setDescription("Fork Description")
  271. .fork();
  272. List<String> messages = page.getSuccessMessages();
  273. assertEquals(1, messages.size());
  274. assertTrue(messages.get(0).contains("was forked successfully"));
  275. assertTrue(page.getPluginKeys().contains("test-2-fork-barney"));
  276. assertEmailExists("admin@example.com", "Barney User has forked your Speakeasy extension!", asList(
  277. "'Second Plugin'",
  278. "First Plugin by A. D. Ministrator (Sysadmin)"
  279. ));
  280. assertFalse(page.canExecute("test", ExtensionOperations.FORK));
  281. assertFalse(page.canExecute("test-2", ExtensionOperations.FORK));
  282. SpeakeasyUserPage.PluginRow row = page.getPlugins().get("test-2-fork-barney");
  283. assertEquals("test-2-fork-barney", row.getKey());
  284. assertEquals("Fork Description", row.getDescription());
  285. assertFalse(page.isPluginEnabled("test-2"));
  286. assertTrue(page.isPluginEnabled("test-2-fork-barney"));
  287. assertTrue(page.canExecute("test-2-fork-barney", ExtensionOperations.UNINSTALL));
  288. assertTrue(!page.canExecute("test-2-fork-barney", ExtensionOperations.FORK));
  289. assertTrue(page.canExecute("test-2-fork-barney", ExtensionOperations.DOWNLOAD));
  290. assertTrue(page.canExecute("test-2-fork-barney", ExtensionOperations.EDIT));
  291. assertTrue(!page.canExecute("test-2", ExtensionOperations.UNINSTALL));
  292. page.enablePlugin("test-2");
  293. assertFalse(page.isPluginEnabled("test-2-fork-barney"));
  294. page.enablePlugin("test-2-fork-barney");
  295. assertFalse(page.isPluginEnabled("test-2"));
  296. // verify on reload
  297. page = product.visit(SpeakeasyUserPage.class);
  298. assertTrue(page.getPluginKeys().contains("test-2-fork-barney"));
  299. row = page.getPlugins().get("test-2-fork-barney");
  300. assertEquals("test-2-fork-barney", row.getKey());
  301. assertEquals("Fork Description", row.getDescription());
  302. page.uninstallPlugin("test-2-fork-barney");
  303. assertTrue(page.isPluginEnabled("test-2"));
  304. assertTrue(product.visit(SpeakeasyUserPage.class).isPluginEnabled("test-2"));
  305. page.uninstallPlugin("test-fork-barney");
  306. logout();
  307. product.visit(LoginPage.class)
  308. .loginAsSysAdmin(SpeakeasyUserPage.class)
  309. .uninstallPlugin("test-2")
  310. .uninstallPlugin("test");
  311. }
  312. @Test
  313. public void testForkZipPlugin() throws IOException, MessagingException
  314. {
  315. product.visit(SpeakeasyUserPage.class)
  316. .openCreateExtensionDialog()
  317. .key("tofork-zip")
  318. .description("Description")
  319. .name("Fork Zip")
  320. .create();
  321. logout();
  322. SpeakeasyUserPage page = product.visit(LoginPage.class)
  323. .login("barney", "barney", SpeakeasyUserPage.class)
  324. .openForkDialog("tofork-zip")
  325. .setDescription("Fork Description")
  326. .fork();
  327. List<String> messages = page.getSuccessMessages();
  328. assertEquals(1, messages.size());
  329. assertTrue(messages.get(0).contains("was forked successfully"));
  330. assertTrue(page.getPluginKeys().contains("tofork-zip-fork-barney"));
  331. page.uninstallPlugin("tofork-zip-fork-barney");
  332. logout();
  333. product.visit(LoginPage.class)
  334. .loginAsSysAdmin(SpeakeasyUserPage.class)
  335. .uninstallPlugin("tofork-zip");
  336. }
  337. @Test
  338. public void testUnsubscribeFromAllPlugins() throws IOException
  339. {
  340. File jar = buildSimplePluginFile();
  341. SpeakeasyUserPage page = product.visit(SpeakeasyUserPage.class)
  342. .uploadPlugin(jar)
  343. .enablePlugin("test-2")
  344. .enablePlugin("plugin-tests");
  345. assertTrue(page.isPluginEnabled("test-2"));
  346. assertTrue(page.isPluginEnabled("plugin-tests"));
  347. page = page.unsubscribeFromAllPlugins();
  348. assertFalse(page.isPluginEnabled("test-2"));
  349. assertFalse(page.isPluginEnabled("plugin-tests"));
  350. page.uninstallPlugin("test-2");
  351. }
  352. @Test
  353. public void testCannotInstallOtherUsersPlugin() throws IOException
  354. {
  355. File jar = new PluginJarBuilder()
  356. .addFormattedResource("atlassian-plugin.xml",
  357. "<atlassian-plugin key='plugin-tests' pluginsVersion='2' name='Plugin Tests'>",
  358. " <plugin-info>",
  359. " <version>2</version>",
  360. " </plugin-info>",
  361. " <scoped-web-item key='item' section='foo' />",
  362. "</atlassian-plugin>")
  363. .build();
  364. SpeakeasyUserPage page = product.visit(SpeakeasyUserPage.class)
  365. .uploadPluginExpectingFailure(jar);
  366. List<String> messages = page.getErrorMessages();
  367. assertEquals(1, messages.size());
  368. assertTrue(messages.get(0).contains("'plugin-tests'"));
  369. SpeakeasyUserPage.PluginRow row = page.getPlugins().get("plugin-tests");
  370. assertEquals("1", row.getVersion());
  371. assertEquals("Some Guy", row.getAuthor());
  372. }
  373. @Test
  374. public void testInstallPluginMissingModules() throws IOException
  375. {
  376. File jar = new PluginJarBuilder("Missing-Module")
  377. .addFormattedResource("atlassian-plugin.xml",
  378. "<atlassian-plugin key='unresolved-test' pluginsVersion='2' name='Missing Module Test'>",
  379. " <plugin-info>",
  380. " <version>2</version>",
  381. " </plugin-info>",
  382. " <scoped-modules key='item' />",
  383. " <scoped-web-resource key='another-item' />",
  384. "</atlassian-plugin>")
  385. .addFormattedResource("modules/foo.js", "require('speakeasy/user/user');")
  386. .build();
  387. SpeakeasyUserPage page = product.visit(SpeakeasyUserPage.class)
  388. .uploadPluginExpectingFailure(jar);
  389. List<String> messages = page.getErrorMessages();
  390. assertEquals(1, messages.size());
  391. assertTrue(messages.get(0).contains("speakeasy/user/user"));
  392. SpeakeasyUserPage.PluginRow row = page.getPlugins().get("unresolved-test");
  393. assertTrue(row.getDescription().contains("speakeasy/user/user"));
  394. page.uninstallPlugin("unresolved-test");
  395. }
  396. @Test
  397. public void testUninstallPlugin() throws IOException
  398. {
  399. File jar = buildSimplePluginFile();
  400. product.visit(SpeakeasyUserPage.class)
  401. .uploadPlugin(jar);
  402. SpeakeasyUserPage page = product.visit(SpeakeasyUserPage.class);
  403. assertTrue(page.getPluginKeys().contains("test-2"));
  404. assertTrue(page.canExecute("test-2", ExtensionOperations.UNINSTALL));
  405. page.uninstallPlugin("test-2");
  406. List<String> messages = page.getSuccessMessages();
  407. assertEquals(1, messages.size());
  408. assertTrue(messages.get(0).contains("uninstalled"));
  409. assertFalse(page.getPluginKeys().contains("test-2"));
  410. // verify on reload
  411. page = product.visit(SpeakeasyUserPage.class);
  412. assertFalse(page.getPluginKeys().contains("test-2"));
  413. }
  414. @Test
  415. public void testActionsIfNotAuthorAndNotPureSpeakeasy() throws IOException
  416. {
  417. SpeakeasyUserPage page = product.visit(SpeakeasyUserPage.class);
  418. assertTrue(page.getPluginKeys().contains("plugin-tests"));
  419. assertFalse(page.canExecute("plugin-tests", ExtensionOperations.UNINSTALL));
  420. assertFalse(page.canExecute("plugin-tests", ExtensionOperations.DOWNLOAD));
  421. assertFalse(page.canExecute("plugin-tests", ExtensionOperations.FORK));
  422. }
  423. private void assertEmailExists(String to, String title, List<String> bodyStrings) throws MessagingException, IOException
  424. {
  425. SmtpMessage lastMessage = null;
  426. assertTrue(mailServer.getReceivedEmailSize() > 0);
  427. Iterator itr = mailServer.getReceivedEmail();
  428. while(itr.hasNext())
  429. {
  430. lastMessage = (SmtpMessage) itr.next();
  431. }
  432. assertNotNull(lastMessage);
  433. log.error("msg: " + lastMessage.toString());
  434. String subject = lastMessage.getHeaderValue("Subject");
  435. assertEquals("[test] " + title, subject);
  436. assertFalse(subject.contains("$"));
  437. String body = lastMessage.getBody();
  438. assertFalse(body.contains("$"));
  439. for (String toMatch : bodyStrings)
  440. {
  441. assertTrue(body.contains(toMatch));
  442. }
  443. assertTrue(lastMessage.getHeaderValue("To").contains(to));
  444. }
  445. private Set<String> getZipEntries(File artifact) throws IOException
  446. {
  447. Set<String> entries = newHashSet();
  448. ZipFile file = new ZipFile(artifact);
  449. for (Enumeration<? extends ZipEntry> e = file.entries(); e.hasMoreElements(); )
  450. {
  451. entries.add(e.nextElement().getName());
  452. }
  453. file.close();
  454. return entries;
  455. }
  456. }