public async Task ReceiveMergeCommand_MergingFails_StrictMergePolicy_UpdateBranchIsCalled() { var payloadString = await File.ReadAllTextAsync("../../../DummyEvents/IssueComment.json"); var payload = JsonConvert.DeserializeObject <dynamic>(payloadString); var owner = Guid.NewGuid().ToString(); var repo = Guid.NewGuid().ToString(); var sha = Guid.NewGuid().ToString(); var branch = "some_test_branch"; // Mock DB await checkListsCollection.InsertWithDefaultChecks(owner, repo); await mergeRequestsCollection.InsertWithTestChecksSuccess(owner, repo, PR_ID, branch, sha); await repoConfigurationCollection.Insert(owner, repo, false, "oldest", "whitelist-strict"); payload["repository"]["name"] = repo; payload["repository"]["owner"]["login"] = owner; // Mock Github Calls await MockReviewGithubCallHelper.MockAllReviewsPassedResponses(owner, repo, PR_ID); var commentReadyForMergingCallId = await MockCommentGithubCallHelper.MockCommentGithubPRIsReadyForMerging(owner, repo, PR_ID); var mergeFailedCommentCallId = await MockCommentGithubCallHelper.MockCommentGithubCallMergeFailed(owner, repo, PR_ID); var mergePrCallId = await MockGithubCall("put", $"{PrUrlFor(owner, repo, PR_ID)}/merge", null, 409); var updateBranchCallId = await MockGithubCall("post", MergesUrlFor(owner, repo), branch, "ok", false); var miroMergeCheckCallId = await MockGithubCall("post", StatusCheckUrlFor(owner, repo, sha), "{}", false); // ACTION await SendWebhookRequest("issue_comment", JsonConvert.SerializeObject(payload)); // Assert var mergePrCall = await GetCall(mergePrCallId); var updateBranchCall = await GetCall(updateBranchCallId); var commentReadyForMergingCall = await GetCall(commentReadyForMergingCallId); var mergeFailedCommentCall = await GetCall(mergeFailedCommentCallId); var miroMergeCheckCall = await GetCall(miroMergeCheckCallId); Assert.True(mergePrCall.HasBeenMade, "PR should have tried to merge"); Assert.True(miroMergeCheckCall.HasBeenMade, "miro merge check success call should have been made"); Assert.True(commentReadyForMergingCall.HasBeenMade, "should get ready for merging comment"); Assert.True(updateBranchCall.HasBeenMade, "PR should have updated branch"); Assert.True(mergeFailedCommentCall.HasBeenMade, "should get PR merge failed comment"); var mergeRequest = await mergeRequestsCollection.Collection.Find(d => d["Owner"] == owner && d["Repo"] == repo && d["PrId"] == PR_ID && d["ReceivedMergeCommand"] == true).FirstAsync(); Assert.True(mergeRequest["ReceivedMergeCommandTimestamp"] < DateTime.UtcNow); Assert.NotNull(mergeRequest); Assert.Equal("Miro merge check", miroMergeCheckCall.Details.Body["context"]); Assert.Equal("success", miroMergeCheckCall.Details.Body["state"]); }
public async Task ReceiveInfoCommand_AllChecksPassed_WriteSuccessComment() { var payloadString = await File.ReadAllTextAsync("../../../DummyEvents/IssueComment.json"); var payload = JsonConvert.DeserializeObject <dynamic>(payloadString); var owner = Guid.NewGuid().ToString(); var repo = Guid.NewGuid().ToString(); // Insert Checkslist and PR to DB await checkListsCollection.InsertWithDefaultChecks(owner, repo); await mergeRequestsCollection.InsertWithTestChecksSuccess(owner, repo, PR_ID); payload["repository"]["name"] = repo; payload["repository"]["owner"]["login"] = owner; payload["issue"]["number"] = PR_ID; payload["comment"]["body"] = "Miro info"; // Mock Github Calls var successCommentCallId = await MockCommentGithubCallHelper.MockCommentGithubPRIsReadyForMerging(owner, repo, PR_ID); await MockReviewGithubCallHelper.MockAllReviewsPassedResponses(owner, repo, PR_ID); // ACTION await SendWebhookRequest("issue_comment", JsonConvert.SerializeObject(payload)); // ASSERT var successCommentCall = await GetCall(successCommentCallId); Assert.True(successCommentCall.HasBeenMade, "Should have recieved a - PR is ready for merging comment"); }
public async Task ReceivePullRequestEvent_ActionIsReopened_PRHasLatestChecks() { var payloadString = await File.ReadAllTextAsync("../../../DummyEvents/PullRequest.json"); var payload = JsonConvert.DeserializeObject <dynamic>(payloadString); var owner = Guid.NewGuid().ToString(); var repo = Guid.NewGuid().ToString(); var branch = Guid.NewGuid().ToString(); var sha = Guid.NewGuid().ToString(); // Insert Merge Request await checkListsCollection.InsertWithDefaultChecks(owner, repo); payload["repository"]["name"] = repo; payload["repository"]["owner"]["login"] = owner; payload["action"] = "reopened"; payload["pull_request"]["head"]["ref"] = branch; payload["pull_request"]["head"]["sha"] = sha; var prStatusCheckMockedResponse = new[] { new { Context = Consts.TEST_CHECK_A, State = "success" }, new { Context = Consts.TEST_CHECK_B, State = "success" } }; // Mock github calls var miroGetPrStatusChecksCallId = await MockGithubCall("get", StatusCheckUrlFor(owner, repo, sha), JsonConvert.SerializeObject(prStatusCheckMockedResponse)); var mergePrCallId = await MockMergeGithubCallHelper.MockMergeCall(owner, repo, PR_ID); var mergeCommentCallId = await MockCommentGithubCallHelper.MockCommentGithubCallMerging(owner, repo, PR_ID); // Action await SendWebhookRequest("pull_request", JsonConvert.SerializeObject(payload)); // Assert var miroGetPrStatusChecksCall = await GetCall(miroGetPrStatusChecksCallId); Assert.True(miroGetPrStatusChecksCall.HasBeenMade, "get PR status checks call should have been made"); var mergeRequest = await mergeRequestsCollection.Collection.Find(d => d["Owner"] == owner && d["Repo"] == repo && d["PrId"] == PR_ID).FirstOrDefaultAsync(); Assert.NotNull(mergeRequest); Assert.True(((BsonArray)mergeRequest["Checks"]).Any(x => x["Name"] == Consts.TEST_CHECK_A && x["Status"] == "success"), $"MergeRequest should contain {Consts.TEST_CHECK_A}"); Assert.True(((BsonArray)mergeRequest["Checks"]).Any(x => x["Name"] == Consts.TEST_CHECK_B && x["Status"] == "success"), $"MergeRequest should contain {Consts.TEST_CHECK_B}"); }
public async Task ReceiveMergeCommand_PrIsApprovedByAllReviewersAndAllChecksPassed_StrictMergePolicy_MergePr() { var payloadString = await File.ReadAllTextAsync("../../../DummyEvents/IssueComment.json"); var payload = JsonConvert.DeserializeObject <dynamic>(payloadString); var owner = Guid.NewGuid().ToString(); var repo = Guid.NewGuid().ToString(); var sha = Guid.NewGuid().ToString(); await checkListsCollection.InsertWithDefaultChecks(owner, repo); await repoConfigurationCollection.Insert(owner, repo, false, "oldest", "whitelist-strict"); payload["repository"]["name"] = repo; payload["repository"]["owner"]["login"] = owner; await mergeRequestsCollection.InsertWithTestChecksSuccess(owner, repo, PR_ID, null, sha); // Mock github calls var mergeCommentCallId = await MockCommentGithubCallHelper.MockCommentGithubCallMerging(owner, repo, PR_ID); var mergePrCallId = await MockMergeGithubCallHelper.MockMergeCall(owner, repo, PR_ID); await MockReviewGithubCallHelper.MockAllReviewsPassedResponses(owner, repo, PR_ID); var commentReadyForMergingCallId = await MockCommentGithubCallHelper.MockCommentGithubPRIsReadyForMerging(owner, repo, PR_ID); var miroMergeCheckCallId = await MockGithubCall("post", StatusCheckUrlFor(owner, repo, sha), "{}", false); // Action await SendWebhookRequest("issue_comment", JsonConvert.SerializeObject(payload)); var commentReadyForMergingCall = await GetCall(commentReadyForMergingCallId); var mergeCommentCall = await GetCall(mergeCommentCallId); var mergePrCall = await GetCall(mergePrCallId); var miroMergeCheckCall = await GetCall(miroMergeCheckCallId); Assert.True(commentReadyForMergingCall.HasBeenMade, "should have receieved a ready for merging comment"); Assert.True(mergeCommentCall.HasBeenMade, "a merging comment should have been posted to the pr"); Assert.True(miroMergeCheckCall.HasBeenMade, "a call to miro merge status check should have been called"); Assert.True(mergePrCall.HasBeenMade, "pr should have been merged"); var mergeRequest = await mergeRequestsCollection.Collection.Find(d => d["Owner"] == owner && d["Repo"] == repo && d["PrId"] == PR_ID && d["ReceivedMergeCommand"] == true).FirstAsync(); Assert.NotNull(mergeRequest); Assert.Equal("Miro merge check", miroMergeCheckCall.Details.Body["context"]); Assert.Equal("success", miroMergeCheckCall.Details.Body["state"]); }
public async Task StatusEvent_LastCheckSuccessful_MergePr() { var owner = Guid.NewGuid().ToString(); var repo = Guid.NewGuid().ToString(); var sha = Guid.NewGuid().ToString(); // Insert to DB Default checks needed await checkListsCollection.InsertWithDefaultChecks(owner, repo); // Insert to PR tests completed var checksAlreadyCompleted = new List <CheckStatus>() { new CheckStatus { Name = Consts.TEST_CHECK_A, Status = "success" } }; await mergeRequestsCollection.Insert(owner, repo, PR_ID, Consts.DEFAULT_BRANCH, true, checksAlreadyCompleted, sha); // Generate Status event with succesful test var payloadString = await File.ReadAllTextAsync("../../../DummyEvents/Status.json"); var payload = JsonConvert.DeserializeObject <dynamic>(payloadString); payload["repository"]["name"] = repo; payload["repository"]["owner"]["login"] = owner; payload["state"] = "success"; payload["sha"] = sha; payload["context"] = Consts.TEST_CHECK_B; // Mock Github calls var mergePrCallId = await MockMergeGithubCallHelper.MockMergeCall(owner, repo, PR_ID); var mergeCommentCallId = await MockCommentGithubCallHelper.MockCommentGithubCallMerging(owner, repo, PR_ID); await MockReviewGithubCallHelper.MockAllReviewsPassedResponses(owner, repo, PR_ID); await MockGithubCall("post", StatusCheckUrlFor(owner, repo, sha), "{}", false); // Action - status event await SendWebhookRequest("status", JsonConvert.SerializeObject(payload)); // Assert var mergePrCall = await GetCall(mergePrCallId); var mergeCommentCall = await GetCall(mergeCommentCallId); var mergeRequest = await mergeRequestsCollection.Collection.Find(d => d["Owner"] == owner && d["Repo"] == repo && d["PrId"] == PR_ID).FirstAsync(); Assert.True(mergePrCall.HasBeenMade, "the pr should be merged"); Assert.True(mergeCommentCall.HasBeenMade, "the merge comment should have been written"); }
public async Task ReceiveMergeCommand_AllChecksPassed_PrHasChangesRequested_WriteErrorComment() { var payloadString = await File.ReadAllTextAsync("../../../DummyEvents/IssueComment.json"); var payload = JsonConvert.DeserializeObject <dynamic>(payloadString); var owner = Guid.NewGuid().ToString(); var repo = Guid.NewGuid().ToString(); payload["repository"]["name"] = repo; payload["repository"]["owner"]["login"] = owner; await checkListsCollection.InsertWithDefaultChecks(owner, repo); await mergeRequestsCollection.InsertWithTestChecksSuccess(owner, repo, PR_ID); await repoConfigurationCollection.Insert(owner, repo); var requestedReviewsMockedResponse = new { teams = Array.Empty <object>(), users = Array.Empty <object>() }; var reviewsMockedResponse = new[] { new { User = new { login = "******", id = 3 }, State = "CHANGES_REQUESTED" } }; await MockReviewGithubCallHelper.MockReviewsResponses(JsonConvert.SerializeObject(requestedReviewsMockedResponse), JsonConvert.SerializeObject(reviewsMockedResponse), owner, repo, PR_ID); var commentChangesRequestedCallId = await MockCommentGithubCallHelper.MockCommentGithubCallRequestedChanges(owner, repo, PR_ID, "itay"); await SendWebhookRequest("issue_comment", JsonConvert.SerializeObject(payload)); // ASSERT var commentChangesRequestedCall = await GetCall(commentChangesRequestedCallId); Assert.True(commentChangesRequestedCall.HasBeenMade, "comment should have been written"); var mergeRequest = await mergeRequestsCollection.Collection.Find(d => d["Owner"] == owner && d["Repo"] == repo && d["PrId"] == PR_ID && d["ReceivedMergeCommand"] == true).FirstAsync(); Assert.NotNull(mergeRequest); }
public async Task ReceiveMergeCommand_PrIsApprovedByAllReviewersAndAllChecksPassed_GetRequiredChecksAndMergePr() { var payloadString = await File.ReadAllTextAsync("../../../DummyEvents/IssueComment.json"); var payload = JsonConvert.DeserializeObject <dynamic>(payloadString); var owner = Guid.NewGuid().ToString(); var repo = Guid.NewGuid().ToString(); var sha = Guid.NewGuid().ToString(); payload["repository"]["name"] = repo; payload["repository"]["owner"]["login"] = owner; await mergeRequestsCollection.InsertWithTestChecksSuccess(owner, repo, PR_ID, null, sha); await repoConfigurationCollection.Insert(owner, repo); // Mock Github Calls var mergeCommentCallId = await MockCommentGithubCallHelper.MockCommentGithubCallMerging(owner, repo, PR_ID); var mergePrCallId = await MockMergeGithubCallHelper.MockMergeCall(owner, repo, PR_ID); await MockReviewGithubCallHelper.MockAllReviewsPassedResponses(owner, repo, PR_ID); var commentReadyForMergingCallId = await MockCommentGithubCallHelper.MockCommentGithubPRIsReadyForMerging(owner, repo, PR_ID); var getRequiredChecksCallId = await MockRequiredChecksGithubCallHelper.MockRequiredChecks(owner, repo, new string[] { Consts.TEST_CHECK_A, Consts.TEST_CHECK_B }); // Action await SendWebhookRequest("issue_comment", JsonConvert.SerializeObject(payload)); // Assert var commentReadyForMergingCall = await GetCall(commentReadyForMergingCallId); var mergeCommentCall = await GetCall(mergeCommentCallId); var mergePrCall = await GetCall(mergePrCallId); var getRequiredChecksCall = await GetCall(getRequiredChecksCallId); Assert.True(commentReadyForMergingCall.HasBeenMade, "should have receieved a ready for merging comment"); Assert.True(mergeCommentCall.HasBeenMade, "a merging comment should have been posted to the pr"); Assert.True(getRequiredChecksCall.HasBeenMade, "should have fetched required checks"); Assert.True(mergePrCall.HasBeenMade, "pr should have been merged"); var mergeRequest = await mergeRequestsCollection.Collection.Find(d => d["Owner"] == owner && d["Repo"] == repo && d["PrId"] == PR_ID && d["ReceivedMergeCommand"] == true).FirstAsync(); Assert.NotNull(mergeRequest); }
public async Task ReceiveMergeCommand_MergingFails_CanNotUpdateBecausePrIsFork() { var payloadString = await File.ReadAllTextAsync("../../../DummyEvents/IssueComment.json"); var payload = JsonConvert.DeserializeObject <dynamic>(payloadString); var owner = Guid.NewGuid().ToString(); var repo = Guid.NewGuid().ToString(); var sha = Guid.NewGuid().ToString(); var branch = "some_test_branch"; // Mock DB await checkListsCollection.InsertWithDefaultChecks(owner, repo); await mergeRequestsCollection.InsertWithTestChecksSuccess(owner, repo, PR_ID, branch, sha, true); // IsFork = true await repoConfigurationCollection.Insert(owner, repo); payload["repository"]["name"] = repo; payload["repository"]["owner"]["login"] = owner; // Mock Github Calls await MockReviewGithubCallHelper.MockAllReviewsPassedResponses(owner, repo, PR_ID); await MockCommentGithubCallHelper.MockCommentGithubPRIsReadyForMerging(owner, repo, PR_ID); await MockCommentGithubCallHelper.MockCommentGithubCallMergeFailed(owner, repo, PR_ID); await MockGithubCall("put", $"{PrUrlFor(owner, repo, PR_ID)}/merge", null, 404); await MockGithubCall("post", StatusCheckUrlFor(owner, repo, sha), "{}", false); var updateFailedCommentCallId = await MockCommentGithubCallHelper.MockCommentGithubCallCanNotUpdateBecauseFork(owner, repo, PR_ID); var updateBranchCallId = await MockGithubCall("post", MergesUrlFor(owner, repo), branch, "ok", false); // ACTION await SendWebhookRequest("issue_comment", JsonConvert.SerializeObject(payload)); // Assert var updateBranchCall = await GetCall(updateBranchCallId); var updateFailedCommentCall = await GetCall(updateFailedCommentCallId); Assert.False(updateBranchCall.HasBeenMade, "PR should not have updated branch"); Assert.True(updateFailedCommentCall.HasBeenMade, "Can not update comment should have been called"); var mergeRequest = await mergeRequestsCollection.Collection.Find(d => d["Owner"] == owner && d["Repo"] == repo && d["PrId"] == PR_ID).FirstAsync(); Assert.NotNull(mergeRequest); }
public async Task StatusEvent_LastCheckSuccessful_NoMergeCommandGiven_BlackListPolicy_MergePr() { var owner = Guid.NewGuid().ToString(); var repo = Guid.NewGuid().ToString(); var sha = Guid.NewGuid().ToString(); // Required test is TEST_CHECK_A await checkListsCollection.Insert(owner, repo, new string[] { Consts.TEST_CHECK_A }); await repoConfigurationCollection.Insert(owner, repo, false, "oldest", "blacklist"); // Create Pull Request await OpenBlackListPullRequest(owner, repo, PR_ID, sha); // Generate Status event with succesful test var payloadString = await File.ReadAllTextAsync("../../../DummyEvents/Status.json"); var payload = JsonConvert.DeserializeObject <dynamic>(payloadString); payload["repository"]["name"] = repo; payload["repository"]["owner"]["login"] = owner; payload["state"] = "success"; payload["sha"] = sha; payload["context"] = Consts.TEST_CHECK_A; // Mock Github calls var mergePrCallId = await MockMergeGithubCallHelper.MockMergeCall(owner, repo, PR_ID); var mergeCommentCallId = await MockCommentGithubCallHelper.MockCommentGithubCallMerging(owner, repo, PR_ID); await MockReviewGithubCallHelper.MockAllReviewsPassedResponses(owner, repo, PR_ID); await MockGithubCall("post", StatusCheckUrlFor(owner, repo, sha), "{}", false); // Action - status event await SendWebhookRequest("status", JsonConvert.SerializeObject(payload)); // Assert var mergePrCall = await GetCall(mergePrCallId); var mergeCommentCall = await GetCall(mergeCommentCallId); var mergeRequest = await mergeRequestsCollection.Collection.Find(d => d["Owner"] == owner && d["Repo"] == repo && d["PrId"] == PR_ID).FirstAsync(); Assert.True(mergePrCall.HasBeenMade, "the pr should be merged"); Assert.True(mergeCommentCall.HasBeenMade, "the merge comment should have been written"); }
private async Task OpenBlackListPullRequest(string owner, string repo, int prId, string sha) { var payloadString = await File.ReadAllTextAsync("../../../DummyEvents/PullRequest.json"); var payload = JsonConvert.DeserializeObject <dynamic>(payloadString); await MockCommentGithubCallHelper.MockCommentGithubCallBlackListPrOpened(owner, repo, prId); payload["repository"]["name"] = repo; payload["repository"]["owner"]["login"] = owner; payload["pull_request"]["head"]["sha"] = sha; payload["pull_request"]["number"] = prId; payload["number"] = prId; // ACTION await SendWebhookRequest("pull_request", JsonConvert.SerializeObject(payload)); }
public async Task ActionIsCompleted_ConclusionIsSuccess_NoMergeCommandGiven_PrIsNotMergable_DoNothing() { var payloadString = await File.ReadAllTextAsync("../../../DummyEvents/Status.json"); var payload = JsonConvert.DeserializeObject <dynamic>(payloadString); var owner = Guid.NewGuid().ToString(); var repo = Guid.NewGuid().ToString(); var sha = Guid.NewGuid().ToString(); await checkListsCollection.InsertWithDefaultChecks(owner, repo); var checksAlreadyCompleted = new List <CheckStatus>() { new CheckStatus { Name = Consts.TEST_CHECK_A, Status = "success" } }; payload["repository"]["name"] = repo; payload["repository"]["owner"]["login"] = owner; payload["state"] = "success"; payload["sha"] = sha; payload["context"] = Consts.TEST_CHECK_B; await mergeRequestsCollection.Insert(owner, repo, PR_ID, Consts.DEFAULT_BRANCH, false, checksAlreadyCompleted, sha); var mergePrCallId = await MockMergeGithubCallHelper.MockMergeCall(owner, repo, PR_ID); var prReadyForMergingCommentCallId = await MockCommentGithubCallHelper.MockCommentGithubPRIsReadyForMerging(owner, repo, PR_ID); await MockReviewGithubCallHelper.MockAllReviewsPassedResponses(owner, repo, PR_ID); await SendWebhookRequest("status", JsonConvert.SerializeObject(payload)); var mergePrCall = await GetCall(mergePrCallId); var prReadyForMergingCommentCall = await GetCall(prReadyForMergingCommentCallId); var mergeRequest = await mergeRequestsCollection.Collection.Find(d => d["Owner"] == owner && d["Repo"] == repo && d["PrId"] == PR_ID).FirstAsync(); Assert.True(prReadyForMergingCommentCall.HasBeenMade, "a comment for PR ready for merging should have been called"); Assert.False(mergePrCall.HasBeenMade, "the pr shouldn't be merged"); }
public async Task ReceievePullRequestReviewApprovedEvent_AllTestsPassed_MergePr() { var owner = Guid.NewGuid().ToString(); var repo = Guid.NewGuid().ToString(); var sha = Guid.NewGuid().ToString(); var payloadString = await File.ReadAllTextAsync("../../../DummyEvents/ReviewPullRequest.json"); var payload = JsonConvert.DeserializeObject <dynamic>(payloadString); payload["repository"]["name"] = repo; payload["repository"]["owner"]["login"] = owner; payload["pull_request"]["number"] = PR_ID; // Mock github var mergeCommentCallId = await MockCommentGithubCallHelper.MockCommentGithubCallMerging(owner, repo, PR_ID); var mergePrCallId = await MockMergeGithubCallHelper.MockMergeCall(owner, repo, PR_ID); // var miroMergeCheckCallId = await MockGithubCall("post", StatusCheckUrlFor(owner, repo, sha), "{}", false); await MockReviewGithubCallHelper.MockAllReviewsPassedResponses(owner, repo, PR_ID); // insert to DB with all checks passed await checkListsCollection.InsertWithDefaultChecks(owner, repo); await mergeRequestsCollection.InsertWithTestChecksSuccessAndMergeCommand(owner, repo, PR_ID, null, sha); // ACTION await SendWebhookRequest("pull_request_review", JsonConvert.SerializeObject(payload)); // ASSERT var mergeCommentCall = await GetCall(mergeCommentCallId); var mergePrCall = await GetCall(mergePrCallId); // var miroMergeCheckCall = await GetCall(miroMergeCheckCallId); Assert.True(mergeCommentCall.HasBeenMade, "a merging comment should have been posted to the pr"); // Assert.True(miroMergeCheckCall.HasBeenMade, "a call to delete miro merge check should have been called"); Assert.True(mergePrCall.HasBeenMade, "pr should have been merged"); var mergeRequest = await mergeRequestsCollection.Collection.Find(d => d["Owner"] == owner && d["Repo"] == repo && d["PrId"] == PR_ID).FirstAsync(); Assert.NotNull(mergeRequest); }
public async Task ReceiveMergeCommand_PrIsApprovedByAllReviewersButChecksDidNotFinish_PrIsNotMerged() { var payloadString = await File.ReadAllTextAsync("../../../DummyEvents/IssueComment.json"); var payload = JsonConvert.DeserializeObject <dynamic>(payloadString); var owner = Guid.NewGuid().ToString(); var repo = Guid.NewGuid().ToString(); // Mock DB await checkListsCollection.InsertWithDefaultChecks(owner, repo); await mergeRequestsCollection.Insert(owner, repo, PR_ID); await repoConfigurationCollection.Insert(owner, repo); payload["repository"]["name"] = repo; payload["repository"]["owner"]["login"] = owner; // Mock Github Calls await MockReviewGithubCallHelper.MockAllReviewsPassedResponses(owner, repo, PR_ID); var mergePrCallId = await MockMergeGithubCallHelper.MockMergeCall(owner, repo, PR_ID); var commentMissingChecksCallId = await MockCommentGithubCallHelper.MockCommentGithubCallPendingChecks(owner, repo, PR_ID); // ACTION await SendWebhookRequest("issue_comment", JsonConvert.SerializeObject(payload)); // ASSERT var commentMissingChecksCall = await GetCall(commentMissingChecksCallId); Assert.True(commentMissingChecksCall.HasBeenMade, "comment should have been written"); var mergePrCall = await GetCall(mergePrCallId); Assert.False(mergePrCall.HasBeenMade, "PR should not be merged"); var mergeRequest = await mergeRequestsCollection.Collection.Find(d => d["Owner"] == owner && d["Repo"] == repo && d["PrId"] == PR_ID && d["ReceivedMergeCommand"] == true).FirstAsync(); Assert.NotNull(mergeRequest); }
public async Task ReceivePullRequestEvent_ActionIsOpened_BlacklistMergePolicyAndWipInTitle_CommentToUser() { var payloadString = await File.ReadAllTextAsync("../../../DummyEvents/PullRequest.json"); var payload = JsonConvert.DeserializeObject <dynamic>(payloadString); var owner = Guid.NewGuid().ToString(); var repo = Guid.NewGuid().ToString(); var sha = Guid.NewGuid().ToString(); var title = "[WIP] title of PR"; await checkListsCollection.InsertWithDefaultChecks(owner, repo); await repoConfigurationCollection.Insert(owner, repo, "oldest", "blacklist"); // Mock Github call to add miro merge status check var miroMergeCheckCallId = await MockGithubCall("post", StatusCheckUrlFor(owner, repo, sha), "pending", "{}", false); var blackListCommentCallId = await MockCommentGithubCallHelper.MockCommentGithubCallBlackListPrOpened(owner, repo, PR_ID); payload["repository"]["name"] = repo; payload["repository"]["owner"]["login"] = owner; payload["pull_request"]["head"]["sha"] = sha; payload["pull_request"]["title"] = title; // ACTION await SendWebhookRequest("pull_request", JsonConvert.SerializeObject(payload)); // ASSERT var miroMergeCheckCall = await GetCall(miroMergeCheckCallId); var blackListCommentCall = await GetCall(blackListCommentCallId); var mergeRequest = await mergeRequestsCollection.Collection.Find(d => d["Owner"] == owner && d["Repo"] == repo && d["PrId"] == PR_ID).FirstAsync(); Assert.False((bool)mergeRequest["ReceivedMergeCommand"]); Assert.True(blackListCommentCall.HasBeenMade, "should have gotten a comment about blacklist Pullrequest"); Assert.False(miroMergeCheckCall.HasBeenMade, "should not have gotten a call to add the miro check"); }
public async Task ReceiveWIPCommand_PrExists_MergeCommandIsRemoved() { var owner = Guid.NewGuid().ToString(); var repo = Guid.NewGuid().ToString(); var payloadString = await File.ReadAllTextAsync("../../../DummyEvents/IssueComment.json"); var payload = JsonConvert.DeserializeObject <dynamic>(payloadString); // Issue cancel comment payload["repository"]["name"] = repo; payload["repository"]["owner"]["login"] = owner; payload["issue"]["number"] = PR_ID; payload["comment"]["body"] = "miro wip"; // Insert PR await mergeRequestsCollection.Insert(owner, repo, PR_ID); // Update with MergeCommand await mergeRequestsCollection.UpdateMergeRequest(owner, repo, PR_ID, true, DateTime.UtcNow); // Mock Comments var createCommentCallId = await MockCommentGithubCallHelper.MockCommentGithubCallWIP(owner, repo, PR_ID); // Action await SendWebhookRequest("issue_comment", JsonConvert.SerializeObject(payload)); // Assert var mergeRequest = await mergeRequestsCollection.Collection.Find(d => d["Owner"] == owner && d["Repo"] == repo && d["PrId"] == PR_ID).FirstOrDefaultAsync(); Assert.NotNull(mergeRequest); Assert.False((bool)mergeRequest["ReceivedMergeCommand"]); Assert.True(mergeRequest["ReceivedMergeCommandTimestamp"] == DateTime.MaxValue); var createCommentCall = await GetCall(createCommentCallId); Assert.True(createCommentCall.HasBeenMade, "a cancel comment should have been posted to the pr"); }
public async Task ReceiveInfoCommand_AllChecksPassed_PrHasPendingReviews_WriteErrorComment() { var payloadString = await File.ReadAllTextAsync("../../../DummyEvents/IssueComment.json"); var payload = JsonConvert.DeserializeObject <dynamic>(payloadString); var owner = Guid.NewGuid().ToString(); var repo = Guid.NewGuid().ToString(); // Insert Checkslist and PR to DB await checkListsCollection.InsertWithDefaultChecks(owner, repo); await mergeRequestsCollection.InsertWithTestChecksSuccess(owner, repo, PR_ID); payload["repository"]["name"] = repo; payload["repository"]["owner"]["login"] = owner; payload["issue"]["number"] = PR_ID; payload["comment"]["body"] = "Miro info"; var requestedReviewsMockedResponse = new { teams = Array.Empty <object>(), users = new[] { new { login = "******", id = 3 } } }; // Mock Github Calls await MockReviewGithubCallHelper.MockReviewsResponses(JsonConvert.SerializeObject(requestedReviewsMockedResponse), "[]", owner, repo, PR_ID); var failureCommentCallId = await MockCommentGithubCallHelper.MockCommentGithubCallPendingReviews(owner, repo, PR_ID, "itay"); // ACTION await SendWebhookRequest("issue_comment", JsonConvert.SerializeObject(payload)); // ASSERT var failureCommentCall = await GetCall(failureCommentCallId); Assert.True(failureCommentCall.HasBeenMade, "Should have recieved a failure comment"); }