Exemplo n.º 1
0
        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"]);
        }
Exemplo n.º 2
0
        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");
        }
Exemplo n.º 3
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);
        }
Exemplo n.º 4
0
        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");
        }