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); } }