You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

219 lines
9.1 KiB

  1. using Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands;
  2. using Microsoft.eShopOnContainers.Services.Ordering.API.Infrastructure.Services;
  3. using Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.BuyerAggregate;
  4. using Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate;
  5. using Moq;
  6. using System;
  7. using System.Threading;
  8. using System.Threading.Tasks;
  9. namespace UnitTest.Ordering.Application
  10. {
  11. using MediatR;
  12. using System.Collections;
  13. using System.Collections.Generic;
  14. using Xunit;
  15. public class NewOrderRequestHandlerTest
  16. {
  17. private readonly Mock<IOrderRepository<Order>> _orderRepositoryMock;
  18. private readonly Mock<IIdentityService> _identityServiceMock;
  19. private readonly Mock<IMediator> _mediator;
  20. public NewOrderRequestHandlerTest()
  21. {
  22. _orderRepositoryMock = new Mock<IOrderRepository<Order>>();
  23. _identityServiceMock = new Mock<IIdentityService>();
  24. _mediator = new Mock<IMediator>();
  25. }
  26. [Fact]
  27. public async Task Handle_returns_true_when_order_is_persisted_succesfully()
  28. {
  29. var buyerId = "1234";
  30. var fakeOrderCmd = FakeOrderRequestWithBuyer(new Dictionary<string, object>
  31. { ["cardExpiration"] = DateTime.Now.AddYears(1) });
  32. // Arrange
  33. _orderRepositoryMock.Setup(orderRepo => orderRepo.GetAsync(It.IsAny<int>()))
  34. .Returns(Task.FromResult<Order>(FakeOrder()));
  35. _orderRepositoryMock.Setup(buyerRepo => buyerRepo.UnitOfWork.SaveChangesAsync(default(CancellationToken)))
  36. .Returns(Task.FromResult(1));
  37. _identityServiceMock.Setup(svc => svc.GetUserIdentity()).Returns(buyerId);
  38. //Act
  39. var handler = new CreateOrderCommandHandler(_mediator.Object, _orderRepositoryMock.Object, _identityServiceMock.Object);
  40. var result = await handler.Handle(fakeOrderCmd);
  41. //Assert
  42. Assert.True(result);
  43. }
  44. [Fact]
  45. public async Task Handle_return_false_if_order_is_not_persisted()
  46. {
  47. var buyerId = "1234";
  48. var fakeOrderCmd = FakeOrderRequestWithBuyer(new Dictionary<string, object>
  49. { ["cardExpiration"] = DateTime.Now.AddYears(1) });
  50. _orderRepositoryMock.Setup(orderRepo => orderRepo.GetAsync(It.IsAny<int>()))
  51. .Returns(Task.FromResult<Order>(FakeOrder()));
  52. _orderRepositoryMock.Setup(buyerRepo => buyerRepo.UnitOfWork.SaveChangesAsync(default(CancellationToken)))
  53. .Returns(Task.FromResult(1));
  54. _identityServiceMock.Setup(svc => svc.GetUserIdentity()).Returns(buyerId);
  55. //Act
  56. var handler = new CreateOrderCommandHandler(_mediator.Object, _orderRepositoryMock.Object, _identityServiceMock.Object);
  57. var result = await handler.Handle(fakeOrderCmd);
  58. //Assert
  59. Assert.False(result);
  60. }
  61. [Fact]
  62. public async Task Handle_throws_exception_when_order_expired()
  63. {
  64. var buyerId = "1234";
  65. var fakeOrderCmd = FakeOrderRequestWithBuyer(new Dictionary<string, object>
  66. { ["cardExpiration"] = DateTime.Now.AddYears(-1) });
  67. // Arrange
  68. _orderRepositoryMock.Setup(orderRepo => orderRepo.GetAsync(It.IsAny<int>()))
  69. .Returns(Task.FromResult<Order>(FakeOrder()));
  70. _orderRepositoryMock.Setup(buyerRepo => buyerRepo.UnitOfWork.SaveChangesAsync(default(CancellationToken)))
  71. .Returns(Task.FromResult(1));
  72. _identityServiceMock.Setup(svc => svc.GetUserIdentity()).Returns(buyerId);
  73. //Act
  74. var handler = new CreateOrderCommandHandler(_mediator.Object, _orderRepositoryMock.Object, _identityServiceMock.Object);
  75. //Assert
  76. await Assert.ThrowsAsync<ArgumentException>(async () => await handler.Handle(fakeOrderCmd));
  77. }
  78. [Fact]
  79. public async Task Handle_throws_exception_when_no_holdername()
  80. {
  81. var buyerId = "1234";
  82. var fakeOrderCmd = FakeOrderRequestWithBuyer(new Dictionary<string, object>
  83. {
  84. ["cardExpiration"] = DateTime.Now.AddYears(1),
  85. ["cardHolderName"] = string.Empty,
  86. });
  87. // Arrange
  88. _orderRepositoryMock.Setup(orderRepo => orderRepo.GetAsync(It.IsAny<int>()))
  89. .Returns(Task.FromResult<Order>(FakeOrder()));
  90. _orderRepositoryMock.Setup(buyerRepo => buyerRepo.UnitOfWork.SaveChangesAsync(default(CancellationToken)))
  91. .Returns(Task.FromResult(1));
  92. _identityServiceMock.Setup(svc => svc.GetUserIdentity()).Returns(buyerId);
  93. //Act
  94. var handler = new CreateOrderCommandHandler(_mediator.Object, _orderRepositoryMock.Object, _identityServiceMock.Object);
  95. //Assert
  96. await Assert.ThrowsAsync<ArgumentException>(async () => await handler.Handle(fakeOrderCmd));
  97. }
  98. [Fact]
  99. public async Task Handle_throws_exception_when_no_securityNumber()
  100. {
  101. var buyerId = "1234";
  102. var fakeOrderCmd = FakeOrderRequestWithBuyer(new Dictionary<string, object>
  103. {
  104. ["cardExpiration"] = DateTime.Now.AddYears(1),
  105. ["cardSecurityNumber"] = string.Empty,
  106. });
  107. // Arrange
  108. _orderRepositoryMock.Setup(orderRepo => orderRepo.GetAsync(It.IsAny<int>()))
  109. .Returns(Task.FromResult<Order>(FakeOrder()));
  110. _orderRepositoryMock.Setup(buyerRepo => buyerRepo.UnitOfWork.SaveChangesAsync(default(CancellationToken)))
  111. .Returns(Task.FromResult(1));
  112. _identityServiceMock.Setup(svc => svc.GetUserIdentity()).Returns(buyerId);
  113. //Act
  114. var handler = new CreateOrderCommandHandler(_mediator.Object, _orderRepositoryMock.Object, _identityServiceMock.Object);
  115. //Assert
  116. await Assert.ThrowsAsync<ArgumentException>(async () => await handler.Handle(fakeOrderCmd));
  117. }
  118. [Fact]
  119. public async Task Handle_throws_exception_when_no_cardNumber()
  120. {
  121. var orderId = "1234";
  122. var fakeOrderCmd = FakeOrderRequestWithBuyer(new Dictionary<string, object>
  123. {
  124. ["cardExpiration"] = DateTime.Now.AddYears(1),
  125. ["cardNumber"] = string.Empty,
  126. });
  127. // Arrange
  128. _orderRepositoryMock.Setup(orderRepo => orderRepo.GetAsync(It.IsAny<int>()))
  129. .Returns(Task.FromResult<Order>(FakeOrder()));
  130. _orderRepositoryMock.Setup(orderRepo => orderRepo.UnitOfWork.SaveChangesAsync(default(CancellationToken)))
  131. .Returns(Task.FromResult(1));
  132. _identityServiceMock.Setup(svc => svc.GetUserIdentity()).Returns(orderId);
  133. //Act
  134. var handler = new CreateOrderCommandHandler(_mediator.Object, _orderRepositoryMock.Object, _identityServiceMock.Object);
  135. //Assert
  136. await Assert.ThrowsAsync<ArgumentException>(async () => await handler.Handle(fakeOrderCmd));
  137. }
  138. [Fact]
  139. public void Handle_throws_exception_when_no_buyerId()
  140. {
  141. //Assert
  142. Assert.Throws<ArgumentNullException>(() => new Buyer(string.Empty));
  143. }
  144. private Buyer FakeBuyer()
  145. {
  146. return new Buyer(Guid.NewGuid().ToString());
  147. }
  148. private Order FakeOrder()
  149. {
  150. return new Order(new Address("street", "city", "state", "country", "zipcode"), 1, "12", "111", "fakeName", DateTime.Now.AddYears(1));
  151. }
  152. private CreateOrderCommand FakeOrderRequestWithBuyer(Dictionary<string, object> args = null)
  153. {
  154. return new CreateOrderCommand(
  155. city: args != null && args.ContainsKey("city") ? (string)args["city"] : null,
  156. street: args != null && args.ContainsKey("street") ? (string)args["street"] : null,
  157. state: args != null && args.ContainsKey("state") ? (string)args["state"] : null,
  158. country: args != null && args.ContainsKey("country") ? (string)args["country"] : null,
  159. zipcode: args != null && args.ContainsKey("zipcode") ? (string)args["zipcode"] : null,
  160. cardNumber: args != null && args.ContainsKey("cardNumber") ? (string)args["cardNumber"] : "1234",
  161. cardExpiration: args != null && args.ContainsKey("cardExpiration") ? (DateTime)args["cardExpiration"] : DateTime.MinValue,
  162. cardSecurityNumber: args != null && args.ContainsKey("cardSecurityNumber") ? (string)args["cardSecurityNumber"] : "123",
  163. cardHolderName: args != null && args.ContainsKey("cardHolderName") ? (string)args["cardHolderName"] : "XXX",
  164. cardTypeId: args != null && args.ContainsKey("cardTypeId") ? (int)args["cardTypeId"] : 0,
  165. paymentId: args != null && args.ContainsKey("paymentId") ? (int)args["paymentId"] : 0,
  166. buyerId: args != null && args.ContainsKey("buyerId") ? (int)args["buyerId"] : 0);
  167. }
  168. }
  169. }