public async Task ShouldResolveExistingTemplateWhenUsePreviousTemplateIsSelected()
        {
            var mockCf = new Mock <IAmazonCloudFormation>();

            mockCf.Setup(cf => cf.GetTemplateAsync(It.IsAny <GetTemplateRequest>(), default)).ReturnsAsync(
                new GetTemplateResponse {
                TemplateBody = this.fixture.TestStackJsonString
            });

            mockCf.Setup(cf => cf.GetTemplateSummaryAsync(It.IsAny <GetTemplateSummaryRequest>(), default))
            .ReturnsAsync(new GetTemplateSummaryResponse {
                Parameters = new List <ParameterDeclaration>()
            });

            var mockClientFactory = new Mock <IAwsClientFactory>();

            mockClientFactory.Setup(f => f.CreateCloudFormationClient()).Returns(mockCf.Object);

            var resolver = new TemplateResolver(mockClientFactory.Object, null, StackName, true, false);
            await resolver.ResolveFileAsync(null);

            resolver.Source.Should().Be(InputFileSource.UsePreviousTemplate);
            resolver.FileContent.Should().NotBeNullOrEmpty();
            resolver.ArtifactContent.Should().BeNull();
        }
        public async Task ShouldResolveStringTemplate()
        {
            var mockClientFactory = TestHelpers.GetClientFactoryMock();
            var resolver          = new TemplateResolver(mockClientFactory.Object, null, StackName, false, false);

            await resolver.ResolveFileAsync(this.fixture.TestStackJsonString);

            resolver.Source.Should().Be(InputFileSource.String);
            resolver.ArtifactContent.Should().NotBeNullOrEmpty();
        }
        public async Task ShouldResolveSmallFileTemplateAsOversizeFileWhenForceS3IsSet()
        {
            var mockClientFactory = TestHelpers.GetClientFactoryMock();
            var resolver          = new TemplateResolver(mockClientFactory.Object, null, StackName, false, true);

            await resolver.ResolveFileAsync(this.fixture.TestStackJsonTemplate.FullPath);

            resolver.Source.Should().Be(InputFileSource.File | InputFileSource.Oversize);
            resolver.ArtifactContent.Should().NotBeNullOrEmpty();
        }
        public void ShouldThrowArgumentExceptionForInvalidVirtualHostStyleUrl()
        {
            var mockClientFactory = new Mock <IAwsClientFactory>();

            var resolver = new TemplateResolver(mockClientFactory.Object, null, StackName, false, false);

            Func <Task> action = async() => await resolver.ResolveFileAsync("https://jbarr-public.s3.amazonaws.com/");

            action.Should().Throw <ArgumentException>()
            .WithMessage("'Virtual Host' style S3 URLs must have at least 1 path segment (key)");
        }
        public void ShouldThrowArgumentExceptionForInvalidPathStyleUrl(string url)
        {
            var mockClientFactory = new Mock <IAwsClientFactory>();

            var resolver = new TemplateResolver(mockClientFactory.Object, null, StackName, false, false);

            Func <Task> action = async() => await resolver.ResolveFileAsync(url);

            action.Should().Throw <ArgumentException>().WithMessage(
                "'Path' style S3 URLs must have at least 3 path segments (bucketname/key)");
        }
        public async Task ShouldResolveS3UrlLocationAsS3(string url, string resolvedUrl)
        {
            var mockClientFactory = new Mock <IAwsClientFactory>();
            var mockS3Util        = new Mock <IS3Util>();

            mockS3Util.Setup(s3 => s3.GetS3ObjectContent(It.IsAny <string>(), It.IsAny <string>()))
            .ReturnsAsync(this.fixture.TestStackJsonString);

            var mockContext = new Mock <ICloudFormationContext>();

            mockContext.Setup(c => c.S3Util).Returns(mockS3Util.Object);

            var resolver = new TemplateResolver(mockClientFactory.Object, mockContext.Object, StackName, false, false);

            await resolver.ResolveFileAsync(url);

            resolver.Source.Should().Be(InputFileSource.S3);
            resolver.ArtifactUrl.Should().Be(resolvedUrl);
            resolver.FileContent.Should().NotBeNullOrEmpty();
            resolver.ArtifactContent.Should().BeNull();
        }