|
|
- 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<Order> 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<List<Order>>(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<Order>(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<Microsoft.eShopOnContainers.Services.Basket.API.Model.BasketItem>()
- {
- 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);
- }
- }
- }
|