diff --git a/src/main/java/com/github/mc1arke/sonarqube/plugin/server/pullrequest/ws/pullrequest/action/ListAction.java b/src/main/java/com/github/mc1arke/sonarqube/plugin/server/pullrequest/ws/pullrequest/action/ListAction.java index 1892cc8d0..71630ac5d 100644 --- a/src/main/java/com/github/mc1arke/sonarqube/plugin/server/pullrequest/ws/pullrequest/action/ListAction.java +++ b/src/main/java/com/github/mc1arke/sonarqube/plugin/server/pullrequest/ws/pullrequest/action/ListAction.java @@ -115,12 +115,17 @@ private static void checkPermission(ProjectDto project, UserSession userSession) private static void addPullRequest(ProjectPullRequests.ListWsResponse.Builder response, BranchDto branch, Map mergeBranchesByUuid, @Nullable LiveMeasureDto qualityGateMeasure, @Nullable String analysisDate) { + DbProjectBranches.PullRequestData pullRequestData = branch.getPullRequestData(); + + if (pullRequestData == null) { + return; + } + Optional mergeBranch = Optional.ofNullable(mergeBranchesByUuid.get(branch.getMergeBranchUuid())); ProjectPullRequests.PullRequest.Builder builder = ProjectPullRequests.PullRequest.newBuilder(); builder.setKey(branch.getKey()); - DbProjectBranches.PullRequestData pullRequestData = Objects.requireNonNull(branch.getPullRequestData(), "Pull request data should be available for branch type PULL_REQUEST"); builder.setBranch(pullRequestData.getBranch()); Optional.ofNullable(Strings.emptyToNull(pullRequestData.getUrl())).ifPresent(builder::setUrl); Optional.ofNullable(Strings.emptyToNull(pullRequestData.getTitle())).ifPresent(builder::setTitle); diff --git a/src/test/java/com/github/mc1arke/sonarqube/plugin/server/pullrequest/ws/pullrequest/action/ListActionTest.java b/src/test/java/com/github/mc1arke/sonarqube/plugin/server/pullrequest/ws/pullrequest/action/ListActionTest.java index 0d976d7ca..79b10eb34 100644 --- a/src/test/java/com/github/mc1arke/sonarqube/plugin/server/pullrequest/ws/pullrequest/action/ListActionTest.java +++ b/src/test/java/com/github/mc1arke/sonarqube/plugin/server/pullrequest/ws/pullrequest/action/ListActionTest.java @@ -177,6 +177,92 @@ void shouldExecuteRequestWithValidParameter() { assertThat(messageArgumentCaptor.getValue()).usingRecursiveComparison().isEqualTo(expected); } + @Test + void shouldExcludePullRequestsWithoutData() { + Request request = mock(Request.class); + when(request.mandatoryParam("project")).thenReturn("project"); + + when(componentFinder.getProjectByKey(any(), any())).thenReturn(new ProjectDto().setKey("projectKey").setUuid("uuid0")); + + when(userSession.hasPermission(any())).thenReturn(true); + + BranchDao branchDao = mock(BranchDao.class); + when(dbClient.branchDao()).thenReturn(branchDao); + when(branchDao.selectByProject(any(), any())).thenReturn(List.of(new BranchDto() + .setBranchType(BranchType.PULL_REQUEST) + .setKey("prKey") + .setUuid("uuid1") + .setMergeBranchUuid("uuid2") + .setPullRequestData(DbProjectBranches.PullRequestData.newBuilder() + .setBranch("prBranch") + .setTitle("title") + .setTarget("target") + .setUrl("url") + .build()), + new BranchDto() + .setBranchType(BranchType.PULL_REQUEST) + .setKey("prKey2") + .setUuid("uuid3"), + new BranchDto() + .setBranchType(BranchType.PULL_REQUEST) + .setKey("prKey3") + .setUuid("uuid4") + .setMergeBranchUuid("uuid2") + .setPullRequestData(DbProjectBranches.PullRequestData.newBuilder() + .setBranch("prBranch2") + .setTitle("title3") + .setUrl("url3") + .build()))); + + when(branchDao.selectByUuids(any(), any())).thenReturn(List.of(new BranchDto() + .setUuid("uuid2") + .setKey("branch2Key"))); + + LiveMeasureDao liveMeasureDao = mock(LiveMeasureDao.class); + when(dbClient.liveMeasureDao()).thenReturn(liveMeasureDao); + when(liveMeasureDao.selectByComponentUuidsAndMetricKeys(any(), any(), any())).thenReturn(List.of(new LiveMeasureDto() + .setComponentUuid("uuid1") + .setData("live measure"))); + + SnapshotDao snapshotDao = mock(SnapshotDao.class); + when(dbClient.snapshotDao()).thenReturn(snapshotDao); + when(snapshotDao.selectLastAnalysesByRootComponentUuids(any(), any())).thenReturn(List.of(new SnapshotDto().setComponentUuid("componentUuid").setCreatedAt(1234L))); + + Response response = mock(Response.class); + + ProjectPullRequests.ListWsResponse expected = ProjectPullRequests.ListWsResponse.newBuilder() + .addPullRequests(ProjectPullRequests.PullRequest.newBuilder() + .setKey("prKey") + .setTitle("title") + .setBranch("prBranch") + .setBase("branch2Key") + .setStatus(ProjectPullRequests.Status.newBuilder() + .setQualityGateStatus("live measure") + .build()) + .setUrl("url") + .setTarget("target") + .build()) + .addPullRequests(ProjectPullRequests.PullRequest.newBuilder() + .setKey("prKey3") + .setTitle("title3") + .setBranch("prBranch2") + .setBase("branch2Key") + .setStatus(ProjectPullRequests.Status.newBuilder() + .build()) + .setUrl("url3") + .setTarget("branch2Key") + .build()) + .build(); + + + underTest.handle(request, response); + + ArgumentCaptor messageArgumentCaptor = ArgumentCaptor.forClass(ProjectPullRequests.ListWsResponse.class); + verify(protoBufWriter).write(messageArgumentCaptor.capture(), eq(request), eq(response)); + + assertThat(messageArgumentCaptor.getValue()).usingRecursiveComparison().isEqualTo(expected); + } + @Test void shouldNotExecuteRequestIfUserDoesNotHaveAnyPermissions() { Request request = mock(Request.class);