using FunctionalTests.Services.Basket;
|
|
using FunctionalTests.Services.Catalog;
|
|
using Microsoft.eShopOnContainers.Services.Basket.API.Model;
|
|
using Microsoft.eShopOnContainers.Services.Catalog.API.Model;
|
|
using Microsoft.eShopOnContainers.Services.Catalog.API.ViewModel;
|
|
using Newtonsoft.Json;
|
|
using System;
|
|
using System.Linq;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using Xunit;
|
|
using System.Net.Http;
|
|
using System.Threading;
|
|
|
|
namespace FunctionalTests.Services
|
|
{
|
|
public class IntegrationEventsScenarios
|
|
{
|
|
[Fact]
|
|
public async Task Post_update_product_price_and_catalog_and_basket_list_modified()
|
|
{
|
|
decimal priceModification = 0.15M;
|
|
string userId = "JohnId";
|
|
|
|
using (var catalogServer = new CatalogScenariosBase().CreateServer())
|
|
using (var basketServer = new BasketScenariosBase().CreateServer())
|
|
{
|
|
var catalogClient = catalogServer.CreateClient();
|
|
var basketClient = basketServer.CreateClient();
|
|
|
|
// GIVEN a product catalog list
|
|
var originalCatalogProducts = await GetCatalogAsync(catalogClient);
|
|
|
|
// AND a user basket filled with products
|
|
var basket = ComposeBasket(userId, originalCatalogProducts.Data.Take(3));
|
|
var res = await basketClient.PostAsync(
|
|
BasketScenariosBase.Post.CreateBasket,
|
|
new StringContent(JsonConvert.SerializeObject(basket), UTF8Encoding.UTF8, "application/json")
|
|
);
|
|
|
|
// WHEN the price of one product is modified in the catalog
|
|
var itemToModify = basket.Items[2];
|
|
var oldPrice = itemToModify.UnitPrice;
|
|
var newPrice = oldPrice + priceModification;
|
|
var pRes = await catalogClient.PutAsync(CatalogScenariosBase.Put.UpdateCatalogProduct, new StringContent(ChangePrice(itemToModify, newPrice, originalCatalogProducts), UTF8Encoding.UTF8, "application/json"));
|
|
|
|
var modifiedCatalogProducts = await GetCatalogAsync(catalogClient);
|
|
|
|
var itemUpdated = await GetUpdatedBasketItem(newPrice, itemToModify.ProductId, userId, basketClient);
|
|
|
|
if (itemUpdated == null)
|
|
{
|
|
Assert.False(true, $"The basket service has not been updated.");
|
|
}
|
|
else
|
|
{
|
|
//THEN the product price changes in the catalog
|
|
Assert.Equal(newPrice, modifiedCatalogProducts.Data.Single(it => it.Id == int.Parse(itemToModify.ProductId)).Price);
|
|
|
|
// AND the products in the basket reflects the changed priced and the original price
|
|
Assert.Equal(newPrice, itemUpdated.UnitPrice);
|
|
Assert.Equal(oldPrice, itemUpdated.OldUnitPrice);
|
|
}
|
|
}
|
|
}
|
|
|
|
private async Task<BasketItem> GetUpdatedBasketItem(decimal newPrice, string productId, string userId, HttpClient basketClient)
|
|
{
|
|
bool continueLoop = true;
|
|
var counter = 0;
|
|
BasketItem itemUpdated = null;
|
|
|
|
while (continueLoop && counter < 20)
|
|
{
|
|
//get the basket and verify that the price of the modified product is updated
|
|
var basketGetResponse = await basketClient.GetAsync(BasketScenariosBase.Get.GetBasketByCustomer(userId));
|
|
var basketUpdated = JsonConvert.DeserializeObject<CustomerBasket>(await basketGetResponse.Content.ReadAsStringAsync());
|
|
|
|
itemUpdated = basketUpdated.Items.Single(pr => pr.ProductId == productId);
|
|
|
|
if (itemUpdated.UnitPrice == newPrice)
|
|
{
|
|
continueLoop = false;
|
|
}
|
|
else
|
|
{
|
|
counter++;
|
|
await Task.Delay(100);
|
|
}
|
|
}
|
|
|
|
return itemUpdated;
|
|
}
|
|
|
|
private async Task<PaginatedItemsViewModel<CatalogItem>> GetCatalogAsync(HttpClient catalogClient)
|
|
{
|
|
var response = await catalogClient.GetAsync(CatalogScenariosBase.Get.Items);
|
|
var items = await response.Content.ReadAsStringAsync();
|
|
return JsonConvert.DeserializeObject<PaginatedItemsViewModel<CatalogItem>>(items);
|
|
}
|
|
|
|
private string ChangePrice(BasketItem itemToModify, decimal newPrice, PaginatedItemsViewModel<CatalogItem> catalogProducts)
|
|
{
|
|
var catalogProduct = catalogProducts.Data.Single(pr => pr.Id == int.Parse(itemToModify.ProductId));
|
|
catalogProduct.Price = newPrice;
|
|
return JsonConvert.SerializeObject(catalogProduct);
|
|
}
|
|
|
|
private CustomerBasket ComposeBasket(string customerId, IEnumerable<CatalogItem> items)
|
|
{
|
|
var basket = new CustomerBasket(customerId);
|
|
foreach (var item in items)
|
|
{
|
|
basket.Items.Add(new BasketItem()
|
|
{
|
|
Id = Guid.NewGuid().ToString(),
|
|
UnitPrice = item.Price,
|
|
PictureUrl = item.PictureUri,
|
|
ProductId = item.Id.ToString(),
|
|
OldUnitPrice = 0,
|
|
ProductName = item.Name,
|
|
Quantity = 1
|
|
});
|
|
}
|
|
return basket;
|
|
}
|
|
}
|
|
}
|