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.

145 lines
5.4 KiB

  1. using FunctionalTests.Extensions;
  2. using FunctionalTests.Services.Basket;
  3. using Microsoft.eShopOnContainers.Services.Basket.API.Model;
  4. using Microsoft.eShopOnContainers.WebMVC.ViewModels;
  5. using Newtonsoft.Json;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Net.Http;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. using WebMVC.Services.ModelDTOs;
  13. using Xunit;
  14. namespace FunctionalTests.Services.Ordering
  15. {
  16. public class OrderingScenarios : OrderingScenariosBase
  17. {
  18. [Fact]
  19. public async Task Cancel_basket_and_check_order_status_cancelled()
  20. {
  21. using (var orderServer = new OrderingScenariosBase().CreateServer())
  22. using (var basketServer = new BasketScenariosBase().CreateServer())
  23. {
  24. // Expected data
  25. var cityExpected = $"city-{Guid.NewGuid()}";
  26. var orderStatusExpected = "cancelled";
  27. var basketClient = basketServer.CreateIdempotentClient();
  28. var orderClient = orderServer.CreateIdempotentClient();
  29. // GIVEN a basket is created
  30. var contentBasket = new StringContent(BuildBasket(), UTF8Encoding.UTF8, "application/json");
  31. await basketClient.PostAsync(BasketScenariosBase.Post.CreateBasket, contentBasket);
  32. // AND basket checkout is sent
  33. await basketClient.PostAsync(BasketScenariosBase.Post.CheckoutOrder, new StringContent(BuildCheckout(cityExpected), UTF8Encoding.UTF8, "application/json"));
  34. // WHEN Order is created in Ordering.api
  35. var newOrder = await TryGetNewOrderCreated(cityExpected, orderClient);
  36. // AND Order is cancelled in Ordering.api
  37. await orderClient.PutAsync(OrderingScenariosBase.Put.CancelOrder, new StringContent(BuildCancelOrder(newOrder.OrderNumber), UTF8Encoding.UTF8, "application/json"));
  38. // AND the requested order is retrieved
  39. var order = await TryGetOrder(newOrder.OrderNumber, orderClient);
  40. // THEN check status
  41. Assert.Equal(orderStatusExpected, order.Status);
  42. }
  43. }
  44. async Task<Order> TryGetOrder(string orderNumber, HttpClient orderClient)
  45. {
  46. var ordersGetResponse = await orderClient.GetStringAsync(OrderingScenariosBase.Get.Orders);
  47. var orders = JsonConvert.DeserializeObject<List<Order>>(ordersGetResponse);
  48. return orders.Single(o => o.OrderNumber == orderNumber);
  49. }
  50. private async Task<Order> TryGetNewOrderCreated(string city, HttpClient orderClient)
  51. {
  52. var counter = 0;
  53. Order order = null;
  54. while (counter < 20)
  55. {
  56. //get the orders and verify that the new order has been created
  57. var ordersGetResponse = await orderClient.GetStringAsync(OrderingScenariosBase.Get.Orders);
  58. var orders = JsonConvert.DeserializeObject<List<Order>>(ordersGetResponse);
  59. if (orders == null || orders.Count == 0) {
  60. counter++;
  61. await Task.Delay(100);
  62. continue;
  63. }
  64. var lastOrder = orders.OrderByDescending(o => o.Date).First();
  65. int.TryParse(lastOrder.OrderNumber, out int id);
  66. var orderDetails = await orderClient.GetStringAsync(OrderingScenariosBase.Get.OrderBy(id));
  67. order = JsonConvert.DeserializeObject<Order>(orderDetails);
  68. order.City = city;
  69. if (IsOrderCreated(order, city))
  70. {
  71. break;
  72. }
  73. }
  74. return order;
  75. }
  76. private bool IsOrderCreated(Order order, string city)
  77. {
  78. return order.City == city;
  79. }
  80. string BuildBasket()
  81. {
  82. var order = new CustomerBasket("9e3163b9-1ae6-4652-9dc6-7898ab7b7a00");
  83. order.Items = new List<Microsoft.eShopOnContainers.Services.Basket.API.Model.BasketItem>()
  84. {
  85. new Microsoft.eShopOnContainers.Services.Basket.API.Model.BasketItem()
  86. {
  87. Id = "1",
  88. ProductName = "ProductName",
  89. ProductId = "1",
  90. UnitPrice = 10,
  91. Quantity = 1
  92. }
  93. };
  94. return JsonConvert.SerializeObject(order);
  95. }
  96. string BuildCancelOrder(string orderId)
  97. {
  98. var order = new OrderDTO()
  99. {
  100. OrderNumber = orderId
  101. };
  102. return JsonConvert.SerializeObject(order);
  103. }
  104. string BuildCheckout(string cityExpected)
  105. {
  106. var checkoutBasket = new BasketDTO()
  107. {
  108. City = cityExpected,
  109. Street = "street",
  110. State = "state",
  111. Country = "coutry",
  112. ZipCode = "zipcode",
  113. CardNumber = "1111111111111",
  114. CardHolderName = "CardHolderName",
  115. CardExpiration = DateTime.Now.AddYears(1),
  116. CardSecurityNumber = "123",
  117. CardTypeId = 1,
  118. Buyer = "Buyer",
  119. RequestId = Guid.NewGuid()
  120. };
  121. return JsonConvert.SerializeObject(checkoutBasket);
  122. }
  123. }
  124. }