コード例 #1
0
        public async Task PrMergeCommandPermissionsEnforced()
        {
            var context = new DefaultHttpContext();
            var request = context.Request;
            var sc      = new ServiceCollection();

            sc.AddSingleton(sp => new PullRequestCommentCommandHandler(githubClientFactory.Object));
            var serviceProvider = sc.BuildServiceProvider();
            var builder         = new EventDispatchConfigBuilder(sc)
                                  .Add <PullRequestCommentCommandHandler>(PullRequestCommentCommandHandler.GitHubWebhookEventName);
            var dispatcher = new EventDispatchService(serviceProvider, builder);
            var function   = new GitHubMonitorFunction(dispatcher, GetConfig());

            ParseRequestFile(
                await File.ReadAllTextAsync(Path.Combine(Directory.GetCurrentDirectory(), @"pr_merge_command_permissions_enforced.txt")), request);
            SetupAhkMonitorYml();

            var response = (ObjectResult)await function.Run(request, logger);

            Assert.IsNotNull(response);
            Assert.IsInstanceOfType(response, typeof(OkObjectResult));
            var webhookResult = response.Value as WebhookResult;

            Assert.IsNotNull(webhookResult);
            Assert.IsTrue(webhookResult.Messages.Any(m =>
                                                     m.Equals("PullRequestCommentCommandHandler -> payload error: aabbcc is not allowed to execute the command: +ok")));
        }
コード例 #2
0
        public async Task PrMergeCommand()
        {
            var context = new DefaultHttpContext();
            var request = context.Request;
            var sc      = new ServiceCollection();

            sc.AddSingleton(sp => new PullRequestCommentCommandHandler(githubClientFactory.Object));
            var serviceProvider = sc.BuildServiceProvider();
            var builder         = new EventDispatchConfigBuilder(sc)
                                  .Add <PullRequestCommentCommandHandler>(PullRequestCommentCommandHandler.GitHubWebhookEventName);
            var dispatcher = new EventDispatchService(serviceProvider, builder);
            var function   = new GitHubMonitorFunction(dispatcher, GetConfig());

            ParseRequestFile(
                await File.ReadAllTextAsync(Path.Combine(Directory.GetCurrentDirectory(), @"pr_merge_command.txt")), request);
            SetupAhkMonitorYml();
            githubClient.Setup(x => x.PullRequest.Merge(RepositoryId, 2, It.IsAny <MergePullRequest>()))
            .ReturnsAsync(new PullRequestMerge("sha", true, "msg"));

            var response = (ObjectResult)await function.Run(request, logger);

            Assert.IsNotNull(response);
            Assert.IsInstanceOfType(response, typeof(OkObjectResult));
            var webhookResult = response.Value as WebhookResult;

            Assert.IsNotNull(webhookResult);
            githubClient.Verify(x => x.PullRequest.Merge(RepositoryId, 2, It.IsAny <MergePullRequest>()), Times.Once);
            Assert.IsTrue(webhookResult.Messages.Any(m =>
                                                     m.Equals("PullRequestCommentCommandHandler -> action performed: merged pull request #2 pr1")));
        }
コード例 #3
0
        public async Task PrInvalidCommandRejected()
        {
            var context = new DefaultHttpContext();
            var request = context.Request;
            var sc      = new ServiceCollection();

            sc.AddSingleton(sp => new PullRequestCommentCommandHandler(githubClientFactory.Object));
            var serviceProvider = sc.BuildServiceProvider();
            var builder         = new EventDispatchConfigBuilder(sc)
                                  .Add <PullRequestCommentCommandHandler>(PullRequestCommentCommandHandler.GitHubWebhookEventName);
            var dispatcher = new EventDispatchService(serviceProvider, builder);
            var function   = new GitHubMonitorFunction(dispatcher, GetConfig());

            ParseRequestFile(
                await File.ReadAllTextAsync(Path.Combine(Directory.GetCurrentDirectory(), @"pr_invalid_command_rejected.txt")), request);
            SetupAhkMonitorYml();

            var response = (ObjectResult)await function.Run(request, logger);

            Assert.IsNotNull(response);
            Assert.IsInstanceOfType(response, typeof(OkObjectResult));
            var webhookResult = response.Value as WebhookResult;

            Assert.IsNotNull(webhookResult);
            Assert.IsTrue(webhookResult.Messages.Any(m =>
                                                     m.Equals("PullRequestCommentCommandHandler -> no action needed: invalid command: +invalid_command_aksdjalsk")));
        }
コード例 #4
0
        public async Task CommentEdited()
        {
            var context = new DefaultHttpContext();
            var request = context.Request;
            var sc      = new ServiceCollection();

            sc.AddSingleton(sp => new IssueCommentEditDeleteHandler(githubClientFactory.Object));
            var serviceProvider = sc.BuildServiceProvider();
            var builder         = new EventDispatchConfigBuilder(sc)
                                  .Add <IssueCommentEditDeleteHandler>(IssueCommentEditDeleteHandler.GitHubWebhookEventName);
            var dispatcher = new EventDispatchService(serviceProvider, builder);
            var function   = new GitHubMonitorFunction(dispatcher, GetConfig());

            ParseRequestFile(
                await File.ReadAllTextAsync(Path.Combine(Directory.GetCurrentDirectory(), @"comment_edited.txt")), request);
            githubClient.Setup(x => x.Issue.Comment.Create(RepositoryId, 1, "comment protection warning")).Verifiable();
            SetupAhkMonitorYml();

            var response = (ObjectResult)await function.Run(request, logger);

            Assert.IsNotNull(response);
            Assert.IsInstanceOfType(response, typeof(OkObjectResult));
            var webhookResult = response.Value as WebhookResult;

            Assert.IsNotNull(webhookResult);
            githubClient.Verify(x => x.Issue.Comment.Create(RepositoryId, 1, "comment protection warning"), Times.Once);
            Assert.IsTrue(webhookResult.Messages.Any(m => m.Equals("IssueCommentEditDeleteHandler -> action performed: comment action resulting in warning")));
        }
コード例 #5
0
        public async Task CommentEditedOwn()
        {
            var context = new DefaultHttpContext();
            var request = context.Request;
            var sc      = new ServiceCollection();

            sc.AddSingleton(sp => new IssueCommentEditDeleteHandler(githubClientFactory.Object));
            var serviceProvider = sc.BuildServiceProvider();
            var builder         = new EventDispatchConfigBuilder(sc)
                                  .Add <IssueCommentEditDeleteHandler>(IssueCommentEditDeleteHandler.GitHubWebhookEventName);
            var dispatcher = new EventDispatchService(serviceProvider, builder);
            var function   = new GitHubMonitorFunction(dispatcher, GetConfig());

            ParseRequestFile(
                await File.ReadAllTextAsync(Path.Combine(Directory.GetCurrentDirectory(), @"comment_edited_own.txt")), request);
            SetupAhkMonitorYml();

            var response = (ObjectResult)await function.Run(request, logger);

            Assert.IsNotNull(response);
            Assert.IsInstanceOfType(response, typeof(OkObjectResult));
            var webhookResult = response.Value as WebhookResult;

            Assert.IsNotNull(webhookResult);
            Assert.IsTrue(webhookResult.Messages.Any(m =>
                                                     m.Equals("IssueCommentEditDeleteHandler -> no action needed: comment action edited by abcabc allowed, referencing own comment")));
        }
コード例 #6
0
        public async Task BranchCreate()
        {
            var context = new DefaultHttpContext();
            var request = context.Request;
            var sc      = new ServiceCollection();

            sc.AddSingleton(sp => new BranchProtectionRuleHandler(githubClientFactory.Object));
            var serviceProvider = sc.BuildServiceProvider();
            var builder         = new EventDispatchConfigBuilder(sc)
                                  .Add <BranchProtectionRuleHandler>(BranchProtectionRuleHandler.GitHubWebhookEventName);
            var dispatcher = new EventDispatchService(serviceProvider, builder);
            var function   = new GitHubMonitorFunction(dispatcher, GetConfig());

            ParseRequestFile(
                await File.ReadAllTextAsync(Path.Combine(Directory.GetCurrentDirectory(), @"branch_create.txt")), request);
            githubClient.Setup(x =>
                               x.Repository.Branch.UpdateBranchProtection(RepositoryId, "master",
                                                                          It.IsAny <BranchProtectionSettingsUpdate>()))
            .Verifiable();
            SetupAhkMonitorYml();

            var response = (ObjectResult)await function.Run(request, logger);

            Assert.IsNotNull(response);
            Assert.IsInstanceOfType(response, typeof(OkObjectResult));
            var webhookResult = response.Value as WebhookResult;

            Assert.IsNotNull(webhookResult);
            githubClient.Verify(x => x.Repository.Branch.UpdateBranchProtection(RepositoryId, "master", It.IsAny <BranchProtectionSettingsUpdate>()), Times.Once);
            Assert.IsTrue(webhookResult.Messages.Any(m => m.Equals("BranchProtectionRuleHandler -> action performed: branch protection rule applied")));
        }
コード例 #7
0
        public async Task PrOpenedNoDuplicates()
        {
            var context = new DefaultHttpContext();
            var request = context.Request;
            var sc      = new ServiceCollection();

            sc.AddSingleton(sp => new PullRequestOpenDuplicateHandler(githubClientFactory.Object));
            var serviceProvider = sc.BuildServiceProvider();
            var builder         = new EventDispatchConfigBuilder(sc)
                                  .Add <PullRequestOpenDuplicateHandler>(PullRequestOpenDuplicateHandler.GitHubWebhookEventName);
            var dispatcher = new EventDispatchService(serviceProvider, builder);
            var function   = new GitHubMonitorFunction(dispatcher, GetConfig());

            ParseRequestFile(
                await File.ReadAllTextAsync(Path.Combine(Directory.GetCurrentDirectory(), @"pr_opened.txt")), request);
            githubClient.Setup(x => x.PullRequest.GetAllForRepository(RepositoryId)).ReturnsAsync(new List <PullRequest>().AsReadOnly());
            githubClient.Setup(x => x.PullRequest.GetAllForRepository(RepositoryId, It.IsAny <PullRequestRequest>())).ReturnsAsync(new List <PullRequest>().AsReadOnly());
            SetupAhkMonitorYml();

            var response = (ObjectResult)await function.Run(request, logger);

            Assert.IsNotNull(response);
            Assert.IsInstanceOfType(response, typeof(OkObjectResult));
            var webhookResult = response.Value as WebhookResult;

            Assert.IsNotNull(webhookResult);
            Assert.IsTrue(webhookResult.Messages.Any(m => m.Equals("PullRequestOpenDuplicateHandler -> no action needed: pull request open is ok, there are no other PRs")));
        }
コード例 #8
0
        public async Task DispatcherCallsAllEventHandlers()
        {
            var services = new ServiceCollection();
            var config   = new EventDispatchConfigBuilder(services)
                           .Add <EventHandler1A>("event1")
                           .Add <EventHandler1B>("event1")
                           .Add <EventHandler2>("event2");

            var service = new EventDispatchService(services.BuildServiceProvider(), config);
            await service.Process("event1", "dummy request", new WebhookResult(), NullLogger.Instance);

            Assert.IsTrue(EventHandler1A.Invoked);
            Assert.IsTrue(EventHandler1A.Invoked);
            Assert.IsFalse(EventHandler2.Invoked);
        }
コード例 #9
0
        public async Task PrOpenedWithDuplicates()
        {
            var context = new DefaultHttpContext();
            var request = context.Request;
            var sc      = new ServiceCollection();

            sc.AddSingleton(sp => new PullRequestOpenDuplicateHandler(githubClientFactory.Object));
            var serviceProvider = sc.BuildServiceProvider();
            var builder         = new EventDispatchConfigBuilder(sc)
                                  .Add <PullRequestOpenDuplicateHandler>(PullRequestOpenDuplicateHandler.GitHubWebhookEventName);
            var dispatcher = new EventDispatchService(serviceProvider, builder);
            var function   = new GitHubMonitorFunction(dispatcher, GetConfig());

            ParseRequestFile(
                await File.ReadAllTextAsync(Path.Combine(Directory.GetCurrentDirectory(), @"pr_opened.txt")), request);
            var prs = new List <PullRequest>()
            {
                new PullRequest(5748988117, "", "", "", "", "", "", "", 1, ItemState.Open, "", "", DateTimeOffset.Now,
                                DateTimeOffset.Now, null, null, new GitReference(), new GitReference(), new User(), new User(),
                                new List <User>().AsReadOnly(), false, true, MergeableState.Clean, null, "", 0, 0, 0, 0, 0,
                                new Milestone(), false, true, new List <User>().AsReadOnly(), new List <Team>().AsReadOnly(),
                                new List <Label>().AsReadOnly()),
                new PullRequest(5748988118, "", "", "", "", "", "", "", 2, ItemState.Open, "", "", DateTimeOffset.Now,
                                DateTimeOffset.Now, null, null, new GitReference(), new GitReference(), new User(), new User(),
                                new List <User>().AsReadOnly(), false, true, MergeableState.Clean, null, "", 0, 0, 0, 0, 0,
                                new Milestone(), false, true, new List <User>().AsReadOnly(), new List <Team>().AsReadOnly(),
                                new List <Label>().AsReadOnly())
            }.AsReadOnly();

            githubClient.Setup(x => x.PullRequest.GetAllForRepository(RepositoryId)).ReturnsAsync(prs);
            githubClient.Setup(x => x.PullRequest.GetAllForRepository(RepositoryId, It.IsAny <PullRequestRequest>())).ReturnsAsync(prs);
            githubClient.Setup(x =>
                               x.Issue.Comment.Create(It.IsAny <int>(), It.IsAny <int>(), It.IsAny <string>())).Verifiable();
            SetupAhkMonitorYml(false);

            var response = (ObjectResult)await function.Run(request, logger);

            Assert.IsNotNull(response);
            Assert.IsInstanceOfType(response, typeof(OkObjectResult));
            var webhookResult = response.Value as WebhookResult;

            Assert.IsNotNull(webhookResult);
            githubClient.Verify(x => x.Issue.Comment.Create(RepositoryId, 1, "multiple PR protection warning"), Times.Never);
            githubClient.Verify(x => x.Issue.Comment.Create(RepositoryId, 2, "multiple PR protection warning"), Times.Once);
            Assert.IsTrue(webhookResult.Messages.Any(m => m.Equals("PullRequestOpenDuplicateHandler -> action performed: pull request open handled with multiple open PRs; pull request open is ok, there are no other closed PRs")));
        }
コード例 #10
0
        public async Task EventDispatchServiceTest()
        {
            var sc = new ServiceCollection();

            sc.AddSingleton <TestHandler>();
            sc.AddSingleton <Test2Handler>();
            var serviceProvider = sc.BuildServiceProvider();
            var builder         = new EventDispatchConfigBuilder(sc)
                                  .Add <TestHandler>("invoke_test")
                                  .Add <Test2Handler>("test2");
            var dispatcher = new EventDispatchService(serviceProvider, builder);

            var result1 = new WebhookResult();
            await dispatcher.Process("invoke_test", string.Empty, result1);

            var result2 = new WebhookResult();
            await dispatcher.Process("test2", "test request body", result2);

            Assert.IsTrue(result1.Messages.First().Contains("Test"));
            Assert.IsTrue(result2.Messages.First().Contains("test request body"));
        }