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.

185 lines
6.5 KiB

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