committed by
GitHub
13 changed files with 241 additions and 21 deletions
@ -0,0 +1,18 @@ |
|||||
|
using System; |
||||
|
|
||||
|
namespace ApplicationCore.Exceptions |
||||
|
{ |
||||
|
public class CatalogImageMissingException : Exception |
||||
|
{ |
||||
|
public CatalogImageMissingException(string message, |
||||
|
Exception innerException = null) |
||||
|
: base(message, innerException: innerException) |
||||
|
{ |
||||
|
} |
||||
|
public CatalogImageMissingException(Exception innerException) |
||||
|
: base("No catalog image found for the provided id.", |
||||
|
innerException: innerException) |
||||
|
{ |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,7 @@ |
|||||
|
namespace ApplicationCore.Interfaces |
||||
|
{ |
||||
|
public interface IAppLogger<T> |
||||
|
{ |
||||
|
void LogWarning(string message, params object[] args); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,7 @@ |
|||||
|
namespace ApplicationCore.Interfaces |
||||
|
{ |
||||
|
public interface IImageService |
||||
|
{ |
||||
|
byte[] GetImageBytesById(int id); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,30 @@ |
|||||
|
using ApplicationCore.Exceptions; |
||||
|
using ApplicationCore.Interfaces; |
||||
|
using Microsoft.AspNetCore.Hosting; |
||||
|
using System.IO; |
||||
|
|
||||
|
namespace Infrastructure.FileSystem |
||||
|
{ |
||||
|
public class LocalFileImageService : IImageService |
||||
|
{ |
||||
|
private readonly IHostingEnvironment _env; |
||||
|
|
||||
|
public LocalFileImageService(IHostingEnvironment env) |
||||
|
{ |
||||
|
_env = env; |
||||
|
} |
||||
|
public byte[] GetImageBytesById(int id) |
||||
|
{ |
||||
|
try |
||||
|
{ |
||||
|
var contentRoot = _env.ContentRootPath + "//Pics"; |
||||
|
var path = Path.Combine(contentRoot, id + ".png"); |
||||
|
return File.ReadAllBytes(path); |
||||
|
} |
||||
|
catch (FileNotFoundException ex) |
||||
|
{ |
||||
|
throw new CatalogImageMissingException(ex); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,18 @@ |
|||||
|
using ApplicationCore.Interfaces; |
||||
|
using Microsoft.Extensions.Logging; |
||||
|
|
||||
|
namespace Infrastructure.Logging |
||||
|
{ |
||||
|
public class LoggerAdapter<T> : IAppLogger<T> |
||||
|
{ |
||||
|
private readonly ILogger<T> _logger; |
||||
|
public LoggerAdapter(ILoggerFactory loggerFactory) |
||||
|
{ |
||||
|
_logger = loggerFactory.CreateLogger<T>(); |
||||
|
} |
||||
|
public void LogWarning(string message, params object[] args) |
||||
|
{ |
||||
|
_logger.LogWarning(message, args); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,17 @@ |
|||||
|
using Microsoft.eShopWeb.Controllers; |
||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Text; |
||||
|
using Xunit; |
||||
|
|
||||
|
namespace IntegrationTests.Web.Controllers |
||||
|
{ |
||||
|
public class CatalogControllerGetImage |
||||
|
{ |
||||
|
[Fact] |
||||
|
public void ReturnsFileContentResultGivenValidId() |
||||
|
{ |
||||
|
//var controller = new CatalogController()
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -1,13 +1,25 @@ |
|||||
<Project Sdk="Microsoft.NET.Sdk"> |
<Project Sdk="Microsoft.NET.Sdk"> |
||||
|
|
||||
<PropertyGroup> |
<PropertyGroup> |
||||
<TargetFramework>netcoreapp1.1</TargetFramework> |
<TargetFramework>netcoreapp1.1</TargetFramework> |
||||
</PropertyGroup> |
</PropertyGroup> |
||||
|
|
||||
<ItemGroup> |
<ItemGroup> |
||||
|
<PackageReference Include="Microsoft.AspNetCore" Version="1.1.0" /> |
||||
|
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.0" /> |
||||
|
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0" /> |
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.0.0" /> |
||||
|
<PackageReference Include="Moq" Version="4.7.8" /> |
||||
<PackageReference Include="xunit" Version="2.2.0" /> |
<PackageReference Include="xunit" Version="2.2.0" /> |
||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" /> |
<PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" /> |
||||
</ItemGroup> |
</ItemGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<ProjectReference Include="..\..\src\Web\Web.csproj" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<Service Include="{82a7f48d-3b50-4b1e-b82e-3ada8210c358}" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
</Project> |
</Project> |
||||
|
|||||
@ -0,0 +1,83 @@ |
|||||
|
using ApplicationCore.Exceptions; |
||||
|
using ApplicationCore.Interfaces; |
||||
|
using Microsoft.AspNetCore.Hosting; |
||||
|
using Microsoft.AspNetCore.Mvc; |
||||
|
using Microsoft.eShopWeb.Controllers; |
||||
|
using Microsoft.Extensions.Logging; |
||||
|
using Moq; |
||||
|
using Xunit; |
||||
|
|
||||
|
namespace UnitTests |
||||
|
{ |
||||
|
public class CatalogControllerGetImage |
||||
|
{ |
||||
|
private Mock<IImageService> _mockImageService = new Mock<IImageService>(); |
||||
|
private Mock<IAppLogger<CatalogController>> _mockLogger = new Mock<IAppLogger<CatalogController>>(); |
||||
|
private CatalogController _controller; |
||||
|
private int _testImageId = 123; |
||||
|
private byte[] _testBytes = { 0x01, 0x02, 0x03 }; |
||||
|
|
||||
|
public CatalogControllerGetImage() |
||||
|
{ |
||||
|
_controller = new CatalogController(null, null, _mockImageService.Object, |
||||
|
_mockLogger.Object); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void CallsImageServiceWithId() |
||||
|
{ |
||||
|
SetupImageWithTestBytes(); |
||||
|
|
||||
|
_controller.GetImage(_testImageId); |
||||
|
_mockImageService.Verify(); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void ReturnsFileResultWithBytesGivenSuccess() |
||||
|
{ |
||||
|
SetupImageWithTestBytes(); |
||||
|
|
||||
|
var result = _controller.GetImage(_testImageId); |
||||
|
|
||||
|
var fileResult = Assert.IsType<FileContentResult>(result); |
||||
|
var bytes = Assert.IsType<byte[]>(fileResult.FileContents); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void ReturnsNotFoundResultGivenImageMissingException() |
||||
|
{ |
||||
|
SetupMissingImage(); |
||||
|
|
||||
|
var result = _controller.GetImage(_testImageId); |
||||
|
|
||||
|
var actionResult = Assert.IsType<NotFoundResult>(result); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void LogsWarningGivenImageMissingException() |
||||
|
{ |
||||
|
SetupMissingImage(); |
||||
|
_mockLogger.Setup(l => l.LogWarning(It.IsAny<string>())) |
||||
|
.Verifiable(); |
||||
|
|
||||
|
_controller.GetImage(_testImageId); |
||||
|
|
||||
|
_mockLogger.Verify(); |
||||
|
} |
||||
|
|
||||
|
private void SetupMissingImage() |
||||
|
{ |
||||
|
_mockImageService |
||||
|
.Setup(i => i.GetImageBytesById(_testImageId)) |
||||
|
.Throws(new CatalogImageMissingException("missing image")); |
||||
|
} |
||||
|
|
||||
|
private void SetupImageWithTestBytes() |
||||
|
{ |
||||
|
_mockImageService |
||||
|
.Setup(i => i.GetImageBytesById(_testImageId)) |
||||
|
.Returns(_testBytes) |
||||
|
.Verifiable(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue