public AvailabilityCheckResults CanAddItemsToBasketCheck( string userId, List <BasketItem> products) { var results = new AvailabilityCheckResults(); foreach (var addToBasketItem in products) { var product = _stockRepository.GetStockItem(addToBasketItem.ProductId); if (product == null) { results.Result = AvailabilityCheckStatus.ProductsNotFound; results.ProductsNotFound.Add(addToBasketItem.ProductId); continue; } var basketItem = _basketRepository.GetBasketItem(userId, addToBasketItem.ProductId); if (!product.HasSufficientStockFor(basketItem.ItemCount + addToBasketItem.ItemCount)) { results.Result = AvailabilityCheckStatus.InsufficientStock; results.ProductsNotAvailable.Add(product.Name); continue; } } return(results); }
public void ShouldAddToBasketRequestWhenCanAddItemsToBasket() { var userName = "******"; var productsToAdd = new List <BasketItem>(); var check = new AvailabilityCheckResults(); var basket = new List <BasketItem>(); _bulkAddCommand .CanAddItemsToBasketCheck(userName, productsToAdd) .Returns(check); _bulkAddCommand .AddItemsToBasket(userName, productsToAdd) .Returns(basket); _controller .BulkAddToBasket(userName, productsToAdd) .ShouldBeOfType <JsonResult>() .Value.ShouldBeOfType <List <BasketItem> >(); _bulkAddCommand .Received() .AddItemsToBasket(userName, productsToAdd); }
private IActionResult GetFailureResponseForCheck(AvailabilityCheckResults check) { switch (check.Result) { case AvailabilityCheckStatus.Ok: return(null); case AvailabilityCheckStatus.ProductsNotFound: return(BadRequest("Products not found: " + string.Join(", ", check.ProductsNotFound))); case AvailabilityCheckStatus.InsufficientStock: return(BadRequest("Not Enough Stock for item(s): " + string.Join(", ", check.ProductsNotAvailable))); default: throw new ApplicationException("Unhandled enumeration value: " + check); } }
public void ShouldReturnBadRequestWhenItemsWithInsufficientStock() { var userName = "******"; var productsToAdd = new List <BasketItem>(); var check = new AvailabilityCheckResults(); check.Result = AvailabilityCheckStatus.InsufficientStock; check.ProductsNotAvailable.Add("product"); _checkoutCommand .CanCheckoutBasketCheck(userName) .Returns(check); _controller .CheckoutBasket(userName) .ShouldBeOfType <BadRequestObjectResult>() .Value.ShouldBeOfType <string>() .ShouldStartWith("Not Enough Stock for item(s): "); }
public void ShouldReturnBadRequestWhenItemsNotFound() { var userName = "******"; var productsToAdd = new List <BasketItem>(); var check = new AvailabilityCheckResults(); check.Result = AvailabilityCheckStatus.ProductsNotFound; check.ProductsNotFound.Add(1); _checkoutCommand .CanCheckoutBasketCheck(userName) .Returns(check); _controller .CheckoutBasket(userName) .ShouldBeOfType <BadRequestObjectResult>() .Value.ShouldBeOfType <string>() .ShouldStartWith("Products not found: "); }
public void ShouldReturnInvoiceAndDeductStockWhenSuccesful() { var userName = "******"; var productsToAdd = new List <BasketItem>(); var check = new AvailabilityCheckResults(); var invoice = new Invoice(); _checkoutCommand .CanCheckoutBasketCheck(userName) .Returns(check); _checkoutCommand .CheckoutBasket(userName) .Returns(invoice); _controller .CheckoutBasket(userName) .ShouldBeOfType <JsonResult>() .Value.ShouldBeOfType <Invoice>() .ShouldBe(invoice); }