Repair tests

The only tests missing in the new formulation are tests for
maniphestEdit. maniphestEdit as a whole needs to get re-done. Parts
of the functionality is (for whatever reason in the facade) most in
Conduit. Signatures look off. We'll be adding test when we re-do
manifestEdit in upcoming commits.

Change-Id: I30bff96f4f5db555790673384b10adde5affd03b
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/phabricator/PhabricatorItsFacadeTest.java b/src/test/java/com/googlesource/gerrit/plugins/its/phabricator/PhabricatorItsFacadeTest.java
index c164390..2e55e82 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/phabricator/PhabricatorItsFacadeTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/phabricator/PhabricatorItsFacadeTest.java
@@ -13,7 +13,8 @@
 // limitations under the License.
 package com.googlesource.gerrit.plugins.its.phabricator;
 
-import static org.easymock.EasyMock.expect;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.config.FactoryModule;
@@ -21,50 +22,49 @@
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 import com.googlesource.gerrit.plugins.its.base.testutil.LoggingMockingTestCase;
+import com.googlesource.gerrit.plugins.its.phabricator.conduit.Conduit;
 import org.eclipse.jgit.lib.Config;
+import org.junit.Test;
 
 public class PhabricatorItsFacadeTest extends LoggingMockingTestCase {
   private Injector injector;
   private Config serverConfig;
+  private Conduit.Factory conduitFactory;
 
+  @Test
   public void testCreateLinkForWebUiDifferentUrlAndText() {
     mockUnconnectablePhabricator();
 
-    replayMocks();
-
     PhabricatorItsFacade itsFacade = createPhabricatorItsFacade();
     String actual = itsFacade.createLinkForWebui("Test-Url", "Test-Text");
 
     assertEquals("[[Test-Url|Test-Text]]", actual);
   }
 
+  @Test
   public void testCreateLinkForWebUiSameUrlAndText() {
     mockUnconnectablePhabricator();
 
-    replayMocks();
-
     PhabricatorItsFacade itsFacade = createPhabricatorItsFacade();
     String actual = itsFacade.createLinkForWebui("Test-Url", "Test-Url");
 
     assertEquals("[[Test-Url]]", actual);
   }
 
+  @Test
   public void testCreateLinkForWebUiNullText() {
     mockUnconnectablePhabricator();
 
-    replayMocks();
-
     PhabricatorItsFacade itsFacade = createPhabricatorItsFacade();
     String actual = itsFacade.createLinkForWebui("Test-Url", null);
 
     assertEquals("[[Test-Url]]", actual);
   }
 
+  @Test
   public void testCreateLinkForWebUiEmptyText() {
     mockUnconnectablePhabricator();
 
-    replayMocks();
-
     PhabricatorItsFacade itsFacade = createPhabricatorItsFacade();
     String actual = itsFacade.createLinkForWebui("Test-Url", "");
 
@@ -76,8 +76,8 @@
   }
 
   private void mockUnconnectablePhabricator() {
-    expect(serverConfig.getString("its-phabricator", null, "url")).andReturn("<no-url>").anyTimes();
-    expect(serverConfig.getString("its-phabricator", null, "token")).andReturn("none").anyTimes();
+    when(serverConfig.getString("its-phabricator", null, "url")).thenReturn("<no-url>");
+    when(serverConfig.getString("its-phabricator", null, "token")).thenReturn("none");
   }
 
   @Override
@@ -90,9 +90,11 @@
   private class TestModule extends FactoryModule {
     @Override
     protected void configure() {
-      serverConfig = createMock(Config.class);
+      serverConfig = mock(Config.class);
+      conduitFactory = mock(Conduit.Factory.class);
       bind(Config.class).annotatedWith(GerritServerConfig.class).toInstance(serverConfig);
       bind(String.class).annotatedWith(PluginName.class).toInstance("its-phabricator");
+      bind(Conduit.Factory.class).toInstance(conduitFactory);
     }
   }
 }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/ConduitTest.java b/src/test/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/ConduitTest.java
index 9dec435..f797e15 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/ConduitTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/ConduitTest.java
@@ -13,404 +13,139 @@
 // limitations under the License.
 package com.googlesource.gerrit.plugins.its.phabricator.conduit;
 
-import static org.easymock.EasyMock.capture;
-import static org.easymock.EasyMock.eq;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.resetToStrict;
-import static org.powermock.api.easymock.PowerMock.expectNew;
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.testing.GerritJUnit.assertThrows;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonPrimitive;
 import com.googlesource.gerrit.plugins.its.base.testutil.LoggingMockingTestCase;
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ConduitPing;
-import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ManiphestEdit;
-import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ManiphestInfo;
-import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ProjectInfo;
-import java.util.Arrays;
-import java.util.List;
+import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ProjectSearch;
+import java.util.HashMap;
 import java.util.Map;
-import org.easymock.Capture;
-import org.junit.runner.RunWith;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
+import org.junit.Before;
+import org.junit.Test;
 
-@RunWith(PowerMockRunner.class)
-@PrepareForTest(Conduit.class)
 public class ConduitTest extends LoggingMockingTestCase {
   private static final String URL = "urlFoo";
   private static final String TOKEN = "tokenFoo";
+  private ConduitConnection.Factory conduitConnectionFactory;
+  private ConduitConnection conduitConnection;
 
-  private ConduitConnection connection;
+  @Override
+  @Before
+  public void setUp() throws Exception {
+    super.setUp();
+    conduitConnection = mock(ConduitConnection.class);
+    conduitConnectionFactory = mock(ConduitConnection.Factory.class);
+    when(conduitConnectionFactory.create(URL)).thenReturn(conduitConnection);
+  }
 
+  @Test
   public void testConduitPingPass() throws Exception {
-    mockConnection();
+    JsonElement result = new JsonPrimitive("hostFoo");
+    Map<String, Object> params = new HashMap<>();
+    when(conduitConnection.call("conduit.ping", params, TOKEN)).thenReturn(result);
 
-    resetToStrict(connection);
-
-    Capture<Map<String, Object>> paramsCaptureRelevant = new Capture<>();
-
-    expect(connection.call(eq("conduit.ping"), capture(paramsCaptureRelevant), eq(TOKEN)))
-        .andReturn(new JsonPrimitive("foo"))
-        .once();
-
-    replayMocks();
-
-    Conduit conduit = new Conduit(URL, TOKEN);
+    Conduit conduit = createConduit();
 
     ConduitPing actual = conduit.conduitPing();
-
-    assertEquals("Hostname does not match", "foo", actual.getHostname());
+    assertThat(actual.getHostname()).isEqualTo("hostFoo");
   }
 
+  @Test
   public void testConduitPingConnectionFail() throws Exception {
-    mockConnection();
+    ConduitException e = new ConduitException();
 
-    resetToStrict(connection);
+    Map<String, Object> params = new HashMap<>();
+    when(conduitConnection.call("conduit.ping", params, TOKEN)).thenThrow(e);
 
-    ConduitException conduitException = new ConduitException();
+    Conduit conduit = createConduit();
 
-    Capture<Map<String, Object>> paramsCaptureRelevant = new Capture<>();
-
-    expect(connection.call(eq("conduit.ping"), capture(paramsCaptureRelevant), eq(TOKEN)))
-        .andThrow(conduitException)
-        .once();
-
-    replayMocks();
-
-    Conduit conduit = new Conduit(URL, TOKEN);
-
-    try {
-      conduit.conduitPing();
-      fail("no exception got thrown");
-    } catch (ConduitException e) {
-      assertSame(conduitException, e);
-    }
+    assertThrows(ConduitException.class, () -> conduit.conduitPing());
   }
 
-  public void testManiphestInfoPass() throws Exception {
-    mockConnection();
-
-    resetToStrict(connection);
-
-    Capture<Map<String, Object>> paramsCaptureRelevant = new Capture<>();
-
-    JsonObject retRelevant = new JsonObject();
-    retRelevant.add("id", new JsonPrimitive(42));
-
-    expect(connection.call(eq("maniphest.info"), capture(paramsCaptureRelevant), eq(TOKEN)))
-        .andReturn(retRelevant)
-        .once();
-
-    replayMocks();
-
-    Conduit conduit = new Conduit(URL, TOKEN);
-
-    ManiphestInfo maniphestInfo = conduit.maniphestInfo(42);
-
-    Map<String, Object> paramsRelevant = paramsCaptureRelevant.getValue();
-    assertEquals("Task id is not set", 42, paramsRelevant.get("task_id"));
-
-    assertEquals("ManiphestInfo's id does not match", 42, maniphestInfo.getId());
-  }
-
-  public void testManiphestInfoFailConnect() throws Exception {
-    mockConnection();
-
-    ConduitException conduitException = new ConduitException();
-
-    Capture<Map<String, Object>> paramsCaptureRelevant = new Capture<>();
-
-    expect(connection.call(eq("maniphest.info"), capture(paramsCaptureRelevant), eq(TOKEN)))
-        .andThrow(conduitException)
-        .once();
-
-    replayMocks();
-
-    Conduit conduit = new Conduit(URL, TOKEN);
-
-    try {
-      conduit.maniphestInfo(42);
-      fail("no exception got thrown");
-    } catch (ConduitException e) {
-      assertSame(conduitException, e);
-    }
-  }
-
-  public void testManiphestInfoFailRelevant() throws Exception {
-    mockConnection();
-
-    resetToStrict(connection);
-
-    ConduitException conduitException = new ConduitException();
-
-    Capture<Map<String, Object>> paramsCaptureRelevant = new Capture<>();
-
-    expect(connection.call(eq("maniphest.info"), capture(paramsCaptureRelevant), eq(TOKEN)))
-        .andThrow(conduitException)
-        .once();
-
-    replayMocks();
-
-    Conduit conduit = new Conduit(URL, TOKEN);
-
-    try {
-      conduit.maniphestInfo(42);
-      fail("no exception got thrown");
-    } catch (ConduitException e) {
-      assertSame(conduitException, e);
-    }
-
-    Map<String, Object> paramsRelevant = paramsCaptureRelevant.getValue();
-    assertEquals("Task id is not set", 42, paramsRelevant.get("task_id"));
-  }
-
-  public void testManiphestEditPassComment() throws Exception {
-    mockConnection();
-
-    resetToStrict(connection);
-
-    JsonObject retRelevant = new JsonObject();
-    retRelevant.add("id", new JsonPrimitive(42));
-
-    Capture<Map<String, Object>> paramsCaptureRelevant = new Capture<>();
-
-    expect(connection.call(eq("maniphest.update"), capture(paramsCaptureRelevant), eq(TOKEN)))
-        .andReturn(retRelevant)
-        .once();
-
-    replayMocks();
-
-    Conduit conduit = new Conduit(URL, TOKEN);
-
-    ManiphestEdit maniphestEdit = conduit.maniphestEdit(42, "foo");
-
-    Map<String, Object> paramsRelevant = paramsCaptureRelevant.getValue();
-    assertEquals("Task id is not set", 42, paramsRelevant.get("id"));
-
-    assertEquals("ManiphestInfo's id does not match", 42, maniphestEdit.getId());
-  }
-
-  public void testManiphestEditPassProjects() throws Exception {
-    mockConnection();
-
-    resetToStrict(connection);
-
-    JsonObject retRelevant = new JsonObject();
-    retRelevant.add("id", new JsonPrimitive(42));
-
-    Capture<Map<String, Object>> paramsCaptureRelevant = new Capture<>();
-
-    expect(connection.call(eq("maniphest.edit"), capture(paramsCaptureRelevant), eq(TOKEN)))
-        .andReturn(retRelevant)
-        .once();
-
-    replayMocks();
-
-    Conduit conduit = new Conduit(URL, TOKEN);
-
-    ManiphestEdit maniphestEdit =
-        conduit.maniphestEdit(42, Arrays.asList("foo", "bar"), Conduit.ACTION_PROJECT_ADD);
-
-    Map<String, Object> paramsRelevant = paramsCaptureRelevant.getValue();
-    assertEquals("Task id is not set", 42, paramsRelevant.get("id"));
-    assertEquals(
-        "Task projects are not set",
-        Arrays.asList("foo", "bar"),
-        paramsRelevant.get("projectPHIDs"));
-
-    assertEquals("ManiphestEdit's id does not match", 42, maniphestEdit.getId());
-  }
-
-  public void testManiphestEditPassCommentAndProjects() throws Exception {
-    mockConnection();
-
-    resetToStrict(connection);
-
-    JsonObject retRelevant = new JsonObject();
-    retRelevant.add("id", new JsonPrimitive(42));
-
-    Capture<Map<String, Object>> paramsCaptureRelevant = new Capture<>();
-
-    expect(connection.call(eq("maniphest.edit"), capture(paramsCaptureRelevant), eq(TOKEN)))
-        .andReturn(retRelevant)
-        .once();
-
-    replayMocks();
-
-    Conduit conduit = new Conduit(URL, TOKEN);
-
-    ManiphestEdit maniphestEdit =
-        conduit.maniphestEdit(
-            42, "baz", Arrays.asList("foo", "bar"), Conduit.ACTION_PROJECT_REMOVE);
-
-    Map<String, Object> paramsRelevant = paramsCaptureRelevant.getValue();
-    assertEquals("Task id is not set", 42, paramsRelevant.get("id"));
-    assertEquals("Task comment is not set", "baz", paramsRelevant.get("comments"));
-    assertEquals(
-        "Task projects are not set",
-        Arrays.asList("foo", "bar"),
-        paramsRelevant.get("projectPHIDs"));
-
-    assertEquals("ManiphestUpdate's id does not match", 42, maniphestEdit.getId());
-  }
-
-  public void testManiphestEditFailConnect() throws Exception {
-    mockConnection();
-
-    ConduitException conduitException = new ConduitException();
-
-    Capture<Map<String, Object>> paramsCapture = new Capture<>();
-
-    expect(connection.call(eq("conduit.connect"), capture(paramsCapture), eq(TOKEN)))
-        .andThrow(conduitException)
-        .once();
-
-    replayMocks();
-
-    Conduit conduit = new Conduit(URL, null);
-
-    try {
-      conduit.maniphestEdit(42, "foo");
-      fail("no exception got thrown");
-    } catch (ConduitException e) {
-      assertSame(conduitException, e);
-    }
-  }
-
-  public void testManiphestEditFailRelevant() throws Exception {
-    mockConnection();
-
-    resetToStrict(connection);
-
-    ConduitException conduitException = new ConduitException();
-
-    Capture<Map<String, Object>> paramsCaptureRelevant = new Capture<>();
-
-    expect(connection.call(eq("maniphest.edit"), capture(paramsCaptureRelevant), eq(TOKEN)))
-        .andThrow(conduitException)
-        .once();
-
-    replayMocks();
-
-    Conduit conduit = new Conduit(URL, TOKEN);
-
-    try {
-      conduit.maniphestEdit(42, "foo");
-      fail("no exception got thrown");
-    } catch (ConduitException e) {
-      assertSame(conduitException, e);
-    }
-
-    Map<String, Object> paramsRelevant = paramsCaptureRelevant.getValue();
-    assertEquals("Task id is not set", 42, paramsRelevant.get("id"));
-  }
-
+  @Test
   public void testConnectionReuse() throws Exception {
-    mockConnection();
+    JsonElement result1 = new JsonPrimitive("hostFoo");
+    JsonElement result2 = new JsonPrimitive("hostBar");
+    Map<String, Object> params = new HashMap<>();
+    when(conduitConnection.call("conduit.ping", params, TOKEN)).thenReturn(result1, result2);
 
-    resetToStrict(connection);
+    Conduit conduit = createConduit();
 
-    JsonObject retRelevant = new JsonObject();
-    retRelevant.add("id", new JsonPrimitive(42));
+    ConduitPing actual1 = conduit.conduitPing();
+    assertThat(actual1.getHostname()).isEqualTo("hostFoo");
+    ConduitPing actual2 = conduit.conduitPing();
+    assertThat(actual2.getHostname()).isEqualTo("hostBar");
 
-    Capture<Map<String, Object>> paramsCaptureRelevant = new Capture<>();
-
-    expect(connection.call(eq("maniphest.info"), capture(paramsCaptureRelevant), eq(TOKEN)))
-        .andReturn(retRelevant)
-        .once();
-
-    replayMocks();
-
-    Conduit conduit = new Conduit(URL, TOKEN);
-
-    ManiphestInfo maniphestInfo = conduit.maniphestInfo(42);
-
-    Map<String, Object> paramsRelevant = paramsCaptureRelevant.getValue();
-    assertEquals("Task id is not set", 42, paramsRelevant.get("task_id"));
-
-    assertEquals("ManiphestInfo's id does not match", 42, maniphestInfo.getId());
+    verify(conduitConnectionFactory).create(URL);
+    verifyNoMoreInteractions(conduitConnectionFactory);
   }
 
-  public void testProjectQueryPass() throws Exception {
-    mockConnection();
+  @Test
+  public void testProjectSearchPassSimple() throws Exception {
+    Map<String, Object> params = new HashMap<>();
+    params.put("constraints", ImmutableMap.of("query", "foo"));
 
-    resetToStrict(connection);
+    JsonArray data = new JsonArray();
+    data.add(createProjectJson(2, "foo"));
 
-    JsonObject projectInfoJson = new JsonObject();
-    projectInfoJson.addProperty("name", "foo");
-    projectInfoJson.addProperty("phid", "PHID-PROJ-bar");
+    JsonObject result = new JsonObject();
+    result.add("data", data);
 
-    JsonObject queryDataJson = new JsonObject();
-    queryDataJson.add("PHID-PROJ-bar", projectInfoJson);
+    when(conduitConnection.call("project.search", params, TOKEN)).thenReturn(result);
 
-    JsonObject retRelevant = new JsonObject();
-    retRelevant.add("data", queryDataJson);
+    Conduit conduit = createConduit();
 
-    Capture<Map<String, Object>> paramsCaptureRelevant = new Capture<>();
-
-    expect(connection.call(eq("project.query"), capture(paramsCaptureRelevant), eq(TOKEN)))
-        .andReturn(retRelevant)
-        .once();
-
-    replayMocks();
-
-    Conduit conduit = new Conduit(URL, TOKEN);
-
-    ProjectInfo projectInfo = conduit.projectQuery("foo");
-
-    Map<String, Object> paramsRelevant = paramsCaptureRelevant.getValue();
-    List<String> expectedNames = Arrays.asList("foo");
-    assertEquals("Project name does not match", expectedNames, paramsRelevant.get("names"));
-
-    assertEquals("ProjectInfo's name does not match", "foo", projectInfo.getName());
+    ProjectSearch actual = conduit.projectSearch("foo");
+    assertThat(actual.getPhid()).isEqualTo("PHID-PROJ-foo");
   }
 
-  public void testProjectQueryPassMultipleResults() throws Exception {
-    mockConnection();
+  @Test
+  public void testProjectSearchPassMultiple() throws Exception {
+    Map<String, Object> params = new HashMap<>();
+    params.put("constraints", ImmutableMap.of("query", "foo"));
 
-    resetToStrict(connection);
+    JsonArray data = new JsonArray();
+    data.add(createProjectJson(2, "fooBar"));
+    data.add(createProjectJson(3, "foo"));
+    data.add(createProjectJson(4, "BazFoo"));
 
-    JsonObject projectInfoJson1 = new JsonObject();
-    projectInfoJson1.addProperty("name", "foo1");
-    projectInfoJson1.addProperty("phid", "PHID-PROJ-bar1");
+    JsonObject result = new JsonObject();
+    result.add("data", data);
 
-    JsonObject projectInfoJson2 = new JsonObject();
-    projectInfoJson2.addProperty("name", "foo2");
-    projectInfoJson2.addProperty("phid", "PHID-PROJ-bar2");
+    when(conduitConnection.call("project.search", params, TOKEN)).thenReturn(result);
 
-    JsonObject projectInfoJson3 = new JsonObject();
-    projectInfoJson3.addProperty("name", "foo3");
-    projectInfoJson3.addProperty("phid", "PHID-PROJ-bar3");
+    Conduit conduit = createConduit();
 
-    JsonObject queryDataJson = new JsonObject();
-    queryDataJson.add("PHID-PROJ-bar1", projectInfoJson1);
-    queryDataJson.add("PHID-PROJ-bar2", projectInfoJson2);
-    queryDataJson.add("PHID-PROJ-bar3", projectInfoJson3);
-
-    JsonObject retRelevant = new JsonObject();
-    retRelevant.add("data", queryDataJson);
-
-    Capture<Map<String, Object>> paramsCaptureRelevant = new Capture<>();
-
-    expect(connection.call(eq("project.query"), capture(paramsCaptureRelevant), eq(TOKEN)))
-        .andReturn(retRelevant)
-        .once();
-
-    replayMocks();
-
-    Conduit conduit = new Conduit(URL, TOKEN);
-
-    ProjectInfo projectInfo = conduit.projectQuery("foo2");
-
-    Map<String, Object> paramsRelevant = paramsCaptureRelevant.getValue();
-    List<String> expectedNames = Arrays.asList("foo2");
-    assertEquals("Project name does not match", expectedNames, paramsRelevant.get("names"));
-
-    assertEquals("ProjectInfo's name does not match", "foo2", projectInfo.getName());
+    ProjectSearch actual = conduit.projectSearch("foo");
+    assertThat(actual.getPhid()).isEqualTo("PHID-PROJ-foo");
   }
 
-  private void mockConnection() throws Exception {
-    connection = createMock(ConduitConnection.class);
-    expectNew(ConduitConnection.class, URL).andReturn(connection).once();
+  // TODO: Add tests for maniphestEdit
+
+  private JsonObject createProjectJson(int id, String name) {
+    JsonObject fields = new JsonObject();
+    fields.addProperty("name", name);
+    fields.addProperty("slug", name);
+
+    JsonObject ret = new JsonObject();
+    ret.addProperty("id", id);
+    ret.addProperty("type", "PROJ");
+    ret.addProperty("phid", "PHID-PROJ-" + name);
+    ret.add("fields", fields);
+    return ret;
+  }
+
+  private Conduit createConduit() {
+    return new Conduit(conduitConnectionFactory, URL, TOKEN);
   }
 }