@Test
  public void testBasicConventionPlugin() throws IOException, URISyntaxException {
    File jar =
        new PluginJarBuilder("ConventionZip")
            .addFormattedResource(
                "atlassian-extension.json",
                "{'key'         : 'test-convention',",
                " 'version'      : '1'",
                "}")
            .addResource("js/", "")
            .addResource("js/test/", "")
            .addFile(
                "js/test/foo.js", new File(getClass().getResource("/archetype/main.js").toURI()))
            .addResource("css/", "")
            .addFile(
                "css/test-convention.css",
                new File(getClass().getResource("/archetype/main.css").toURI()))
            .addResource("images/", "")
            .addFile(
                "images/projectavatar.png",
                new File(getClass().getResource("/archetype/projectavatar.png").toURI()))
            .addResource("ui/", "")
            .addFile(
                "ui/web-items.json",
                new File(getClass().getResource("/archetype/web-items.json").toURI()))
            .buildWithNoManifest();
    File zip = new File(jar.getPath() + ".zip");
    FileUtils.moveFile(jar, zip);

    product
        .visit(SpeakeasyUserPage.class)
        .openInstallDialog()
        .uploadPlugin(zip)
        .enablePlugin("test-convention");

    SpeakeasyUserPage page = product.visit(SpeakeasyUserPage.class);
    ExampleBanner banner = product.getPageBinder().bind(ExampleBanner.class);
    assertTrue(banner.isFooVisible());
    assertTrue(banner.isFooImageLoaded());
    assertEquals("Yahoo", banner.getYahooLinkText());
    assertFalse(banner.isBarVisible());
    assertTrue(banner.isBarImageLoaded());

    assertEquals(
        asList(
            "css/test-convention.css",
            "images/projectavatar.png",
            "js/test/foo.js",
            "ui/web-items.json",
            "atlassian-extension.json"),
        page.openEditDialog("test-convention").getFileNames());

    page.uninstallPlugin("test-convention");
  }
 @Test
 public void testEditAndBreakWithJavascriptSyntaxErrorThenFixPlugin() throws IOException {
   SpeakeasyUserPage page =
       product
           .visit(SpeakeasyUserPage.class)
           .openInstallDialog()
           .openCreateExtensionDialog()
           .key("breakjs")
           .name("Breaking JS")
           .description("All Good")
           .create()
           .openEditDialog("breakjs")
           .editAndSaveFile(
               "js/breakjs/main.js", "require(';", "Error parsing module 'breakjs/main' on line")
           .editAndSaveFile("js/breakjs/main.js", "var foo;")
           .done();
   assertTrue(page.getPlugins().get("breakjs").getDescription().contains("All Good"));
   page.uninstallPlugin("breakjs");
 }
 @Before
 public void login() {
   product.visit(LoginPage.class).loginAsSysAdmin(HomePage.class);
 }