Add tests for GetCrd Change-Id: I553a987ce484524fae100fe138099e93d8e8f4da
diff --git a/src/test/java/com/googlesource/gerrit/plugins/zuul/GetCrdTest.java b/src/test/java/com/googlesource/gerrit/plugins/zuul/GetCrdTest.java new file mode 100644 index 0000000..019f5c3 --- /dev/null +++ b/src/test/java/com/googlesource/gerrit/plugins/zuul/GetCrdTest.java
@@ -0,0 +1,223 @@ +// Copyright (C) 2020 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.zuul; + +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import com.google.gerrit.entities.Account; +import com.google.gerrit.entities.BranchNameKey; +import com.google.gerrit.entities.Change; +import com.google.gerrit.entities.PatchSet; +import com.google.gerrit.entities.Project; +import com.google.gerrit.extensions.common.ChangeInfo; +import com.google.gerrit.extensions.restapi.Response; +import com.google.gerrit.extensions.restapi.TopLevelResource; +import com.google.gerrit.server.change.RevisionResource; +import com.google.gerrit.server.restapi.change.ChangesCollection; +import com.google.gerrit.server.restapi.change.QueryChanges; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; +import org.eclipse.jgit.lib.ObjectId; +import org.junit.Test; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; + +public class GetCrdTest { + private ChangesCollection changes; + private CommitMessageFetcher commitMessageFetcher; + private RevisionResource rsrc; + + @Test + public void testNoDependencies() throws Exception { + String commitMessage = "subject"; + configureMocks(commitMessage, new ArrayList<>()); + + GetCrd getCrd = createGetCrd(); + Response<CrdInfo> response = getCrd.apply(rsrc); + + assertThat(response.statusCode()).isEqualTo(200); + CrdInfo crdInfo = response.value(); + assertThat(crdInfo.dependsOn).isEmpty(); + assertThat(crdInfo.neededBy).isEmpty(); + assertThat(crdInfo.cycle).isFalse(); + } + + @Test + public void testSingleDependsOn() throws Exception { + String commitMessage = "subject\nDepends-On: I00000000"; + configureMocks(commitMessage, new ArrayList<>()); + + GetCrd getCrd = createGetCrd(); + Response<CrdInfo> response = getCrd.apply(rsrc); + + assertThat(response.statusCode()).isEqualTo(200); + CrdInfo crdInfo = response.value(); + assertThat(crdInfo.dependsOn).containsExactly("I00000000"); + assertThat(crdInfo.neededBy).isEmpty(); + assertThat(crdInfo.cycle).isFalse(); + } + + @Test + public void testMultipleDependsOn() throws Exception { + String commitMessage = + "subject\nDepends-On: I00000000\nDepends-On: I00000002\nDepends-On: I00000004"; + configureMocks(commitMessage, new ArrayList<>()); + + GetCrd getCrd = createGetCrd(); + Response<CrdInfo> response = getCrd.apply(rsrc); + + assertThat(response.statusCode()).isEqualTo(200); + CrdInfo crdInfo = response.value(); + assertThat(crdInfo.dependsOn).containsExactly("I00000000", "I00000002", "I00000004"); + assertThat(crdInfo.neededBy).isEmpty(); + assertThat(crdInfo.cycle).isFalse(); + } + + @Test + public void testSingleNeededBy() throws Exception { + String commitMessage = "subject"; + List<ChangeInfo> searchResults = new ArrayList<>(); + searchResults.add(changeInfo("I00000001")); + configureMocks(commitMessage, searchResults); + + GetCrd getCrd = createGetCrd(); + Response<CrdInfo> response = getCrd.apply(rsrc); + + assertThat(response.statusCode()).isEqualTo(200); + CrdInfo crdInfo = response.value(); + assertThat(crdInfo.dependsOn).isEmpty(); + assertThat(crdInfo.neededBy).containsExactly("I00000001"); + assertThat(crdInfo.cycle).isFalse(); + } + + @Test + public void testMultipleNeededBy() throws Exception { + String commitMessage = "subject"; + List<ChangeInfo> searchResults = new ArrayList<>(); + searchResults.add(changeInfo("I00000001")); + searchResults.add(changeInfo("I00000003")); + searchResults.add(changeInfo("I00000005")); + configureMocks(commitMessage, searchResults); + + GetCrd getCrd = createGetCrd(); + Response<CrdInfo> response = getCrd.apply(rsrc); + + assertThat(response.statusCode()).isEqualTo(200); + CrdInfo crdInfo = response.value(); + assertThat(crdInfo.dependsOn).isEmpty(); + assertThat(crdInfo.neededBy).containsExactly("I00000001", "I00000003", "I00000005"); + assertThat(crdInfo.cycle).isFalse(); + } + + @Test + public void testMixed() throws Exception { + String commitMessage = "subject\nDepends-On: I00000002\nDepends-On: I00000004"; + List<ChangeInfo> searchResults = new ArrayList<>(); + searchResults.add(changeInfo("I00000001")); + searchResults.add(changeInfo("I00000003")); + configureMocks(commitMessage, searchResults); + + GetCrd getCrd = createGetCrd(); + Response<CrdInfo> response = getCrd.apply(rsrc); + + assertThat(response.statusCode()).isEqualTo(200); + CrdInfo crdInfo = response.value(); + assertThat(crdInfo.dependsOn).containsExactly("I00000002", "I00000004"); + assertThat(crdInfo.neededBy).containsExactly("I00000001", "I00000003"); + assertThat(crdInfo.cycle).isFalse(); + } + + @Test + public void testSimpleCycle() throws Exception { + String commitMessage = "subject\nDepends-On: I00000001"; + List<ChangeInfo> searchResults = new ArrayList<>(); + searchResults.add(changeInfo("I00000001")); + configureMocks(commitMessage, searchResults); + + GetCrd getCrd = createGetCrd(); + Response<CrdInfo> response = getCrd.apply(rsrc); + + assertThat(response.statusCode()).isEqualTo(200); + CrdInfo crdInfo = response.value(); + assertThat(crdInfo.dependsOn).containsExactly("I00000001"); + assertThat(crdInfo.neededBy).containsExactly("I00000001"); + assertThat(crdInfo.cycle).isTrue(); + } + + public void configureMocks(String commitMessage, final List<ChangeInfo> searchResult) + throws Exception { + String commitId = "0123456789012345678901234567890123456789"; + + Project.NameKey projectNameKey = Project.nameKey("projectFoo"); + + PatchSet patchSet = mock(PatchSet.class); + when(patchSet.commitId()).thenReturn(ObjectId.fromString(commitId)); + + Change change = + new Change( + Change.key("I0123456789"), + Change.id(4711), + Account.id(23), + BranchNameKey.create(projectNameKey, "branchBar"), + new Timestamp(0)); + + rsrc = mock(RevisionResource.class); + when(rsrc.getChange()).thenReturn(change); + when(rsrc.getPatchSet()).thenReturn(patchSet); + + QueryChanges queryChanges = mock(QueryChanges.class); + final AtomicBoolean addedQuery = new AtomicBoolean(false); + doAnswer( + new Answer<Void>() { + @Override + public Void answer(InvocationOnMock invocation) throws Throwable { + addedQuery.getAndSet(true); + return null; + } + }) + .when(queryChanges) + .addQuery("message:I0123456789 -change:I0123456789"); + when(queryChanges.apply(TopLevelResource.INSTANCE)) + .thenAnswer( + new Answer<Response<List<ChangeInfo>>>() { + + @Override + public Response<List<ChangeInfo>> answer(InvocationOnMock invocation) + throws Throwable { + return Response.ok(addedQuery.get() ? searchResult : null); + } + }); + + changes = mock(ChangesCollection.class); + when(changes.list()).thenReturn(queryChanges); + + commitMessageFetcher = mock(CommitMessageFetcher.class); + when(commitMessageFetcher.fetch(projectNameKey, commitId)).thenReturn(commitMessage); + } + + private ChangeInfo changeInfo(String changeId) { + ChangeInfo changeInfo = new ChangeInfo(); + changeInfo.changeId = changeId; + return changeInfo; + } + + private GetCrd createGetCrd() { + return new GetCrd(changes, commitMessageFetcher); + } +}