public void GetCdnAssetFileAndVersionReturnsPathWithHashCodeWhenValidResponseFromCDN()
        {
            const string testHeader = "test";

            var httpResponse = new HttpResponseMessage
            {
                StatusCode = HttpStatusCode.OK,
                Content    = new MultipartContent(),
            };

            httpResponse.Content.Headers.Add("content-md5", testHeader);

            var fakeHttpRequestSender = A.Fake <IFakeHttpRequestSender>();

            A.CallTo(() => fakeHttpRequestSender.Send(A <HttpRequestMessage> .Ignored)).Returns(httpResponse);

            var fakeHttpMessageHandler = new FakeHttpMessageHandler(fakeHttpRequestSender);
            var httpClient             = new HttpClient(fakeHttpMessageHandler);

            var assetLocationAndVersionService = new AssetLocationAndVersionService(httpClient, asyncHelper, webHostEnvironment, logger, fileInfoHelper);

            var result = assetLocationAndVersionService.GetCdnAssetFileAndVersion(TestCDNLocation);

            var expectedResult = $"{TestCDNLocation}?{testHeader}";

            Assert.Equal(expectedResult, result);

            httpResponse.Dispose();
            fakeHttpMessageHandler.Dispose();
            httpClient.Dispose();
        }
        public void GetCdnAssetFileAndVersionReturnsPathWithCurrentDateWhenNoValidResponseFromCDN()
        {
            var httpResponse = new HttpResponseMessage
            {
                StatusCode = HttpStatusCode.BadGateway,
                Content    = new MultipartContent(),
            };

            var fakeHttpRequestSender = A.Fake <IFakeHttpRequestSender>();

            A.CallTo(() => fakeHttpRequestSender.Send(A <HttpRequestMessage> .Ignored)).Returns(httpResponse);

            var fakeHttpMessageHandler = new FakeHttpMessageHandler(fakeHttpRequestSender);
            var httpClient             = new HttpClient(fakeHttpMessageHandler);

            var assetLocationAndVersionService = new AssetLocationAndVersionService(httpClient, asyncHelper, webHostEnvironment, logger, fileInfoHelper);

            var result = assetLocationAndVersionService.GetCdnAssetFileAndVersion(TestCDNLocation);
            var expectedFormattedDate = DateTime.Now.ToString("yyyyMMddHH", CultureInfo.InvariantCulture);
            var expectedResult        = $"{TestCDNLocation}?{expectedFormattedDate}";

            Assert.Equal(expectedResult, result);

            httpResponse.Dispose();
            fakeHttpMessageHandler.Dispose();
            httpClient.Dispose();
        }
        public void GetLocalAssetFileAndVersionReturnsLocationWhenFileDoesNotExist()
        {
            var assetLocationAndVersionService = new AssetLocationAndVersionService(defaultHttpClient, asyncHelper, webHostEnvironment, logger, fileInfoHelper);

            var result = assetLocationAndVersionService.GetLocalAssetFileAndVersion(TestLocalLocation);

            Assert.Equal($"/{TestLocalLocation}?", result);
        }
        public void GetCdnAssetFileAndVersionLogsErrorWhenExceptionThrown()
        {
            var assetLocationAndVersionService = new AssetLocationAndVersionService(defaultHttpClient, asyncHelper, webHostEnvironment, logger, fileInfoHelper);

            var result = assetLocationAndVersionService.GetCdnAssetFileAndVersion(TestCDNLocation);

            result.Should().Be($"{TestCDNLocation}?{DateTime.Now.ToString("yyyyMMddHH", CultureInfo.InvariantCulture)}");
        }
        public void GetLocalAssetFileAndVersionReturnsLocationWhenFileDoesExist()
        {
            var fakeStream       = new MemoryStream(Encoding.UTF8.GetBytes("SomeTestData"));
            var fakeMD5          = MD5.Create();
            var expectedHashCode = BitConverter.ToString(fakeMD5.ComputeHash(fakeStream)).Replace("-", string.Empty, StringComparison.OrdinalIgnoreCase);

            fakeStream.Position = 0;

            var fileExists = A.Fake <IFileInfoHelper>();

            A.CallTo(() => fileExists.FileExists(A <string> .Ignored)).Returns(true);
            A.CallTo(() => fileExists.GetStream(A <string> .Ignored)).Returns(fakeStream);

            var assetLocationAndVersionService = new AssetLocationAndVersionService(defaultHttpClient, asyncHelper, webHostEnvironment, logger, fileExists);

            var result = assetLocationAndVersionService.GetLocalAssetFileAndVersion(TestLocalLocation);

            Assert.Equal($"/{TestLocalLocation}?{expectedHashCode}", result);
            fakeStream.Dispose();
            fakeMD5.Dispose();
        }