Example #1
0
        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"]);
        }
Example #2
0
        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);
        }