public async Task MultiplePullRequests_PushEventOnMaster_NextPrHasFailingTests_NextNextPrBranchIsUpdated() { var owner = Guid.NewGuid().ToString(); var repo = Guid.NewGuid().ToString(); var secondBranchName = Guid.NewGuid().ToString(); var thirdBranchName = Guid.NewGuid().ToString(); var secondPrId = 100; var thirdPrId = 101; // Issue Push event var payloadString = await File.ReadAllTextAsync("../../../DummyEvents/Push.json"); var payload = JsonConvert.DeserializeObject <dynamic>(payloadString); payload["repository"]["name"] = repo; payload["repository"]["owner"]["login"] = owner; var secondPrCheckStatus = new List <CheckStatus>() { new CheckStatus { Name = Consts.TEST_CHECK_A, Status = "failure" }, new CheckStatus { Name = Consts.TEST_CHECK_B, Status = "success" } }; // Insert Merge Requests await mergeRequestsCollection.InsertWithTestChecksSuccessAndMergeCommand(owner, repo, thirdPrId, thirdBranchName); await mergeRequestsCollection.Insert(owner, repo, secondPrId, secondBranchName, true, secondPrCheckStatus); // Make second PR older than the first PR await mergeRequestsCollection.UpdateMergeRequest(owner, repo, secondPrId, true, DateTime.UtcNow.AddMinutes(-10)); await mergeRequestsCollection.UpdateMergeRequest(owner, repo, thirdPrId, true, DateTime.UtcNow.AddMinutes(-5)); // Mock Github cal var updateBranchCallId = await MockGithubCall("post", MergesUrlFor(owner, repo), "ok", false); await MockRepoConfigGithubCallHelper.MockRepoConfigGithubCall(owner, repo, "strategyOldest.yml"); await MockRequiredChecksGithubCallHelper.MockRequiredChecks(owner, repo); // ACTION await SendWebhookRequest("push", JsonConvert.SerializeObject(payload)); // ASSERT var updateBranchCall = await GetCall(updateBranchCallId); Assert.True(updateBranchCall.HasBeenMade, "update branch call should have been made on the third branch"); Assert.Equal(thirdBranchName, updateBranchCall.Details.Body["base"]); }
public async Task ReceiveCancelCommand_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 cancel"; // 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.MockCommentGithubCallCancel(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 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 ActionIsCompleted_ConclusionIsNotSuccess_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"] = "failure"; payload["sha"] = sha; payload["context"] = Consts.TEST_CHECK_B; await mergeRequestsCollection.Insert(owner, repo, PR_ID, Consts.DEFAULT_BRANCH, true, checksAlreadyCompleted, sha); var mergePrCallId = await MockMergeGithubCallHelper.MockMergeCall(owner, repo, PR_ID); await SendWebhookRequest("status", JsonConvert.SerializeObject(payload)); var mergePrCall = await GetCall(mergePrCallId); var mergeRequest = await mergeRequestsCollection.Collection.Find(d => d["Owner"] == owner && d["Repo"] == repo && d["PrId"] == PR_ID).FirstAsync(); Assert.False(mergePrCall.HasBeenMade, "the pr shouldn't be merged"); }