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 CreateCart_WithoutItem_Success()
        {
            using (var tester = new ShoppingCartTester())
            {
                // Assert
                var cart = new Cart()
                {
                    Id    = "d3ab2dfa878227b15f1a0575",
                    Items = new List <Item>()
                };

                // Act
                await tester.CartRepository.Add(cart);

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

                Assert.Equal(1, resultItems.Count);
                Assert.Equal(cart.Id, resultItems.First().Id);
            }
        }
        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 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);
            }
        }