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> |
|||
<TargetFramework>netcoreapp1.1</TargetFramework> |
|||
</PropertyGroup> |
|||
|
|||
<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="Moq" Version="4.7.8" /> |
|||
<PackageReference Include="xunit" Version="2.2.0" /> |
|||
<PackageReference Include="xunit.runner.visualstudio" Version="2.2.0" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<ProjectReference Include="..\..\src\Web\Web.csproj" /> |
|||
</ItemGroup> |
|||
|
|||
<ItemGroup> |
|||
<Service Include="{82a7f48d-3b50-4b1e-b82e-3ada8210c358}" /> |
|||
</ItemGroup> |
|||
|
|||
</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