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)); }
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()); }
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()); }
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()); }
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()); }
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()); }
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()); }
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()); }
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()); }