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