using Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands;
|
|
using Microsoft.eShopOnContainers.Services.Ordering.API.Infrastructure.Services;
|
|
using Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.BuyerAggregate;
|
|
using Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate;
|
|
using Moq;
|
|
using System;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
namespace UnitTest.Ordering.Application
|
|
{
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using Xunit;
|
|
public class NewOrderRequestHandlerTest
|
|
{
|
|
private readonly Mock<IBuyerRepository<Buyer>> _buyerRepositoryMock;
|
|
private readonly Mock<IOrderRepository<Order>> _orderRepositoryMock;
|
|
private readonly Mock<IIdentityService> _identityServiceMock;
|
|
|
|
public NewOrderRequestHandlerTest()
|
|
{
|
|
|
|
_buyerRepositoryMock = new Mock<IBuyerRepository<Buyer>>();
|
|
_orderRepositoryMock = new Mock<IOrderRepository<Order>>();
|
|
_identityServiceMock = new Mock<IIdentityService>();
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Handle_returns_true_when_order_is_persisted_succesfully()
|
|
{
|
|
|
|
var buyerId = "1234";
|
|
|
|
var fakeOrderCmd = FakeOrderRequestWithBuyer(new Dictionary<string, object>
|
|
{ ["cardExpiration"] = DateTime.Now.AddYears(1) });
|
|
|
|
// Arrange
|
|
_buyerRepositoryMock.Setup(buyerRepo => buyerRepo.FindAsync(buyerId))
|
|
.Returns(Task.FromResult<Buyer>(FakeBuyer()));
|
|
|
|
_buyerRepositoryMock.Setup(buyerRepo => buyerRepo.UnitOfWork.SaveChangesAsync(default(CancellationToken)))
|
|
.Returns(Task.FromResult(1));
|
|
|
|
_orderRepositoryMock.Setup(or => or.Add(FakeOrder()))
|
|
.Returns(FakeOrder());
|
|
|
|
_orderRepositoryMock.Setup(or => or.UnitOfWork.SaveChangesAsync(default(CancellationToken)))
|
|
.Returns(Task.FromResult(1));
|
|
|
|
_identityServiceMock.Setup(svc => svc.GetUserIdentity()).Returns(buyerId);
|
|
//Act
|
|
var handler = new CreateOrderCommandHandler(_buyerRepositoryMock.Object, _orderRepositoryMock.Object, _identityServiceMock.Object);
|
|
var result = await handler.Handle(fakeOrderCmd);
|
|
|
|
//Assert
|
|
Assert.True(result);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Handle_return_false_if_order_is_not_persisted()
|
|
{
|
|
var buyerId = "1234";
|
|
|
|
var fakeOrderCmd = FakeOrderRequestWithBuyer(new Dictionary<string, object>
|
|
{ ["cardExpiration"] = DateTime.Now.AddYears(1) });
|
|
|
|
_buyerRepositoryMock.Setup(buyerRepo => buyerRepo.FindAsync(buyerId))
|
|
.Returns(Task.FromResult<Buyer>(FakeBuyer()));
|
|
|
|
_buyerRepositoryMock.Setup(buyerRepo => buyerRepo.UnitOfWork.SaveChangesAsync(default(CancellationToken)))
|
|
.Returns(Task.FromResult(1));
|
|
|
|
_orderRepositoryMock.Setup(or => or.Add(FakeOrder())).Returns(FakeOrder());
|
|
_orderRepositoryMock.Setup(or => or.UnitOfWork.SaveChangesAsync(default(CancellationToken)))
|
|
.Returns(Task.FromResult(0));
|
|
_identityServiceMock.Setup(svc => svc.GetUserIdentity()).Returns(buyerId);
|
|
|
|
//Act
|
|
var handler = new CreateOrderCommandHandler(_buyerRepositoryMock.Object, _orderRepositoryMock.Object, _identityServiceMock.Object);
|
|
var result = await handler.Handle(fakeOrderCmd);
|
|
|
|
//Assert
|
|
Assert.False(result);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Handle_throws_exception_when_order_expired()
|
|
{
|
|
|
|
var buyerId = "1234";
|
|
|
|
var fakeOrderCmd = FakeOrderRequestWithBuyer(new Dictionary<string, object>
|
|
{ ["cardExpiration"] = DateTime.Now.AddYears(-1) });
|
|
|
|
// Arrange
|
|
_buyerRepositoryMock.Setup(buyerRepo => buyerRepo.FindAsync(buyerId))
|
|
.Returns(Task.FromResult<Buyer>(FakeBuyer()));
|
|
|
|
_buyerRepositoryMock.Setup(buyerRepo => buyerRepo.UnitOfWork.SaveChangesAsync(default(CancellationToken)))
|
|
.Returns(Task.FromResult(1));
|
|
|
|
_orderRepositoryMock.Setup(or => or.Add(FakeOrder()))
|
|
.Returns(FakeOrder());
|
|
|
|
_orderRepositoryMock.Setup(or => or.UnitOfWork.SaveChangesAsync(default(CancellationToken)))
|
|
.Returns(Task.FromResult(1));
|
|
|
|
_identityServiceMock.Setup(svc => svc.GetUserIdentity()).Returns(buyerId);
|
|
//Act
|
|
var handler = new CreateOrderCommandHandler(_buyerRepositoryMock.Object, _orderRepositoryMock.Object, _identityServiceMock.Object);
|
|
|
|
//Assert
|
|
await Assert.ThrowsAsync<ArgumentException>(async () => await handler.Handle(fakeOrderCmd));
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Handle_throws_exception_when_no_holdername()
|
|
{
|
|
|
|
var buyerId = "1234";
|
|
|
|
var fakeOrderCmd = FakeOrderRequestWithBuyer(new Dictionary<string, object>
|
|
{
|
|
["cardExpiration"] = DateTime.Now.AddYears(1),
|
|
["cardHolderName"] = string.Empty,
|
|
});
|
|
|
|
// Arrange
|
|
_buyerRepositoryMock.Setup(buyerRepo => buyerRepo.FindAsync(buyerId))
|
|
.Returns(Task.FromResult<Buyer>(FakeBuyer()));
|
|
|
|
_buyerRepositoryMock.Setup(buyerRepo => buyerRepo.UnitOfWork.SaveChangesAsync(default(CancellationToken)))
|
|
.Returns(Task.FromResult(1));
|
|
|
|
_orderRepositoryMock.Setup(or => or.Add(FakeOrder()))
|
|
.Returns(FakeOrder());
|
|
|
|
_orderRepositoryMock.Setup(or => or.UnitOfWork.SaveChangesAsync(default(CancellationToken)))
|
|
.Returns(Task.FromResult(1));
|
|
|
|
_identityServiceMock.Setup(svc => svc.GetUserIdentity()).Returns(buyerId);
|
|
//Act
|
|
var handler = new CreateOrderCommandHandler(_buyerRepositoryMock.Object, _orderRepositoryMock.Object, _identityServiceMock.Object);
|
|
|
|
//Assert
|
|
await Assert.ThrowsAsync<ArgumentException>(async () => await handler.Handle(fakeOrderCmd));
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Handle_throws_exception_when_no_securityNumber()
|
|
{
|
|
|
|
var buyerId = "1234";
|
|
|
|
var fakeOrderCmd = FakeOrderRequestWithBuyer(new Dictionary<string, object>
|
|
{
|
|
["cardExpiration"] = DateTime.Now.AddYears(1),
|
|
["cardSecurityNumber"] = string.Empty,
|
|
});
|
|
|
|
// Arrange
|
|
_buyerRepositoryMock.Setup(buyerRepo => buyerRepo.FindAsync(buyerId))
|
|
.Returns(Task.FromResult<Buyer>(FakeBuyer()));
|
|
|
|
_buyerRepositoryMock.Setup(buyerRepo => buyerRepo.UnitOfWork.SaveChangesAsync(default(CancellationToken)))
|
|
.Returns(Task.FromResult(1));
|
|
|
|
_orderRepositoryMock.Setup(or => or.Add(FakeOrder()))
|
|
.Returns(FakeOrder());
|
|
|
|
_orderRepositoryMock.Setup(or => or.UnitOfWork.SaveChangesAsync(default(CancellationToken)))
|
|
.Returns(Task.FromResult(1));
|
|
|
|
_identityServiceMock.Setup(svc => svc.GetUserIdentity()).Returns(buyerId);
|
|
//Act
|
|
var handler = new CreateOrderCommandHandler(_buyerRepositoryMock.Object, _orderRepositoryMock.Object, _identityServiceMock.Object);
|
|
|
|
//Assert
|
|
await Assert.ThrowsAsync<ArgumentException>(async () => await handler.Handle(fakeOrderCmd));
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Handle_throws_exception_when_no_cardNumber()
|
|
{
|
|
|
|
var buyerId = "1234";
|
|
|
|
var fakeOrderCmd = FakeOrderRequestWithBuyer(new Dictionary<string, object>
|
|
{
|
|
["cardExpiration"] = DateTime.Now.AddYears(1),
|
|
["cardNumber"] = string.Empty,
|
|
});
|
|
|
|
// Arrange
|
|
_buyerRepositoryMock.Setup(buyerRepo => buyerRepo.FindAsync(buyerId))
|
|
.Returns(Task.FromResult<Buyer>(FakeBuyer()));
|
|
|
|
_buyerRepositoryMock.Setup(buyerRepo => buyerRepo.UnitOfWork.SaveChangesAsync(default(CancellationToken)))
|
|
.Returns(Task.FromResult(1));
|
|
|
|
_orderRepositoryMock.Setup(or => or.Add(FakeOrder()))
|
|
.Returns(FakeOrder());
|
|
|
|
_orderRepositoryMock.Setup(or => or.UnitOfWork.SaveChangesAsync(default(CancellationToken)))
|
|
.Returns(Task.FromResult(1));
|
|
|
|
_identityServiceMock.Setup(svc => svc.GetUserIdentity()).Returns(buyerId);
|
|
//Act
|
|
var handler = new CreateOrderCommandHandler(_buyerRepositoryMock.Object, _orderRepositoryMock.Object, _identityServiceMock.Object);
|
|
|
|
//Assert
|
|
await Assert.ThrowsAsync<ArgumentException>(async () => await handler.Handle(fakeOrderCmd));
|
|
}
|
|
|
|
[Fact]
|
|
public void Handle_throws_exception_when_no_buyerId()
|
|
{
|
|
//Assert
|
|
Assert.Throws<ArgumentNullException>(() => new Buyer(string.Empty));
|
|
}
|
|
|
|
private Buyer FakeBuyer()
|
|
{
|
|
return new Buyer(Guid.NewGuid().ToString());
|
|
}
|
|
|
|
private Order FakeOrder()
|
|
{
|
|
return new Order(1, 1, new Address("street", "city", "state", "country", "zipcode"));
|
|
}
|
|
|
|
private CreateOrderCommand FakeOrderRequestWithBuyer(Dictionary<string, object> args = null)
|
|
{
|
|
return new CreateOrderCommand(
|
|
city: args != null && args.ContainsKey("city") ? (string)args["city"] : null,
|
|
street: args != null && args.ContainsKey("street") ? (string)args["street"] : null,
|
|
state: args != null && args.ContainsKey("state") ? (string)args["state"] : null,
|
|
country: args != null && args.ContainsKey("country") ? (string)args["country"] : null,
|
|
zipcode: args != null && args.ContainsKey("zipcode") ? (string)args["zipcode"] : null,
|
|
cardNumber: args != null && args.ContainsKey("cardNumber") ? (string)args["cardNumber"] : "1234",
|
|
cardExpiration: args != null && args.ContainsKey("cardExpiration") ? (DateTime)args["cardExpiration"] : DateTime.MinValue,
|
|
cardSecurityNumber: args != null && args.ContainsKey("cardSecurityNumber") ? (string)args["cardSecurityNumber"] : "123",
|
|
cardHolderName: args != null && args.ContainsKey("cardHolderName") ? (string)args["cardHolderName"] : "XXX",
|
|
cardTypeId: args != null && args.ContainsKey("cardTypeId") ? (int)args["cardTypeId"] : 0);
|
|
}
|
|
}
|
|
}
|