public async Task AddItemToCart_NotExistingItem_Failure()
        {
            using (var tester = new ShoppingCartTester())
            {
                // Assert
                var cart = new Cart()
                {
                    Id    = "d3ab2dfa878227b15f1a0575",
                    Items = new List <Item>()
                };

                var notExistingItemId = "00002dfa878227b15f1a0000";

                await tester.CartRepository.Add(cart);


                var addModel = new AddItemToCartRequest()
                {
                    CartId = cart.Id,
                    ItemId = notExistingItemId,
                    Amount = 3
                };

                // Act
                var(result, message) = await tester.CartService.AddItemToCart(addModel);

                // Assert
                var resultItems = tester.CartRepository.GetAll().Result.ToList();

                Assert.Empty(resultItems.First().Items);
                Assert.Null(result);
                Assert.NotNull(message);
            }
        }
        public async Task AddItemToCart(int customerId, AddItemToCartRequest request, CancellationToken cancellationToken)
        {
            var customer = await _dbContext.Customers
                           .Include(c => c.Cart)
                           .SingleOrDefaultAsync(c => c.CustomerId == customerId);

            customer.Cart.AddCartItem(request.ProductId, request.Quantity, request.Price);

            await _dbContext.SaveChangesAsync(cancellationToken);
        }
    public ActionResult AddItem(AddItemToCartRequest request)
    {
        var cart = carts.GetCart(request.CartId);
        var item = items.GetItem(request.ItemId);

        cart.AddItem(item);
        carts.Save(cart);

        // Redirect to action showing the "item added" or whatever.
    }
Exemple #4
0
        public async Task AddItemToCart_ItemAdded_ReturnsSuccess()
        {
            // we need a customer and product with ID 1.
            var customerId = 1;
            var request    = new AddItemToCartRequest
            {
                Price      = 19.99m,
                Quantity   = 2,
                ProductId  = 1,
                CustomerId = 1
            };

            var resp = await PostAsync($"api/customers/{customerId}/cart", request);

            Assert.That(resp.IsSuccessStatusCode);
        }
        public async Task <ActionResult <Cart> > AddItemToCart(AddItemToCartRequest request)
        {
            var validationError = CheckRequestValidationErrors(request);

            if (validationError != null)
            {
                return(BadRequest(validationError));
            }

            var(cart, error) = await cartService.AddItemToCart(request);

            if (error != null)
            {
                return(BadRequest(error));
            }

            return(Ok(cart));
        }
        private string CheckRequestValidationErrors(AddItemToCartRequest request)
        {
            if (request.CartId == null || request.CartId.Length != 24)
            {
                return("Cart id not valid");
            }

            if (request.ItemId == null || request.ItemId.Length != 24)
            {
                return("Item id not valid");
            }

            if (request.Amount < 1)
            {
                return("Amount should greater than zero");
            }

            return(null);
        }
Exemple #7
0
        public Either <Error, Unit> Handle(AddItemToCartRequest input)
        {
            var maybeCart = _cartRepository.Get(input.CartId);

            if (!maybeCart.TryGetValue(out var cart))
            {
                return(Either.Left <Error, Unit>(new Error.NotFound("Couldn't find the cart")));
            }

            var item = _itemRepository.Get(input.ItemId);

            if (item is null)
            {
                return(Either.Left <Error, Unit>(new Error.NotFound("Couldn't find the item")));
            }

            var rules       = _itemSaleRuleRepository.GetForItem(item.Id);
            var rulesResult = rules.Validate(cart, item, input.Quantity);


            if (rulesResult is Either <Error, Unit> .Left)
            {
                return(rulesResult);
            }

            var cartItemResult = cart.AddItemToCart(item, input.Quantity);

            if (cartItemResult is Either <Error, CartItem> .Left cartItemErrorResult)
            {
                return(Either.Left <Error, Unit>(cartItemErrorResult.Value));
            }

            _cartRepository.Save(cart);

            _listener.OnAdded(cart, item, ((Either <Error, CartItem> .Right)cartItemResult).Value);

            return(Either.Right <Error, Unit>(Unit.Instance));
        }
        public async Task AddItemToCart_NotExistingCart_Failure()
        {
            using (var tester = new ShoppingCartTester())
            {
                // Assert
                var cartId = "16a70cb62d6a2ff9bfffe180";

                var item1 = new Item()
                {
                    Name        = "Rose",
                    Description = "Red",
                    Quantity    = 10,
                    Price       = 5
                };

                await tester.ItemRepository.Add(item1);

                tester.StockCache.SetStock(item1.Id, item1.Quantity);

                var addModel = new AddItemToCartRequest()
                {
                    CartId = cartId,
                    ItemId = item1.Id,
                    Amount = 3
                };

                // Act
                var(result, message) = await tester.CartService.AddItemToCart(addModel);

                // Assert
                var cartFromDb = tester.CartRepository.Find(cartId).Result;

                Assert.Null(result);
                Assert.NotNull(message);
                Assert.Null(cartFromDb);
            }
        }
        public Either <Error, Unit> Handle(AddItemToCartRequest input)
        {
            var maybeCart = _cartRepository.Get(input.CartId);

            if (!maybeCart.TryGetValue(out var cart))
            {
                return(Either.Left <Error, Unit>(new Error.NotFound("Couldn't find the cart")));
            }
            var item = _itemRepository.Get(input.ItemId);

            if (item is null)
            {
                return(Either.Left <Error, Unit>(new Error.NotFound("Couldn't find the item")));
            }

            var rules = _itemSaleRuleRepository.GetForItem(item.Id);

            return(rules
                   .Validate(cart, item, input.Quantity)
                   .FlatMap(_ => cart.AddItemToCart(item, input.Quantity))
                   .Do(_ => _cartRepository.Save(cart))
                   .Do(cartItem => _listener.OnAdded(cart, item, cartItem))
                   .Map(_ => Unit.Instance));
        }
Exemple #10
0
 public IHttpActionResult AddItemToCart([FromBody] AddItemToCartRequest request)
 {
     return(this.Ok(this.cartService.AddItemToActiveCart(request.UserId, request.ProductId, request.Quantity)));
 }
        public async Task <IActionResult> AddToCart(int customerId, [FromBody] AddItemToCartRequest cartItem, CancellationToken cancellationToken)
        {
            await _customerService.AddItemToCart(customerId, cartItem, cancellationToken);

            return(Ok());
        }
Exemple #12
0
        public AddItemToCartResponse AddItemToCart(AddItemToCartRequest addItemToCartRequest)
        {
            AddItemToCartResponse response = new AddItemToCartResponse();

            var cart = GetCart();

            if (cart != null)
            {
                var existingCartItem = _cartItemRepository.FindCartItemsByCartId(cart.Id)
                                       .FirstOrDefault(c => c.ProductId == addItemToCartRequest.ProductId);
                if (existingCartItem != null)
                {
                    existingCartItem.Quantity++;
                    _cartItemRepository.UpdateCartItem(existingCartItem);

                    response.CartItem = _messageMapper.MapToCartItemDto(existingCartItem);
                }
                else
                {
                    var product = _productRepository.FindProductById(addItemToCartRequest.ProductId);

                    if (product != null)
                    {
                        var cartItem = new CartItem
                        {
                            CartId    = cart.Id,
                            Cart      = cart,
                            ProductId = addItemToCartRequest.ProductId,
                            Product   = product,
                            Quantity  = 1
                        };
                        _cartItemRepository.SaveCartItem(cartItem);
                        response.CartItem = _messageMapper.MapToCartItemDto(cartItem);
                    }
                }
            }
            else
            {
                var product = _productRepository.FindProductById(addItemToCartRequest.ProductId);
                if (product != null)
                {
                    var newCart = new Cart
                    {
                        UniqueCartId = UniqueCartId(),
                        CartStatus   = CartStatus.Open
                    };

                    _cartRepository.SaveCart(newCart);

                    var cartItem = new CartItem
                    {
                        CartId    = newCart.Id,
                        Cart      = newCart,
                        ProductId = addItemToCartRequest.ProductId,
                        Product   = product,
                        Quantity  = 1
                    };

                    _cartItemRepository.SaveCartItem(cartItem);

                    response.CartItem = _messageMapper.MapToCartItemDto(cartItem);
                }
            }
            return(response);
        }
Exemple #13
0
        public ActionResult <AddItemToCartResponse> AddItemToCart(AddItemToCartRequest addItemToCartRequest)
        {
            var addItemToCartResponse = _cartService.AddItemToCart(addItemToCartRequest);

            return(addItemToCartResponse);
        }
        public async Task AddItemToCart_EmptyCart_ExistingItem_SufficientQuantity_Success()
        {
            using (var tester = new ShoppingCartTester())
            {
                // Assert
                var cartId = "16a70cb62d6a2ff9bfffe180";

                var cart = new Cart()
                {
                    Id    = cartId,
                    Items = new List <Item>()
                };

                var item1 = new Item()
                {
                    Name        = "Rose",
                    Description = "Red",
                    Quantity    = 10,
                    Price       = 5
                };

                var item2 = new Item()
                {
                    Name        = "Daisy",
                    Description = "White",
                    Quantity    = 3,
                    Price       = 2
                };

                await tester.CartRepository.Add(cart);

                await tester.ItemRepository.Add(item1);

                await tester.ItemRepository.Add(item2);

                tester.StockCache.SetStock(item1.Id, item1.Quantity);
                tester.StockCache.SetStock(item2.Id, item2.Quantity);

                var addModel = new AddItemToCartRequest()
                {
                    CartId = cart.Id,
                    ItemId = item1.Id,
                    Amount = 3
                };

                // Act
                var(result, message) = await tester.CartService.AddItemToCart(addModel);

                // Assert
                var cartFromDb     = tester.CartRepository.Find(cartId).Result;
                var remainingStock = tester.StockCache.GetStock(item1.Id);

                Assert.NotNull(result);
                Assert.Null(message);
                Assert.NotNull(cartFromDb);
                Assert.Equal(cart.Id, cartFromDb.Id);
                Assert.Single(cartFromDb.Items);
                Assert.Equal(item1.Id, cartFromDb.Items.First().Id);
                Assert.Equal(3, cartFromDb.Items.First().Quantity);
                Assert.Equal(7, remainingStock);
            }
        }
        public ActionResult <AddItemToCartResponse> AddItemToCart(AddItemToCartRequest request)
        {
            var response = _service.AddItemToCart(request);

            return(response);
        }
 public void Post([FromBody] AddItemToCartRequest request)
 {
 }