Stop adding link caption if it is null or agrees with the url

Formated links were of the form

  url (caption)

and Bugzilla typically autolinked the url. If caption equals with the
url, we ended up with comments as

  http://www.example.org/ (http://www.example.org/)

which is unnecessarily verbose. In such settings (and if no caption is
provided), we no condense the generated link to:

  http://www.example.org/

Bugzilla again autolinks the url, but the description that gave no
additional information is now gone.

Change-Id: I77543aa2c9d34dc4716d7e6e8176f379dafd747c
diff --git a/src/main/java/com/googlesource/gerrit/plugins/hooks/bz/BugzillaItsFacade.java b/src/main/java/com/googlesource/gerrit/plugins/hooks/bz/BugzillaItsFacade.java
index 4a79142..0a473a8 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/hooks/bz/BugzillaItsFacade.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/hooks/bz/BugzillaItsFacade.java
@@ -217,7 +217,11 @@
 
   @Override
   public String createLinkForWebui(String url, String text) {
-    return url + " ("+text+")";
+    String ret = url;
+    if (text != null && ! text.equals(url)) {
+        ret += " (" + text + ")";
+    }
+    return ret;
   }
 
   private String healthCheckAccess() throws BugzillaException, ConnectionException {
diff --git a/src/test/java/com/googlesource/gerrit/plugins/hooks/bz/BugzillaItsFacadeTest.java b/src/test/java/com/googlesource/gerrit/plugins/hooks/bz/BugzillaItsFacadeTest.java
new file mode 100644
index 0000000..46f7c79
--- /dev/null
+++ b/src/test/java/com/googlesource/gerrit/plugins/hooks/bz/BugzillaItsFacadeTest.java
@@ -0,0 +1,109 @@
+// Copyright (C) 2013 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package com.googlesource.gerrit.plugins.hooks.bz;
+
+import static org.easymock.EasyMock.expect;
+
+import org.eclipse.jgit.lib.Config;
+
+import com.google.gerrit.server.config.FactoryModule;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.googlesource.gerrit.plugins.hooks.testutil.LoggingMockingTestCase;
+
+public class BugzillaItsFacadeTest extends LoggingMockingTestCase {
+  private Injector injector;
+  private Config serverConfig;
+
+  public void testCreateLinkForWebUiPlain() {
+    mockUnconnectableBugzilla();
+
+    replayMocks();
+
+    BugzillaItsFacade itsFacade = createBugzillaItsFacade();
+    String actual = itsFacade.createLinkForWebui("Test-Url", "Test-Text");
+
+    assertNotNull("Created link is null", actual);
+    assertTrue("Created link does not contain url",
+        actual.contains("Test-Url"));
+    assertTrue("Created link does not contain text",
+        actual.contains("Test-Text"));
+
+    assertUnconnectableBugzilla();
+  }
+
+  public void testCreateLinkForWebUiUrlEqualsText() {
+    mockUnconnectableBugzilla();
+
+    replayMocks();
+
+    BugzillaItsFacade itsFacade = createBugzillaItsFacade();
+    String actual = itsFacade.createLinkForWebui("Test-Url", "Test-Url");
+
+    assertNotNull("Created link is null", actual);
+    assertEquals("Created link does not match", "Test-Url", actual);
+
+    assertUnconnectableBugzilla();
+  }
+
+  public void testCreateLinkForWebUiUrlEqualsNull() {
+    mockUnconnectableBugzilla();
+
+    replayMocks();
+
+    BugzillaItsFacade itsFacade = createBugzillaItsFacade();
+    String actual = itsFacade.createLinkForWebui("Test-Url", null);
+
+    assertNotNull("Created link is null", actual);
+    assertEquals("Created link does not match", "Test-Url", actual);
+
+    assertUnconnectableBugzilla();
+  }
+
+  private BugzillaItsFacade createBugzillaItsFacade() {
+    return injector.getInstance(BugzillaItsFacade.class);
+  }
+
+  private void mockUnconnectableBugzilla() {
+    expect(serverConfig.getString("bugzilla",  null, "url"))
+    .andReturn("<no-url>").anyTimes();
+    expect(serverConfig.getString("bugzilla",  null, "username"))
+    .andReturn("none").anyTimes();
+    expect(serverConfig.getString("bugzilla",  null, "password"))
+    .andReturn("none").anyTimes();
+  }
+
+  private void assertUnconnectableBugzilla() {
+    assertLogMessageContains("Connecting to bugzilla");
+    assertLogMessageContains("Unable to connect");
+    assertLogMessageContains("Bugzilla is currently not available");
+  }
+
+  @Override
+  public void setUp() throws Exception {
+    super.setUp();
+
+    injector = Guice.createInjector(new TestModule());
+  }
+
+  private class TestModule extends FactoryModule {
+    @Override
+    protected void configure() {
+      serverConfig = createMock(Config.class);
+      bind(Config.class).annotatedWith(GerritServerConfig.class)
+          .toInstance(serverConfig);
+    }
+  }
+}
\ No newline at end of file