using Microsoft.eShopOnContainers.Services.Basket.API.Model; //using Microsoft.eShopOnContainers.Services.Ordering.API.Application.Queries; using Microsoft.eShopOnContainers.WebMVC.ViewModels; using Newtonsoft.Json; using Ordering.FunctionalTests.Base; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Text; using System.Threading.Tasks; using WebMVC.Models; using Xunit; namespace Ordering.FunctionalTests { public class OrderingScenarios : OrderingScenariosBase { [Fact] public async Task Cancel_basket_and_check_order_status_cancelled() { using (var orderServer = new OrderingScenariosBase().CreateServer()) using (var basketServer = new BasketScenariosBase().CreateServer()) { // Expected data var cityExpected = $"city-{Guid.NewGuid()}"; var orderStatusExpected = "cancelled"; var basketClient = basketServer.CreateIdempotentClient(); var orderClient = orderServer.CreateIdempotentClient(); // GIVEN a basket is created var contentBasket = new StringContent(BuildBasket(), UTF8Encoding.UTF8, "application/json"); await basketClient.PostAsync(BasketScenariosBase.Post.CreateBasket, contentBasket); // AND basket checkout is sent await basketClient.PostAsync(BasketScenariosBase.Post.Checkout, new StringContent(BuildCheckout(cityExpected), UTF8Encoding.UTF8, "application/json")); // WHEN Order is created in Ordering.api var newOrder = await TryGetNewOrderCreated(cityExpected, orderClient); // AND Order is cancelled in Ordering.api await orderClient.PutAsync(OrderingScenariosBase.Put.CancelOrder, new StringContent(BuildCancelOrder(newOrder.OrderNumber), UTF8Encoding.UTF8, "application/json")); // AND the requested order is retrieved var order = await TryGetNewOrderCreated(cityExpected, orderClient); // THEN check status Assert.Equal(orderStatusExpected, order.Status); } } [Fact] public async Task Get_get_all_stored_orders_and_response_ok_status_code() { using (var server = CreateServer()) { var response = await server.CreateClient() .GetAsync(Get.Orders); response.EnsureSuccessStatusCode(); } } [Fact] public async Task Cancel_order_no_order_created_bad_request_response() { using (var server = CreateServer()) { var content = new StringContent(BuildOrder(), UTF8Encoding.UTF8, "application/json"); var response = await server.CreateIdempotentClient() .PutAsync(Put.CancelOrder, content); Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); } } [Fact] public async Task Ship_order_no_order_created_bad_request_response() { using (var server = CreateServer()) { var content = new StringContent(BuildOrder(), UTF8Encoding.UTF8, "application/json"); var response = await server.CreateIdempotentClient() .PutAsync(Put.ShipOrder, content); Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); } } string BuildOrder() { var order = new OrderDTO() { OrderNumber = "-1" }; return JsonConvert.SerializeObject(order); } private async Task TryGetNewOrderCreated(string city, HttpClient orderClient) { var counter = 0; Order order = null; while (counter < 20) { //get the orders and verify that the new order has been created var ordersGetResponse = await orderClient.GetStringAsync(OrderingScenariosBase.Get.Orders); var orders = JsonConvert.DeserializeObject>(ordersGetResponse); if (orders == null || orders.Count == 0) { counter++; await Task.Delay(100); continue; } var lastOrder = orders.OrderByDescending(o => o.Date).First(); int.TryParse(lastOrder.OrderNumber, out int id); var orderDetails = await orderClient.GetStringAsync(OrderingScenariosBase.Get.OrderBy(id)); order = JsonConvert.DeserializeObject(orderDetails); if (IsOrderCreated(order, city)) { break; } } return order; } private bool IsOrderCreated(Order order, string city) { return order.City == city; } string BuildBasket() { var order = new CustomerBasket("9e3163b9-1ae6-4652-9dc6-7898ab7b7a00"); order.Items = new List() { new Microsoft.eShopOnContainers.Services.Basket.API.Model.BasketItem() { Id = "1", ProductName = "ProductName", ProductId = "1", UnitPrice = 10, Quantity = 1 } }; return JsonConvert.SerializeObject(order); } string BuildCancelOrder(string orderId) { var order = new OrderDTO() { OrderNumber = orderId }; return JsonConvert.SerializeObject(order); } string BuildCheckout(string cityExpected) { var checkoutBasket = new BasketDTO() { City = cityExpected, Street = "street", State = "state", Country = "coutry", ZipCode = "zipcode", CardNumber = "1111111111111", CardHolderName = "CardHolderName", CardExpiration = DateTime.Now.AddYears(1), CardSecurityNumber = "123", CardTypeId = 1, Buyer = "Buyer", RequestId = Guid.NewGuid() }; return JsonConvert.SerializeObject(checkoutBasket); } } }