@Test
 public void testGetIssueLinkRendererModuleDescriptorSurvivesPluginThrowingExceptions()
     throws Exception {
   Assert.assertSame(
       defaultRenderer,
       RemoteIssueLinkUtils.getIssueLinkRendererModuleDescriptor(pluginAccessor, null));
   Assert.assertSame(
       goodDescriptorRenderer,
       RemoteIssueLinkUtils.getIssueLinkRendererModuleDescriptor(pluginAccessor, "application"));
 }
  @Test
  public void testGetHtmlSurvivesPluginThrowingExceptionFromGetFinalHtml() throws Exception {
    Mockito.when(goodDescriptorRenderer.getFinalHtml(link)).thenReturn("final html");
    Assert.assertEquals("final html", RemoteIssueLinkUtils.getFinalHtml(link, pluginAccessor));

    Mockito.when(goodDescriptorRenderer.getFinalHtml(Mockito.<RemoteIssueLink>any()))
        .thenThrow(new LinkageError("Misbehaving plugin exception - non-fatal error"));

    expectedException.expect(Exception.class);
    RemoteIssueLinkUtils.getFinalHtml(link, pluginAccessor);
  }
 @Test
 public void testConvertToIssueLinkContextsSurvivesPluginThrowingExceptionFromGetModule()
     throws Exception {
   Mockito.when(goodDescriptorRenderer.getModule())
       .thenThrow(new RuntimeException("Misbehaving plugin exception"));
   final Map<String, List<IssueLinkContext>> contexts =
       RemoteIssueLinkUtils.convertToIssueLinkContexts(
           ImmutableList.of(link), 1L, "", new MockI18nHelper(), pluginAccessor);
   Assert.assertEquals(Collections.<String, List<IssueLinkContext>>emptyMap(), contexts);
 }
 @Test
 public void
     testConvertToIssueLinkContextsSurvivesPluginThrowingExceptionFromRequiresAsyncLoading()
         throws Exception {
   Mockito.when(renderer.shouldDisplay(Mockito.<RemoteIssueLink>any())).thenReturn(true);
   Mockito.when(renderer.requiresAsyncLoading(Mockito.<RemoteIssueLink>any()))
       .thenThrow(new RuntimeException("Misbehaving plugin exception"));
   final Map<String, List<IssueLinkContext>> contexts =
       RemoteIssueLinkUtils.convertToIssueLinkContexts(
           ImmutableList.of(link), 1L, "", new MockI18nHelper(), pluginAccessor);
   Assert.assertEquals(Collections.<String, List<IssueLinkContext>>emptyMap(), contexts);
 }
  @Test
  public void testConvertToIssueLinkContexts() throws Exception {
    Mockito.when(renderer.shouldDisplay(Mockito.<RemoteIssueLink>any())).thenReturn(true);
    Mockito.when(renderer.requiresAsyncLoading(link)).thenReturn(true);
    Mockito.when(goodDescriptorRenderer.getInitialHtml(link)).thenReturn("valid html");

    final Map<String, List<IssueLinkContext>> contextMap =
        RemoteIssueLinkUtils.convertToIssueLinkContexts(
            ImmutableList.of(link), 1L, "", new MockI18nHelper(), pluginAccessor);

    Assert.assertEquals(1, contextMap.size());
    final List<IssueLinkContext> contexts = contextMap.values().iterator().next();
    final IssueLinkContext context = Iterables.getOnlyElement(contexts);
    Assert.assertTrue(context.isRequiresAsyncLoading());
    Assert.assertEquals("valid html", context.getHtml());
  }