예제 #1
0
        /// <summary>
        /// Attempt to update the retained quantity of a given product
        /// </summary>
        /// <param name="quantity"></param>
        /// <param name="productId"></param>
        /// <param name="product"></param>
        /// <param name="error"></param>
        /// <returns></returns>
        public bool TryUpdateRetained(int quantity, int productId, out Product product, out CartOperationError error)
        {
            error   = new CartOperationError();
            product = null;
            var productCacheKey = ProductCacheKey(productId);

            if (!memoryCache.TryGetValue(productCacheKey, out product))
            {
                error.StatusCode = 404;
                error.Message    = "Product not found";
                return(false);
            }

            var remaining = product.Stock - product.Retained;

            if (quantity > 0 && quantity > remaining)
            {
                error.StatusCode = 400;
                error.Message    = "Quantity too large requested";
                return(false);
            }

            product.Retained += quantity;
            memoryCache.Set(productCacheKey, product);

            return(true);
        }
        public void RemoveCartItemTestCaseOk()
        {
            var cart = new Cart
            {
                Id        = "123",
                CartItems = new Dictionary <int, CartItem> {
                    { 42, new CartItem {
                          ProductId = 42, Quantity = 2
                      } },
                    { 43, new CartItem {
                          ProductId = 43, Quantity = 2
                      } }
                }
            };
            var obj = (object)cart;

            memoryCache.Setup(x => x.TryGetValue(It.IsAny <string>(), out obj)).Returns(true);
            var product = new Product();
            var error   = new CartOperationError();

            productCacheService
            .Setup(x => x.TryUpdateRetained(It.IsAny <int>(), It.IsAny <int>(), out product, out error))
            .Returns(true);
            var service = new CustomerCartService(memoryCache.Object, hub.Object, productCacheService.Object);

            Assert.NotNull(service.RemoveCartItem("123", 42, out error));
            Assert.AreEqual(1, cart.CartItems.Count);
        }
        public void SetCartItemCaseInvalidQuantity()
        {
            var service = new CustomerCartService(memoryCache.Object, hub.Object, productCacheService.Object);
            var error   = new CartOperationError();

            Assert.Null(service.SetCartItem("123", new CartItem {
                Quantity = 0
            }, out error));
            Assert.AreEqual(400, error.StatusCode);
        }
        public void ClearCartTestCaseNotFound()
        {
            var cart = new Cart();
            var obj  = (object)cart;

            memoryCache.Setup(x => x.TryGetValue(It.IsAny <string>(), out obj)).Returns(false);
            var service = new CustomerCartService(memoryCache.Object, hub.Object, productCacheService.Object);
            var error   = new CartOperationError();

            Assert.Null(service.ClearCart("123", out error));
        }
        public void SetCartItemCaseProductNotFound()
        {
            repository.Setup(x => x.Find(It.IsAny <int>())).Returns((Product)null);
            var service = new CustomerCartService(memoryCache.Object, hub.Object, productCacheService.Object);
            var error   = new CartOperationError();

            Assert.Null(service.SetCartItem("123", new CartItem {
                Quantity = 1, ProductId = 42
            }, out error));
            Assert.AreEqual(400, error.StatusCode);
        }
        public void RemoveCartItemTestCaseCartNotFound()
        {
            var cart = new Cart();
            var obj  = (object)cart;

            memoryCache.Setup(x => x.TryGetValue(It.IsAny <string>(), out obj)).Returns(false);
            var service = new CustomerCartService(memoryCache.Object, hub.Object, productCacheService.Object);
            var error   = new CartOperationError();

            Assert.Null(service.RemoveCartItem("123", 42, out error));
            Assert.AreEqual(404, error.StatusCode);
        }
        public void RemoveCartItemTestCaseProductNotInCart()
        {
            var cart = new Cart
            {
                Id        = "123",
                CartItems = new Dictionary <int, CartItem>()
            };
            var obj = (object)cart;

            memoryCache.Setup(x => x.TryGetValue(It.IsAny <string>(), out obj)).Returns(true);
            var service = new CustomerCartService(memoryCache.Object, hub.Object, productCacheService.Object);
            var error   = new CartOperationError();

            Assert.Null(service.RemoveCartItem("123", 42, out error));
            Assert.AreEqual(400, error.StatusCode);
        }
        public void ClearCartTestCaseOk()
        {
            var cart = new Cart
            {
                CartItems = new Dictionary <int, CartItem> {
                    { 42, new CartItem() }
                }
            };
            var obj     = (object)cart;
            var error   = new CartOperationError();
            var product = new Product();

            memoryCache.Setup(x => x.TryGetValue(It.IsAny <string>(), out obj)).Returns(true);
            productCacheService
            .Setup(x => x.TryUpdateRetained(It.IsAny <int>(), It.IsAny <int>(), out product, out error))
            .Returns(true);
            var service = new CustomerCartService(memoryCache.Object, hub.Object, productCacheService.Object);

            Assert.NotNull(service.ClearCart("123", out error));
            Assert.IsEmpty(cart.CartItems);
        }