|
@ -0,0 +1,92 @@ |
|
|
|
|
|
using System; |
|
|
|
|
|
using System.Reflection; |
|
|
|
|
|
using System.Threading; |
|
|
|
|
|
using System.Threading.Tasks; |
|
|
|
|
|
using Autofac; |
|
|
|
|
|
using MediatR; |
|
|
|
|
|
using Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands; |
|
|
|
|
|
using Microsoft.eShopOnContainers.Services.Ordering.Infrastructure.Idempotency; |
|
|
|
|
|
using Moq; |
|
|
|
|
|
using Ordering.API.Infrastructure.Behaviors; |
|
|
|
|
|
using Xunit; |
|
|
|
|
|
|
|
|
|
|
|
namespace UnitTest.Ordering.Application |
|
|
|
|
|
{ |
|
|
|
|
|
public class ExistingCommandBehaviorTest |
|
|
|
|
|
{ |
|
|
|
|
|
private readonly Mock<IRequestManager> _requestManager; |
|
|
|
|
|
private readonly Mock<IRequestHandler<CreateOrderCommand, bool>> _commandHandler; |
|
|
|
|
|
|
|
|
|
|
|
public ExistingCommandBehaviorTest() |
|
|
|
|
|
{ |
|
|
|
|
|
_requestManager = new Mock<IRequestManager>(); |
|
|
|
|
|
_commandHandler = new Mock<IRequestHandler<CreateOrderCommand, bool>>(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private ContainerBuilder PrepareContainerBuilder() |
|
|
|
|
|
{ |
|
|
|
|
|
var builder = new ContainerBuilder(); |
|
|
|
|
|
builder.RegisterAssemblyTypes(typeof(IMediator).GetTypeInfo().Assembly) |
|
|
|
|
|
.AsImplementedInterfaces(); |
|
|
|
|
|
|
|
|
|
|
|
builder.Register<ServiceFactory>(context => |
|
|
|
|
|
{ |
|
|
|
|
|
var componentContext = context.Resolve<IComponentContext>(); |
|
|
|
|
|
return t => { object o; return componentContext.TryResolve(t, out o) ? o : null; }; |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
builder.RegisterInstance(_requestManager.Object).AsImplementedInterfaces(); |
|
|
|
|
|
builder.RegisterInstance(_commandHandler.Object).AsImplementedInterfaces(); |
|
|
|
|
|
|
|
|
|
|
|
builder.RegisterGeneric(typeof(ExistingCommandBehavior<,>)).As(typeof(IPipelineBehavior<,>)); |
|
|
|
|
|
return builder; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
[Fact] |
|
|
|
|
|
public async Task Handler_sends_command_when_no_order_exists() |
|
|
|
|
|
{ |
|
|
|
|
|
//Arrange
|
|
|
|
|
|
var command = new CreateOrderCommand(); |
|
|
|
|
|
_requestManager.Setup(x => x.ExistAsync(It.IsAny<Guid>())) |
|
|
|
|
|
.Returns(Task.FromResult(false)); |
|
|
|
|
|
|
|
|
|
|
|
var builder = PrepareContainerBuilder(); |
|
|
|
|
|
var container = builder.Build(); |
|
|
|
|
|
|
|
|
|
|
|
var mediator = container.Resolve<IMediator>(); |
|
|
|
|
|
|
|
|
|
|
|
//Act
|
|
|
|
|
|
await mediator.Send(command); |
|
|
|
|
|
|
|
|
|
|
|
//Assert
|
|
|
|
|
|
_commandHandler.Verify(x => x.Handle(It.IsAny<CreateOrderCommand>(), It.IsAny<CancellationToken>()), Times.Once); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
[Fact] |
|
|
|
|
|
public async Task Handler_sends_no_command_and_returns_defined_response_when_order_already_exists() |
|
|
|
|
|
{ |
|
|
|
|
|
//Arrange
|
|
|
|
|
|
var command = new CreateOrderCommand(); |
|
|
|
|
|
var existingCommandResponse = new Mock<IRequestHandler<ExistingCommandResponse<CreateOrderCommand, bool>.ExistingCommand, bool>>(); |
|
|
|
|
|
existingCommandResponse.Setup(x => x.Handle(It.IsAny<ExistingCommandResponse<CreateOrderCommand, bool>.ExistingCommand>(), It.IsAny<CancellationToken>())) |
|
|
|
|
|
.Returns(Task.FromResult(true)); |
|
|
|
|
|
|
|
|
|
|
|
_requestManager.Setup(x => x.ExistAsync(It.IsAny<Guid>())) |
|
|
|
|
|
.Returns(Task.FromResult(true)); |
|
|
|
|
|
|
|
|
|
|
|
var builder = PrepareContainerBuilder(); |
|
|
|
|
|
builder.RegisterInstance(existingCommandResponse.Object).AsImplementedInterfaces(); |
|
|
|
|
|
var container = builder.Build(); |
|
|
|
|
|
|
|
|
|
|
|
var mediator = container.Resolve<IMediator>(); |
|
|
|
|
|
|
|
|
|
|
|
//Act
|
|
|
|
|
|
var response = await mediator.Send(command); |
|
|
|
|
|
|
|
|
|
|
|
//Assert
|
|
|
|
|
|
Assert.True(response); |
|
|
|
|
|
existingCommandResponse.Verify(x => x.Handle(It.IsAny<ExistingCommandResponse<CreateOrderCommand, bool>.ExistingCommand>(), It.IsAny<CancellationToken>()), Times.Once); |
|
|
|
|
|
_commandHandler.Verify(x => x.Handle(It.IsAny<CreateOrderCommand>(), It.IsAny<CancellationToken>()), Times.Never); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |