public EnsurePullDogDatabaseInstanceCommand( PullDogPullRequest pullRequest, ConfigurationFile configuration) { this.PullRequest = pullRequest; this.Configuration = configuration; }
public UpsertPullRequestCommentCommand( PullDogPullRequest pullRequest, string content) { this.PullRequest = pullRequest; this.Content = content; }
public async Task Handle_ConfigurationFileOverrideNotPresent_ReturnsOriginalConfiguration() { //Arrange var fakePullDogPullRequest = new PullDogPullRequest() { ConfigurationOverride = null }; var fakeConfiguration = new ConfigurationFile(new List <string>()); var fakePullDogFileCollectorFactory = Substitute.For <IPullDogFileCollectorFactory>(); var fakePullDogFileCollector = await fakePullDogFileCollectorFactory.CreateAsync(fakePullDogPullRequest); fakePullDogFileCollector .GetConfigurationFileAsync() .Returns(fakeConfiguration); var handler = new GetConfigurationForPullRequestQueryHandler( fakePullDogFileCollectorFactory); //Act var configuration = await handler.Handle( new GetConfigurationForPullRequestQuery( fakePullDogPullRequest), default); //Assert Assert.AreSame(fakeConfiguration, configuration); }
public async Task Handle_NoExistingClusterInstanceFoundAndPaidUser_ReturnsNewPersistedInstanceWithProperValuesAndExpiry() { //Arrange var user = new User() { StripeCustomerId = "dummy" }; var pullDogPullRequest = new PullDogPullRequest() { Handle = "dummy", PullDogRepository = new PullDogRepository() { Handle = "dummy", PullDogSettings = new PullDogSettings() { User = user, PoolSize = 1, PlanId = "dummy", EncryptedApiKey = Array.Empty <byte>() } } }; var fakeMediator = Substitute.For <IMediator>(); fakeMediator .Send(Arg.Is <GetAvailableClusterFromPullRequestQuery>(args => args.PullRequest == pullDogPullRequest)) .Returns(new Cluster() { Name = "pull-dog", User = user }); await using var environment = await IntegrationTestEnvironment.CreateAsync(new EnvironmentSetupOptions () { IocConfiguration = services => services.AddSingleton(fakeMediator) }); //Act var instance = await environment.Mediator.Send(new EnsurePullDogDatabaseInstanceCommand( pullDogPullRequest, new ConfigurationFile(new List <string>()) { Expiry = TimeSpan.FromDays(30) })); //Assert Assert.IsNotNull(instance); await environment.WithFreshDataContext(async dataContext => { var refreshedInstance = await dataContext .Instances .SingleAsync(); Assert.AreEqual(instance.Id, refreshedInstance.Id); Assert.IsTrue(instance.ExpiresAtUtc > DateTime.UtcNow.AddDays(7)); }); }
public PullRequestDetails GetPullRequestDetails(PullDogPullRequest pullRequest) { var repository = GetTargetRepository(); return(new PullRequestDetails( repository.FullName, $"[{repository.FullName}: PR #{pullRequest.Handle}](https://github.com/{repository.FullName}/pulls?q=is%3Apr+{pullRequest.Handle})", $"#{pullRequest.Handle}")); }
public async Task <IPullDogFileCollector> CreateAsync(PullDogPullRequest pullRequest) { var client = await factory.CreateAsync(pullRequest); return(new PullDogFileCollector( client, dockerComposeParserFactory, logger)); }
private static bool HasExceededPoolSize( PullDogPullRequest originPullRequest, IEnumerable <PullDogPullRequest> offendingPullRequests) { var offendingPullRequestCount = offendingPullRequests.Count(pr => pr.Handle != originPullRequest.Handle); var settings = originPullRequest.PullDogRepository.PullDogSettings; return(offendingPullRequestCount > 0 && offendingPullRequestCount >= settings.PoolSize); }
public WebhookPayloadContext( WebhookPayload payload, PullDogSettings settings, PullDogRepository repository, PullDogPullRequest pullRequest) { this.Payload = payload; this.Settings = settings; this.Repository = repository; this.PullRequest = pullRequest; }
public async Task Handle_PullRequestGiven_ConfigurationOverrideUpdatedOnPullRequest() { //Arrange await using var environment = await IntegrationTestEnvironment.CreateAsync(); var pullRequest = new PullDogPullRequest() { Handle = "some-handle", PullDogRepository = new PullDogRepository() { Handle = "dummy", PullDogSettings = new PullDogSettings() { EncryptedApiKey = Array.Empty <byte>(), PlanId = "dummy", User = new User() { StripeCustomerId = "dummy" } } } }; await environment.WithFreshDataContext(async dataContext => { await dataContext.PullDogPullRequests.AddAsync(pullRequest); }); //Act await environment.Mediator.Send(new OverrideConfigurationForPullRequestCommand( pullRequest.Id, new ConfigurationFileOverride() { BuildArguments = new Dictionary <string, string>() { { "foo", "bar" } } })); //Assert await environment.WithFreshDataContext(async dataContext => { var refreshedPullRequest = await dataContext .PullDogPullRequests .SingleAsync(); Assert.IsNotNull(refreshedPullRequest); Assert.AreEqual("some-handle", refreshedPullRequest.Handle); Assert.AreEqual("bar", refreshedPullRequest.ConfigurationOverride?.BuildArguments["foo"]); }); }
public async Task Handle_ConfigurationOverridePresentWithBuildArguments_OverridesExistingBuildArguments() { //Arrange var fakePullDogPullRequest = new PullDogPullRequest() { ConfigurationOverride = new ConfigurationFileOverride() { BuildArguments = new Dictionary <string, string>() { { "some-new-key", "some-new-value" } } } }; var fakeConfiguration = new ConfigurationFile(new List <string>()) { BuildArguments = new Dictionary <string, string>() { { "some-old-key", "some-old-value" } } }; var fakePullDogFileCollectorFactory = Substitute.For <IPullDogFileCollectorFactory>(); var fakePullDogFileCollector = await fakePullDogFileCollectorFactory.CreateAsync(fakePullDogPullRequest); fakePullDogFileCollector .GetConfigurationFileAsync() .Returns(fakeConfiguration); var handler = new GetConfigurationForPullRequestQueryHandler( fakePullDogFileCollectorFactory); //Act var configuration = await handler.Handle( new GetConfigurationForPullRequestQuery( fakePullDogPullRequest), default); //Assert var buildArgument = configuration.BuildArguments !.Single(); Assert.AreEqual("some-new-key", buildArgument.Key); Assert.AreEqual("some-new-value", buildArgument.Value); }
public async Task <IPullDogRepositoryClient> CreateAsync( PullDogPullRequest pullRequest) { var repository = pullRequest.PullDogRepository; if (repository?.GitHubInstallationId == null) { throw new InvalidOperationException("The GitHub installation ID could not be determined."); } var installationId = repository.GitHubInstallationId.Value; var gitHubClient = await this.gitHubClientFactory.CreateInstallationClientAsync(installationId); var gitHubPullRequest = await gitHubClient.PullRequest.Get( long.Parse(repository.Handle, CultureInfo.InvariantCulture), int.Parse(pullRequest.Handle, CultureInfo.InvariantCulture)); return(new GitHubPullDogRepositoryClient( gitHubClient, gitHubPullRequest.Head)); }
public async Task Create_PullRequestGiven_CallsRepositoryClientFactory() { //Arrange var fakePullDogRepositoryClientFactory = Substitute.For <IPullDogRepositoryClientFactory>(); var fakeDockerComposeParserFactory = Substitute.For <IDockerComposeParserFactory>(); var factory = new PullDogFileCollectorFactory( fakePullDogRepositoryClientFactory, fakeDockerComposeParserFactory, Substitute.For <ILogger>()); var pullDogPullRequest = new PullDogPullRequest(); //Act var collector = await factory.CreateAsync(pullDogPullRequest); //Assert Assert.IsNotNull(collector); await fakePullDogRepositoryClientFactory .Received(1) .CreateAsync(pullDogPullRequest); }
public async Task Handle_ConfigurationOverridePresentWithConversationMode_OverridesExistingConversationMode() { //Arrange var fakePullDogPullRequest = new PullDogPullRequest() { ConfigurationOverride = new ConfigurationFileOverride() { ConversationMode = ConversationMode.MultipleComments } }; var fakeConfiguration = new ConfigurationFile(new List <string>()) { ConversationMode = ConversationMode.SingleComment }; var fakePullDogFileCollectorFactory = Substitute.For <IPullDogFileCollectorFactory>(); var fakePullDogFileCollector = await fakePullDogFileCollectorFactory.CreateAsync(fakePullDogPullRequest); fakePullDogFileCollector .GetConfigurationFileAsync() .Returns(fakeConfiguration); var handler = new GetConfigurationForPullRequestQueryHandler( fakePullDogFileCollectorFactory); //Act var configuration = await handler.Handle( new GetConfigurationForPullRequestQuery( fakePullDogPullRequest), default); //Assert Assert.AreEqual(ConversationMode.MultipleComments, configuration.ConversationMode); }
public async Task Handle_ConfigurationOverridePresentWithExpiry_OverridesExistingExpiry() { //Arrange var fakePullDogPullRequest = new PullDogPullRequest() { ConfigurationOverride = new ConfigurationFileOverride() { Expiry = TimeSpan.FromMinutes(2) } }; var fakeConfiguration = new ConfigurationFile(new List <string>()) { Expiry = TimeSpan.FromMinutes(1) }; var fakePullDogFileCollectorFactory = Substitute.For <IPullDogFileCollectorFactory>(); var fakePullDogFileCollector = await fakePullDogFileCollectorFactory.CreateAsync(fakePullDogPullRequest); fakePullDogFileCollector .GetConfigurationFileAsync() .Returns(fakeConfiguration); var handler = new GetConfigurationForPullRequestQueryHandler( fakePullDogFileCollectorFactory); //Act var configuration = await handler.Handle( new GetConfigurationForPullRequestQuery( fakePullDogPullRequest), default); //Assert Assert.AreEqual(TimeSpan.FromMinutes(2), configuration.Expiry); }
public async Task Handle_ExistingClusterInstanceFoundAndPaidUser_ReusesExistingInstanceAndUpdatesExpiry() { //Arrange await using var environment = await IntegrationTestEnvironment.CreateAsync(); var user = new User() { StripeCustomerId = "dummy" }; var pullDogPullRequest = new PullDogPullRequest() { Handle = "dummy", PullDogRepository = new PullDogRepository() { Handle = "dummy", PullDogSettings = new PullDogSettings() { User = user, PoolSize = 1, PlanId = "dummy", EncryptedApiKey = Array.Empty <byte>() } } }; var oldInstance = new Instance() { Name = "existing-instance", PlanId = "dummy", PullDogPullRequest = pullDogPullRequest, Cluster = new Cluster() { Name = "pull-dog", User = user } }; await environment.DataContext.Instances.AddAsync(oldInstance); await environment.DataContext.SaveChangesAsync(); //Act var instance = await environment.Mediator.Send(new EnsurePullDogDatabaseInstanceCommand( pullDogPullRequest, new ConfigurationFile(new List <string>()) { Expiry = TimeSpan.FromDays(30) })); //Assert Assert.AreSame(instance, oldInstance); Assert.AreEqual(instance.Name, oldInstance.Name); Assert.AreEqual(instance.Id, oldInstance.Id); await environment.WithFreshDataContext(async dataContext => { var refreshedOldInstance = await dataContext .Instances .AsNoTracking() .SingleOrDefaultAsync(x => x.Name == oldInstance.Name && x.Id == oldInstance.Id && x.ExpiresAtUtc > DateTime.UtcNow.AddDays(7)); Assert.IsNotNull(refreshedOldInstance); }); }
public GetAvailableClusterFromPullRequestQuery( PullDogPullRequest pullRequest) { this.PullRequest = pullRequest; }
public async Task Handle_ExistingClusterInstanceFoundAndDemoUserWithNoExpiry_ReducesExpiryToAnHour() { //Arrange await using var environment = await IntegrationTestEnvironment.CreateAsync(); var pullDogPullRequest = new PullDogPullRequest() { Handle = "dummy", PullDogRepository = new PullDogRepository() { Handle = "dummy", PullDogSettings = new PullDogSettings() { User = new User() { StripeCustomerId = "dummy" }, PoolSize = 0, PlanId = "dummy", EncryptedApiKey = Array.Empty <byte>() } } }; var oldInstance = new Instance() { Name = "existing-instance", PlanId = "dummy", PullDogPullRequest = pullDogPullRequest, Cluster = new Cluster() { Id = DataContext.PullDogDemoClusterId } }; await environment.DataContext.Instances.AddAsync(oldInstance); await environment.DataContext.SaveChangesAsync(); //Act var instance = await environment.Mediator.Send(new EnsurePullDogDatabaseInstanceCommand( pullDogPullRequest, new ConfigurationFile(new List <string>()))); //Assert Assert.AreSame(instance, oldInstance); Assert.AreEqual(instance.Name, oldInstance.Name); Assert.AreEqual(instance.Id, oldInstance.Id); await environment.WithFreshDataContext(async dataContext => { var refreshedOldInstance = await dataContext .Instances .AsNoTracking() .SingleAsync(); Assert.AreEqual(oldInstance.Name, refreshedOldInstance.Name); Assert.AreEqual(oldInstance.Id, refreshedOldInstance.Id); Assert.IsTrue(refreshedOldInstance.ExpiresAtUtc < DateTime.UtcNow.AddHours(1)); Assert.IsTrue(refreshedOldInstance.ExpiresAtUtc > DateTime.UtcNow.AddMinutes(50)); }); }
public GetConfigurationForPullRequestQuery( PullDogPullRequest pullRequest) { this.PullRequest = pullRequest; }