Exemple #1
0
 public EnsurePullDogDatabaseInstanceCommand(
     PullDogPullRequest pullRequest,
     ConfigurationFile configuration)
 {
     this.PullRequest   = pullRequest;
     this.Configuration = configuration;
 }
Exemple #2
0
 public UpsertPullRequestCommentCommand(
     PullDogPullRequest pullRequest,
     string content)
 {
     this.PullRequest = pullRequest;
     this.Content     = content;
 }
Exemple #3
0
        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);
        }
Exemple #4
0
        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));
            });
        }
Exemple #5
0
        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));
        }
Exemple #7
0
        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);
        }
Exemple #8
0
 public WebhookPayloadContext(
     WebhookPayload payload,
     PullDogSettings settings,
     PullDogRepository repository,
     PullDogPullRequest pullRequest)
 {
     this.Payload     = payload;
     this.Settings    = settings;
     this.Repository  = repository;
     this.PullRequest = pullRequest;
 }
Exemple #9
0
        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"]);
            });
        }
Exemple #10
0
        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);
        }
Exemple #11
0
        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);
        }
Exemple #13
0
        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);
        }
Exemple #14
0
        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);
        }
Exemple #15
0
        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;
 }
Exemple #17
0
        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;
 }