Search in sources :

Example 1 with CheckRunMessage

use of com.github.avano.pr.workflow.message.CheckRunMessage in project pull-request-workflow by avano.

the class ReviewSubmittedHandler method handleReview.

/**
 * Handles the
 * <a href="https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#pull_request_review">pull request review</a> submitted event.
 * <p>
 * When the user provided a review, he is removed from the assignee list.
 * <p>
 * When the PR is approved and there are no changes-requested reviews from other reviewers, approved label is added to the PR and it is tried
 * to merge the PR, otherwise the approved review is ignored.
 * <p>
 * When changes are requested, the PR is assigned back to author and corresponding label is added and approved label is removed.
 * <p>
 * When the PR is commented (not only PR's "comment only" action, but also all conversation), commented label is applied and if the author of
 * the comment is in the assignees list, he is removed (as he provided a "review")
 *
 * @param msg {@link BusMessage} instance
 */
@Log
@ConsumeEvent(Constants.PR_REVIEW_SUBMITTED)
public void handleReview(BusMessage msg) {
    GHClient client = msg.client();
    GHPullRequestReview review = msg.get(GHPullRequestReview.class);
    GHPullRequest pr = msg.get(BusMessage.INFO_PR_KEY, GHPullRequest.class);
    List<String> addLabels = new ArrayList<>();
    List<String> removeLabels = new ArrayList<>();
    switch(review.getState()) {
        case APPROVED:
            LOG.info("PR #{}: Approved by {}", pr.getNumber(), msg.getSender().getLogin());
            List<GHUser> assignees = new ArrayList<>(pr.getAssignees());
            if (assignees.contains(msg.getSender())) {
                assignees.remove(msg.getSender());
                LOG.info("PR #{}: Removing {} from assignees", pr.getNumber(), msg.getSender().getLogin());
                client.setAssignees(pr, assignees);
            } else {
                LOG.debug("PR #{}: {} wasn't in assignees list and provided a review", pr.getNumber(), msg.getSender().getLogin());
            }
            // Only add approved label if there are no "changes required" reviews left
            if (!client.changesRequested(pr)) {
                addLabels.addAll(client.getRepositoryConfiguration().approvedLabels());
                removeLabels.addAll(client.getRepositoryConfiguration().changesRequestedLabels());
                eventBus.publish(Constants.CHECK_RUN_CREATE, new BusMessage(client, new CheckRunMessage(pr, GHCheckRun.Status.COMPLETED, GHCheckRun.Conclusion.SUCCESS)));
            }
            // Review was provided, dismiss review requested label
            removeLabels.addAll(client.getRepositoryConfiguration().reviewRequestedLabels());
            eventBus.publish(Constants.EDIT_LABELS, new BusMessage(client, new LabelsMessage(pr, addLabels, removeLabels)));
            // Don't merge here, it will be handled by the checkrun event
            break;
        case CHANGES_REQUESTED:
            LOG.info("PR #{}: Changes requested by {}", pr.getNumber(), msg.getSender().getLogin());
            client.assignToAuthor(pr);
            eventBus.publish(Constants.CHECK_RUN_CREATE, new BusMessage(client, new CheckRunMessage(pr, GHCheckRun.Status.COMPLETED, GHCheckRun.Conclusion.FAILURE)));
            removeLabels.addAll(client.getRepositoryConfiguration().approvedLabels());
            removeLabels.addAll(client.getRepositoryConfiguration().reviewRequestedLabels());
            eventBus.publish(Constants.EDIT_LABELS, new BusMessage(client, new LabelsMessage(pr, client.getRepositoryConfiguration().changesRequestedLabels(), removeLabels)));
            break;
        case COMMENTED:
            LOG.info("PR #{}: Commented by {}", pr.getNumber(), msg.getSender().getLogin());
            addLabels.addAll(client.getRepositoryConfiguration().commentedLabels());
            eventBus.publish(Constants.EDIT_LABELS, new BusMessage(client, new LabelsMessage(pr, addLabels, removeLabels)));
            break;
        default:
            LOG.info("PR #{}: Ignoring review state {}", pr.getNumber(), review.getState().name().toLowerCase());
            break;
    }
}
Also used : GHPullRequest(org.kohsuke.github.GHPullRequest) GHClient(com.github.avano.pr.workflow.gh.GHClient) BusMessage(com.github.avano.pr.workflow.message.BusMessage) CheckRunMessage(com.github.avano.pr.workflow.message.CheckRunMessage) GHPullRequestReview(org.kohsuke.github.GHPullRequestReview) ArrayList(java.util.ArrayList) GHUser(org.kohsuke.github.GHUser) LabelsMessage(com.github.avano.pr.workflow.message.LabelsMessage) Log(com.github.avano.pr.workflow.handler.interceptor.Log) ConsumeEvent(io.quarkus.vertx.ConsumeEvent)

Example 2 with CheckRunMessage

use of com.github.avano.pr.workflow.message.CheckRunMessage in project pull-request-workflow by avano.

the class ReviewRequestsTestHandler method shouldCreateCheckRunWhenReviewWasRequestedTest.

@Test
public void shouldCreateCheckRunWhenReviewWasRequestedTest() {
    GHPullRequest pr = getPullRequestWithReviewers(DEFAULT_REVIEWER);
    BusMessage e = getMessage(pr, DEFAULT_REVIEWER);
    reviewRequestHandler.handleReviewRequested(e);
    waitForInvocationsAndAssert(Constants.CHECK_RUN_CREATE, 1);
    CheckRunMessage msg = getInvocations(Constants.CHECK_RUN_CREATE).get(0).getMessage().get(CheckRunMessage.class);
    assertThat(msg.getPr().getNumber()).isEqualTo(pr.getNumber());
    assertThat(msg.getConclusion()).isNull();
    assertThat(msg.getStatus()).isEqualTo(GHCheckRun.Status.IN_PROGRESS);
}
Also used : GHPullRequest(org.kohsuke.github.GHPullRequest) BusMessage(com.github.avano.pr.workflow.message.BusMessage) CheckRunMessage(com.github.avano.pr.workflow.message.CheckRunMessage) QuarkusTest(io.quarkus.test.junit.QuarkusTest) Test(org.junit.jupiter.api.Test)

Example 3 with CheckRunMessage

use of com.github.avano.pr.workflow.message.CheckRunMessage in project pull-request-workflow by avano.

the class ReviewSubmittedHandlerTest method shouldCreateSuccessCheckRunWhenApprovedTest.

@Test
public void shouldCreateSuccessCheckRunWhenApprovedTest() {
    reviewSubmittedHandler.handleReview(getEvent(pr, GHPullRequestReviewState.APPROVED));
    waitForInvocationsAndAssert(Constants.CHECK_RUN_CREATE, 1);
    CheckRunMessage msg = getInvocations(Constants.CHECK_RUN_CREATE).get(0).getMessage().get(CheckRunMessage.class);
    assertThat(msg.getPr().getNumber()).isEqualTo(pr.getNumber());
    assertThat(msg.getConclusion()).isEqualTo(GHCheckRun.Conclusion.SUCCESS);
    assertThat(msg.getStatus()).isEqualTo(GHCheckRun.Status.COMPLETED);
}
Also used : CheckRunMessage(com.github.avano.pr.workflow.message.CheckRunMessage) QuarkusTest(io.quarkus.test.junit.QuarkusTest) Test(org.junit.jupiter.api.Test)

Example 4 with CheckRunMessage

use of com.github.avano.pr.workflow.message.CheckRunMessage in project pull-request-workflow by avano.

the class ReviewSubmittedHandlerTest method shouldCreateFailedCheckRunWhenChangesWereRequestedTest.

@Test
public void shouldCreateFailedCheckRunWhenChangesWereRequestedTest() {
    reviewSubmittedHandler.handleReview(getEvent(pr, GHPullRequestReviewState.CHANGES_REQUESTED));
    waitForInvocationsAndAssert(Constants.CHECK_RUN_CREATE, 1);
    CheckRunMessage msg = getInvocations(Constants.CHECK_RUN_CREATE).get(0).getMessage().get(CheckRunMessage.class);
    assertThat(msg.getPr().getNumber()).isEqualTo(pr.getNumber());
    assertThat(msg.getConclusion()).isEqualTo(GHCheckRun.Conclusion.FAILURE);
    assertThat(msg.getStatus()).isEqualTo(GHCheckRun.Status.COMPLETED);
}
Also used : CheckRunMessage(com.github.avano.pr.workflow.message.CheckRunMessage) QuarkusTest(io.quarkus.test.junit.QuarkusTest) Test(org.junit.jupiter.api.Test)

Example 5 with CheckRunMessage

use of com.github.avano.pr.workflow.message.CheckRunMessage in project pull-request-workflow by avano.

the class ReviewRequestsTestHandler method shouldCreateQueuedCheckRunWhenReviewWasRemovedAndThereAreNoAssigneesLeftTest.

@Test
public void shouldCreateQueuedCheckRunWhenReviewWasRemovedAndThereAreNoAssigneesLeftTest() {
    GHPullRequest pr = getPullRequestWithReviewers();
    BusMessage e = getMessage(pr, DEFAULT_REVIEWER);
    reviewRequestHandler.handleReviewRequestRemoved(e);
    waitForInvocationsAndAssert(Constants.CHECK_RUN_CREATE, 1);
    CheckRunMessage msg = getInvocations(Constants.CHECK_RUN_CREATE).get(0).getMessage().get(CheckRunMessage.class);
    assertThat(msg.getPr().getNumber()).isEqualTo(pr.getNumber());
    assertThat(msg.getConclusion()).isNull();
    assertThat(msg.getStatus()).isEqualTo(GHCheckRun.Status.QUEUED);
}
Also used : GHPullRequest(org.kohsuke.github.GHPullRequest) BusMessage(com.github.avano.pr.workflow.message.BusMessage) CheckRunMessage(com.github.avano.pr.workflow.message.CheckRunMessage) QuarkusTest(io.quarkus.test.junit.QuarkusTest) Test(org.junit.jupiter.api.Test)

Aggregations

CheckRunMessage (com.github.avano.pr.workflow.message.CheckRunMessage)7 BusMessage (com.github.avano.pr.workflow.message.BusMessage)5 GHPullRequest (org.kohsuke.github.GHPullRequest)5 QuarkusTest (io.quarkus.test.junit.QuarkusTest)4 Test (org.junit.jupiter.api.Test)4 GHClient (com.github.avano.pr.workflow.gh.GHClient)3 Log (com.github.avano.pr.workflow.handler.interceptor.Log)3 LabelsMessage (com.github.avano.pr.workflow.message.LabelsMessage)3 ConsumeEvent (io.quarkus.vertx.ConsumeEvent)3 ArrayList (java.util.ArrayList)1 GHPullRequestReview (org.kohsuke.github.GHPullRequestReview)1 GHUser (org.kohsuke.github.GHUser)1