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);
            }