Ejemplo n.º 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"]);
        }
Ejemplo n.º 2
0
        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");
        }
Ejemplo n.º 3
0
        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"]);
        }
Ejemplo n.º 4
0
        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");
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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);
        }
Ejemplo n.º 7
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);
        }
Ejemplo n.º 8
0
        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");
        }
Ejemplo n.º 9
0
        public async Task ActionIsCompleted_ConclusionIsSuccess_PendingReviews_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, true, checksAlreadyCompleted, sha);

            var mergePrCallId = await MockMergeGithubCallHelper.MockMergeCall(owner, repo, PR_ID);

            var createCommentCallId = await MockGithubCall("post", $"{IssueUrlFor(owner, repo, PR_ID)}/comments", "ok", false);

            var requestedReviewsMockedResponse = new
            {
                teams = Array.Empty <object>(),
                users = new[] { new { login = "******", id = 3 } }
            };
            await MockReviewGithubCallHelper.MockReviewsResponses(JsonConvert.SerializeObject(requestedReviewsMockedResponse), "[]", 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");
        }
Ejemplo n.º 10
0
        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");
        }
Ejemplo n.º 11
0
        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);
        }
Ejemplo n.º 12
0
        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);
        }
Ejemplo n.º 13
0
        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");
        }
Ejemplo n.º 14
0
        public async Task ReceievePullRequestReviewChangesRequestedEvent_AllTestsPassed_DoNothing()
        {
            var owner = Guid.NewGuid().ToString();
            var repo  = 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;
            payload["review"]["state"] = "CHANGES_REQUESTED";

            // Mock github
            var mergePrCallId = await MockMergeGithubCallHelper.MockMergeCall(owner, repo, PR_ID);

            // insert to DB with all checks passed
            await checkListsCollection.InsertWithDefaultChecks(owner, repo);

            await mergeRequestsCollection.InsertWithTestChecksSuccessAndMergeCommand(owner, repo, PR_ID);

            await MockReviewGithubCallHelper.MockAllReviewsPassedResponses(owner, repo, PR_ID);

            // ACTION
            await SendWebhookRequest("pull_request_review", JsonConvert.SerializeObject(payload));

            // ASSERT
            var mergePrCall = await GetCall(mergePrCallId);

            Assert.False(mergePrCall.HasBeenMade, "pr should not have been merged");

            var mergeRequest = await mergeRequestsCollection.Collection.Find(d => d["Owner"] == owner && d["Repo"] == repo && d["PrId"] == PR_ID).FirstAsync();

            Assert.NotNull(mergeRequest);
        }