Example #1
0
        public async Task InvalidPayloadReturnsError()
        {
            var eh     = new TestHandler(GitHubClientMockFactory.CreateDefault().CreateFactory(), MemoryCacheMockFactory.Instance);
            var result = await eh.Execute("{a:1}");

            Assert.IsTrue(result.Result.Contains("payload error", System.StringComparison.InvariantCultureIgnoreCase));
        }
        public async Task PRNeedsMergeGradesAccepted(string commentText, bool gradesExpected, CommentType commentType)
        {
            var gitHubMock = GitHubClientMockFactory.CreateDefault()
                             .WithOrganizationMemberGet("abcabc", true)
                             .WithPullRequestGet(336882879, 24, GitHubMockData.CreatePullRequest(24, Octokit.ItemState.Open, mergeable: true))
                             .WithNeptunTxtContent("NEPT12");
            var gradeStoreMock = GradeStoreMockFactory.Create();

            var eh     = createHandler(commentType, gitHubMock.CreateFactory(), gradeStoreMock.Object);
            var result = await eh.Execute(getPayloadWithComment(commentType, commentText));

            Assert.IsTrue(result.Result.Contains("grade done", System.StringComparison.InvariantCultureIgnoreCase));
            gitHubMock.GitHubClientMock.Verify(c =>
                                               c.PullRequest.Review.Create(336882879, 24, It.IsAny <Octokit.PullRequestReviewCreate>()),
                                               Times.Once());
            gitHubMock.GitHubClientMock.Verify(c =>
                                               c.PullRequest.Merge(336882879, 24, It.IsAny <Octokit.MergePullRequest>()),
                                               Times.Once());

            gradeStoreMock.Verify(c =>
                                  c.StoreGrade("NEPT12", "org1/repo1", 24, "https://www.github.com/org1/repo1/pull/24", It.IsAny <string>(), @"https://github.com/org1/repo1/pull/1#issuecomment-821112111", It.IsAny <IReadOnlyCollection <double> >()),
                                  gradesExpected ? Times.Once() : Times.Never());
            gradeStoreMock.Verify(c =>
                                  c.ConfirmAutoGrade("NEPT12", "org1/repo1", 24, "https://www.github.com/org1/repo1/pull/24", It.IsAny <string>(), @"https://github.com/org1/repo1/pull/1#issuecomment-821112111"),
                                  gradesExpected ? Times.Never() : Times.Once());
        }
        public async Task ReviewCommentActionIsNotSubmitted()
        {
            var gitHubMock = GitHubClientMockFactory.CreateDefault();

            var payload = SampleData.PrReviewComment.Replace("submitted", "edited", System.StringComparison.InvariantCultureIgnoreCase);
            var eh      = new GradeCommandReviewCommentHandler(gitHubMock.CreateFactory(), GradeStoreMockFactory.Default, MemoryCacheMockFactory.Instance, NullLogger.Instance);
            var result  = await eh.Execute(payload);

            Assert.IsTrue(result.Result.Contains("not of interest", System.StringComparison.InvariantCultureIgnoreCase));
        }
Example #4
0
        public async Task EnabledAndHandlerCalled()
        {
            var gitHubMock = GitHubClientMockFactory.CreateDefault();
            var eh         = new TestHandler(gitHubMock.CreateFactory(), MemoryCacheMockFactory.Instance);
            var result     = await eh.Execute(SampleData.BranchCreate.Body);

            Assert.IsTrue(result.Result.Contains("TestHandler ok", System.StringComparison.InvariantCultureIgnoreCase));
            gitHubMock.GitHubClientMock.Verify(c =>
                                               c.Repository.Content.GetAllContentsByRef(It.IsAny <long>(), ".github/ahk-monitor.yml", It.IsAny <string>()),
                                               Times.Once());
        }
        public async Task IssueCommentActionIsNotCreated()
        {
            var gitHubMock = GitHubClientMockFactory.CreateDefault();

            var eh     = new GradeCommandIssueCommentHandler(gitHubMock.CreateFactory(), GradeStoreMockFactory.Default, MemoryCacheMockFactory.Instance, NullLogger.Instance);
            var result = await eh.Execute(SampleData.CommentDelete);

            Assert.IsTrue(result.Result.Contains("not of interest", System.StringComparison.InvariantCultureIgnoreCase));
            gitHubMock.GitHubClientMock.Verify(c =>
                                               c.PullRequest.Get(It.IsAny <long>(), It.IsAny <int>()),
                                               Times.Never());
        }
        public async Task CommentEditYieldsWarning()
        {
            var gitHubMock = GitHubClientMockFactory.CreateDefault();

            var eh     = new IssueCommentEditDeleteHandler(gitHubMock.CreateFactory(), MemoryCacheMockFactory.Instance, NullLogger.Instance);
            var result = await eh.Execute(SampleData.CommentEdit);

            Assert.IsTrue(result.Result.Contains("comment action resulting in warning", System.StringComparison.InvariantCultureIgnoreCase));
            gitHubMock.GitHubClientMock.Verify(c =>
                                               c.Issue.Comment.Create(283683683, 45, It.IsAny <string>()),
                                               Times.Once());
        }
Example #7
0
        public async Task ReviewerRequestedPRIsAssigned()
        {
            var gitHubMock = GitHubClientMockFactory.CreateDefault();

            var eh     = new PullRequestReviewToAssigneeHandler(gitHubMock.CreateFactory(), MemoryCacheMockFactory.Instance, NullLogger.Instance);
            var result = await eh.Execute(SampleData.PrReviewRequested);

            Assert.IsTrue(result.Result.Contains("assignee set", System.StringComparison.InvariantCultureIgnoreCase));
            gitHubMock.GitHubClientMock.Verify(c =>
                                               c.Issue.Assignee.AddAssignees("aaaaaaaa", "reporeporepo", 223, It.IsAny <Octokit.AssigneesUpdate>()),
                                               Times.Once());
        }
Example #8
0
        public async Task NotReviewRequestActionNotActionable()
        {
            var gitHubMock = GitHubClientMockFactory.CreateDefault();

            var eh     = new PullRequestReviewToAssigneeHandler(gitHubMock.CreateFactory(), MemoryCacheMockFactory.Instance, NullLogger.Instance);
            var result = await eh.Execute(SampleData.PrOpen);

            Assert.IsTrue(result.Result.Contains("not of interest", System.StringComparison.InvariantCultureIgnoreCase));
            gitHubMock.GitHubClientMock.Verify(c =>
                                               c.Issue.Assignee.AddAssignees(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <int>(), It.IsAny <Octokit.AssigneesUpdate>()),
                                               Times.Never());
        }
Example #9
0
        public async Task NoAhkMonitorConfigYaml1()
        {
            var gitHubMock = GitHubClientMockFactory.CreateCustom()
                             .WithAhkMonitorConfigYamlContent(c => c.ThrowsAsync(new Octokit.NotFoundException(string.Empty, System.Net.HttpStatusCode.NotFound)));

            var eh     = new TestHandler(gitHubMock.CreateFactory(), MemoryCacheMockFactory.Instance);
            var result = await eh.Execute(SampleData.BranchCreate.Body);

            Assert.IsTrue(result.Result.Contains("no ahk-monitor.yml or disabled", System.StringComparison.InvariantCultureIgnoreCase));
            gitHubMock.GitHubClientMock.Verify(c =>
                                               c.Repository.Content.GetAllContentsByRef(It.IsAny <long>(), ".github/ahk-monitor.yml", It.IsAny <string>()),
                                               Times.Once());
        }
Example #10
0
        public async Task AhkMonitorConfigYamlInvalid()
        {
            var gitHubMock = GitHubClientMockFactory.CreateCustom()
                             .WithAhkMonitorConfigYamlContent(c => c.ReturnsAsync(new[] { GitHubMockData.CreateAhkMonitorYamlFileContent("not valid content") }));

            var eh     = new TestHandler(gitHubMock.CreateFactory(), MemoryCacheMockFactory.Instance);
            var result = await eh.Execute(SampleData.BranchCreate.Body);

            Assert.IsTrue(result.Result.Contains("no ahk-monitor.yml or disabled", System.StringComparison.InvariantCultureIgnoreCase));
            gitHubMock.GitHubClientMock.Verify(c =>
                                               c.Repository.Content.GetAllContentsByRef(It.IsAny <long>(), ".github/ahk-monitor.yml", It.IsAny <string>()),
                                               Times.Once());
        }
        public async Task NoOtherPullRequestNoAction()
        {
            var gitHubMock = GitHubClientMockFactory.CreateDefault()
                             .WithPullRequestGetAll(c => c.ReturnsAsync(new Octokit.PullRequest[0]));

            var eh     = new PullRequestOpenDuplicateHandler(gitHubMock.CreateFactory(), MemoryCacheMockFactory.Instance, NullLogger.Instance);
            var result = await eh.Execute(SampleData.PrOpen);

            Assert.IsTrue(result.Result.Contains("no other PRs", System.StringComparison.InvariantCultureIgnoreCase));
            gitHubMock.GitHubClientMock.Verify(c =>
                                               c.Issue.Comment.Create(It.IsAny <long>(), It.IsAny <int>(), It.IsAny <string>()),
                                               Times.Never());
        }
        public async Task BranchProtectionRuleAppliedForFeatureBranch()
        {
            var gitHubMock = GitHubClientMockFactory.CreateDefault();

            var payload = SampleData.BranchCreate.Body
                          .Replace("\"ref\": \"master\"", "\"ref\": \"feature\"", System.StringComparison.InvariantCultureIgnoreCase);

            var eh     = new BranchProtectionRuleHandler(gitHubMock.CreateFactory(), MemoryCacheMockFactory.Instance, NullLogger.Instance);
            var result = await eh.Execute(payload);

            Assert.IsTrue(result.Result.Contains("branch protection rule applied", System.StringComparison.InvariantCultureIgnoreCase));
            gitHubMock.GitHubClientMock.Verify(c =>
                                               c.Repository.Branch.UpdateBranchProtection(339388815, "feature", It.IsAny <Octokit.BranchProtectionSettingsUpdate>()),
                                               Times.Once());
        }
        public async Task IssueCommentNoIssueInPayloadIgnored()
        {
            var gitHubMock = GitHubClientMockFactory.CreateDefault();

            var payload = SampleData.CommentEdit
                          .Replace("\"issue\": {", "\"aaaaa\": {", System.StringComparison.InvariantCultureIgnoreCase);

            var eh     = new GradeCommandIssueCommentHandler(gitHubMock.CreateFactory(), GradeStoreMockFactory.Default, MemoryCacheMockFactory.Instance, NullLogger.Instance);
            var result = await eh.Execute(payload);

            Assert.IsTrue(result.Result.Contains("no issue information", System.StringComparison.InvariantCultureIgnoreCase));
            gitHubMock.GitHubClientMock.Verify(c =>
                                               c.PullRequest.Get(It.IsAny <long>(), It.IsAny <int>()),
                                               Times.Never());
        }
Example #14
0
        public async Task NoReviewerRequestedDataInPayload()
        {
            var gitHubMock = GitHubClientMockFactory.CreateDefault();

            var payload = SampleData.PrReviewRequested
                          .Replace("requested_reviewers", "non_requested_reviewers", System.StringComparison.InvariantCultureIgnoreCase);

            var eh     = new PullRequestReviewToAssigneeHandler(gitHubMock.CreateFactory(), MemoryCacheMockFactory.Instance, NullLogger.Instance);
            var result = await eh.Execute(payload);

            Assert.IsTrue(result.Result.Contains("no requested reviewer", System.StringComparison.InvariantCultureIgnoreCase));
            gitHubMock.GitHubClientMock.Verify(c =>
                                               c.Issue.Assignee.AddAssignees(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <int>(), It.IsAny <Octokit.AssigneesUpdate>()),
                                               Times.Never());
        }
        public async Task WorkflowRunsBelowLimit(int workflowRuns)
        {
            var gitHubMock = GitHubClientMockFactory.CreateDefault();

            var payload = getPayload();
            var gh      = gitHubMock.WithWorkflowRunsCount("aabbcc", "reporep", "someone", workflowRuns).CreateFactory();

            var eh     = new ActionWorkflowRunHandler(gh, MemoryCacheMockFactory.Instance, NullLogger.Instance);
            var result = await eh.Execute(payload);

            Assert.IsTrue(result.Result.Contains("workflow_run ok, has less then threshold", System.StringComparison.InvariantCultureIgnoreCase));
            gitHubMock.GitHubClientMock.Verify(c =>
                                               c.Issue.Comment.Create(It.IsAny <long>(), It.IsAny <int>(), It.IsAny <string>()),
                                               Times.Never());
        }
        public async Task BranchProtectionRuleNotAppliedIfNotBranch()
        {
            var gitHubMock = GitHubClientMockFactory.CreateDefault();

            var payload = SampleData.BranchCreate.Body
                          .Replace("\"ref_type\": \"branch\"", "\"ref_type\": \"aaaaa\"", System.StringComparison.InvariantCultureIgnoreCase);

            var eh     = new BranchProtectionRuleHandler(gitHubMock.CreateFactory(), MemoryCacheMockFactory.Instance, NullLogger.Instance);
            var result = await eh.Execute(payload);

            Assert.IsTrue(result.Result.Contains("not of interest", System.StringComparison.InvariantCultureIgnoreCase));
            gitHubMock.GitHubClientMock.Verify(c =>
                                               c.Repository.Branch.UpdateBranchProtection(It.IsAny <long>(), It.IsAny <string>(), It.IsAny <Octokit.BranchProtectionSettingsUpdate>()),
                                               Times.Never());
        }
Example #17
0
        public async Task NeptunFileNotFound()
        {
            var gitHubMock = GitHubClientMockFactory.CreateCustom()
                             .WithNeptunTxtContent(c => c.ThrowsAsync(new Octokit.NotFoundException(string.Empty, System.Net.HttpStatusCode.NotFound)));

            var eh = new TestHandler(gitHubMock.CreateFactory(), MemoryCacheMockFactory.Instance);
            await eh.Execute(SampleData.BranchCreate.Body);

            var result = await eh.GetNeptunForTest();

            Assert.IsNull(result);
            gitHubMock.GitHubClientMock.Verify(c =>
                                               c.Repository.Content.GetAllContentsByRef(It.IsAny <long>(), "neptun.txt", It.IsAny <string>()),
                                               Times.Once());
        }
Example #18
0
        public async Task NeptunFileReadCorrectly(string textFileValue, string expected)
        {
            var gitHubMock = GitHubClientMockFactory.CreateCustom()
                             .WithNeptunTxtContent(textFileValue);

            var eh = new TestHandler(gitHubMock.CreateFactory(), MemoryCacheMockFactory.Instance);
            await eh.Execute(SampleData.BranchCreate.Body);

            var result = await eh.GetNeptunForTest();

            Assert.AreEqual(expected, result);
            gitHubMock.GitHubClientMock.Verify(c =>
                                               c.Repository.Content.GetAllContentsByRef(It.IsAny <long>(), "neptun.txt", It.IsAny <string>()),
                                               Times.Once());
        }
        public async Task PullRequestActionIsNotOpenIgnored()
        {
            var gitHubMock = GitHubClientMockFactory.CreateDefault();

            var payload = SampleData.PrOpen
                          .Replace("\"action\": \"opened\"", "\"action\": \"aaaa\"", System.StringComparison.InvariantCultureIgnoreCase);

            var eh     = new PullRequestOpenDuplicateHandler(gitHubMock.CreateFactory(), MemoryCacheMockFactory.Instance, NullLogger.Instance);
            var result = await eh.Execute(payload);

            Assert.IsTrue(result.Result.Contains("not of interest", System.StringComparison.InvariantCultureIgnoreCase));
            gitHubMock.GitHubClientMock.Verify(c =>
                                               c.Issue.Comment.Create(It.IsAny <long>(), It.IsAny <int>(), It.IsAny <string>()),
                                               Times.Never());
        }
        public async Task CommentEditAllowedForOwnComment()
        {
            var gitHubMock = GitHubClientMockFactory.CreateDefault();

            var payload = SampleData.CommentEdit
                          .Replace("\"login\": \"github-actions[bot]\"", "\"login\": \"aaaaaa\"", System.StringComparison.InvariantCultureIgnoreCase)
                          .Replace("\"login\": \"senderlogin\"", "\"login\": \"aaaaaa\"", System.StringComparison.InvariantCultureIgnoreCase);

            var eh     = new IssueCommentEditDeleteHandler(gitHubMock.CreateFactory(), MemoryCacheMockFactory.Instance, NullLogger.Instance);
            var result = await eh.Execute(payload);

            Assert.IsTrue(result.Result.Contains("referencing own comment", System.StringComparison.InvariantCultureIgnoreCase));
            gitHubMock.GitHubClientMock.Verify(c =>
                                               c.Issue.Comment.Create(It.IsAny <long>(), It.IsAny <int>(), It.IsAny <string>()),
                                               Times.Never());
        }
        public async Task BranchProtectionRuleAppliedForDefaultBranch(string defaultBranchName)
        {
            var gitHubMock = GitHubClientMockFactory.CreateDefault();

            var payload = SampleData.BranchCreate.Body
                          .Replace("\"ref\": \"master\"", $"\"ref\": \"{defaultBranchName}\"", System.StringComparison.InvariantCultureIgnoreCase)
                          .Replace("\"master_branch\": \"master\"", $"\"master_branch\": \"{defaultBranchName}\"", System.StringComparison.InvariantCultureIgnoreCase)
                          .Replace("\"default_branch\": \"master\"", $"\"default_branch\": \"{defaultBranchName}\"", System.StringComparison.InvariantCultureIgnoreCase);

            var eh     = new BranchProtectionRuleHandler(gitHubMock.CreateFactory(), MemoryCacheMockFactory.Instance, NullLogger.Instance);
            var result = await eh.Execute(payload);

            Assert.IsTrue(result.Result.Contains("branch protection rule applied", System.StringComparison.InvariantCultureIgnoreCase));
            gitHubMock.GitHubClientMock.Verify(c =>
                                               c.Repository.Branch.UpdateBranchProtection(339388815, defaultBranchName,
                                                                                          It.Is <Octokit.BranchProtectionSettingsUpdate>(val => val.RequiredPullRequestReviews.RequiredApprovingReviewCount > 0)),
                                               Times.Once());
        }
        public async Task WorkflowRunsIgnoreLimitForOrgMember()
        {
            var gitHubMock = GitHubClientMockFactory.CreateDefault();

            var payload = getPayload(sender: "orgmember");
            var gh      = gitHubMock
                          .WithOrganizationMemberGet("orgmember", true)
                          .WithWorkflowRunsCount("aabbcc", "reporep", "orgmember", 999)
                          .CreateFactory();

            var eh     = new ActionWorkflowRunHandler(gh, MemoryCacheMockFactory.Instance, NullLogger.Instance);
            var result = await eh.Execute(payload);

            Assert.IsTrue(result.Result.Contains("workflow_run ok, not triggered by student", System.StringComparison.InvariantCultureIgnoreCase));
            gitHubMock.GitHubClientMock.Verify(c =>
                                               c.Issue.Comment.Create(283462325, 2, It.IsAny <string>()),
                                               Times.Never());
        }
        public async Task OtherClosedPullRequestYieldsWarning()
        {
            var gitHubMock = GitHubClientMockFactory.CreateDefault()
                             .WithPullRequestGetAll(c => c.ReturnsAsync(new[]
            {
                GitHubMockData.CreatePullRequest(189, Octokit.ItemState.Open, 556677),
                GitHubMockData.CreatePullRequest(23, Octokit.ItemState.Closed, 556677),
            }))
                             .WithIssueEventGetAll(c => c.ReturnsAsync(new[] { GitHubMockData.CreateIssueEvent(Octokit.EventInfoState.Closed, 444444) }));

            var eh     = new PullRequestOpenDuplicateHandler(gitHubMock.CreateFactory(), MemoryCacheMockFactory.Instance, NullLogger.Instance);
            var result = await eh.Execute(SampleData.PrOpen);

            Assert.IsTrue(result.Result.Contains("already closed PRs", System.StringComparison.InvariantCultureIgnoreCase));
            gitHubMock.GitHubClientMock.Verify(c =>
                                               c.Issue.Comment.Create(339316008, 189, It.IsAny <string>()),
                                               Times.Once());
        }
        public async Task CommandNotRecognized(string commentText, CommentType commentType)
        {
            var gitHubMock     = GitHubClientMockFactory.CreateDefault();
            var gradeStoreMock = GradeStoreMockFactory.Create();

            var eh     = createHandler(commentType, gitHubMock.CreateFactory(), gradeStoreMock.Object);
            var result = await eh.Execute(getPayloadWithComment(commentType, commentText));

            Assert.IsTrue(result.Result.Contains("not recognized as command", System.StringComparison.InvariantCultureIgnoreCase));
            gitHubMock.GitHubClientMock.Verify(c =>
                                               c.PullRequest.Get(It.IsAny <long>(), It.IsAny <int>()),
                                               Times.Never());
            gradeStoreMock.Verify(c =>
                                  c.StoreGrade(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <int>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <IReadOnlyCollection <double> >()),
                                  Times.Never());
            gradeStoreMock.Verify(c =>
                                  c.ConfirmAutoGrade(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <int>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>()),
                                  Times.Never());
        }
        public async Task PRAlreadyClosedGradesAccepted(CommentType commentType)
        {
            var gitHubMock = GitHubClientMockFactory.CreateDefault()
                             .WithOrganizationMemberGet("abcabc", true)
                             .WithPullRequestGet(336882879, 24, GitHubMockData.CreatePullRequest(24, Octokit.ItemState.Closed, mergeable: false));
            var gradeStoreMock = GradeStoreMockFactory.Create();

            var eh     = createHandler(commentType, gitHubMock.CreateFactory(), gradeStoreMock.Object);
            var result = await eh.Execute(getPayloadWithComment(commentType, @"/ahk ok"));

            Assert.IsTrue(result.Result.Contains("grade done", System.StringComparison.InvariantCultureIgnoreCase));
            gitHubMock.GitHubClientMock.Verify(c =>
                                               c.PullRequest.Merge(It.IsAny <long>(), It.IsAny <int>(), It.IsAny <Octokit.MergePullRequest>()),
                                               Times.Never());
            gradeStoreMock.Verify(c =>
                                  c.StoreGrade(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <int>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <IReadOnlyCollection <double> >()),
                                  Times.Never());
            gradeStoreMock.Verify(c =>
                                  c.ConfirmAutoGrade("ABC123", "org1/repo1", 24, "https://www.github.com/org1/repo1/pull/24", It.IsAny <string>(), @"https://github.com/org1/repo1/pull/1#issuecomment-821112111"),
                                  Times.Once());
        }
        public async Task WorkflowRunsReachedWarningLimit()
        {
            var gitHubMock = GitHubClientMockFactory.CreateDefault();

            var payload = getPayload();
            var gh      = gitHubMock
                          .WithWorkflowRunsCount("aabbcc", "reporep", "someone", 6)
                          .WithPullRequestGetAll(c => c.ReturnsAsync(new[]
            {
                GitHubMockData.CreatePullRequest(1, Octokit.ItemState.Open, 111),
                GitHubMockData.CreatePullRequest(2, Octokit.ItemState.Open, 111),
            }))
                          .CreateFactory();

            var eh     = new ActionWorkflowRunHandler(gh, MemoryCacheMockFactory.Instance, NullLogger.Instance);
            var result = await eh.Execute(payload);

            Assert.IsTrue(result.Result.Contains("workflow_run warning, threshold exceeded", System.StringComparison.InvariantCultureIgnoreCase));
            gitHubMock.GitHubClientMock.Verify(c =>
                                               c.Issue.Comment.Create(283462325, 2, It.IsAny <string>()),
                                               Times.Once());
        }
        public async Task ActorIsNotOrgMemberCommandNotAllowed(CommentType commentType)
        {
            var gitHubMock = GitHubClientMockFactory.CreateDefault()
                             .WithOrganizationMemberGet("abcabc", false);
            var gradeStoreMock = GradeStoreMockFactory.Create();

            var eh     = createHandler(commentType, gitHubMock.CreateFactory(), gradeStoreMock.Object);
            var result = await eh.Execute(getPayloadWithComment(commentType, @"/ahk ok"));

            Assert.IsTrue(result.Result.Contains("not allowed for user", System.StringComparison.InvariantCultureIgnoreCase));
            gitHubMock.GitHubClientMock.Verify(c =>
                                               c.PullRequest.Merge(336882879, 24, It.IsAny <Octokit.MergePullRequest>()),
                                               Times.Never());
            gitHubMock.GitHubClientMock.Verify(c =>
                                               c.Organization.Member.CheckMember("org1", "abcabc"),
                                               Times.Once());
            gradeStoreMock.Verify(c =>
                                  c.StoreGrade(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <int>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <IReadOnlyCollection <double> >()),
                                  Times.Never());
            gradeStoreMock.Verify(c =>
                                  c.ConfirmAutoGrade(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <int>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>()),
                                  Times.Never());
        }