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.

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