public async Task AddItemToCart_When_CartNotFound_Then_ExceptionIsThrown()
        {
            // Arrange
            dataProvider.Setup(x => x.ProvideAsync())
            .ReturnsAsync(Enumerable.Empty <Cart>());

            var repository = new InMemoryCartRepository(dataProvider.Object);

            // Act
            await repository.AddItemToCartAsync(string.Empty, (x) => Task.FromResult(null as Product), null);

            // Assert Exception
        }
        public async Task AddItemToCart_When_CartIsCheckedOut_Then_ExceptionIsThrown()
        {
            // Arrange
            fixture.Customize <Cart>().Set(x => x.IsCheckedOut, true);
            var cart = fixture.Generate <Cart>();

            dataProvider.Setup(x => x.ProvideAsync())
            .ReturnsAsync(new List <Cart> {
                cart
            });

            var repository = new InMemoryCartRepository(dataProvider.Object);

            // Act
            await repository.AddItemToCartAsync(cart.Name, (x) => Task.FromResult(null as Product), null);

            //Assert Exception
        }
        public async Task AddItemToCart_When_ProductNotFound_Then_ExceptionIsThrown()
        {
            // Arrange
            fixture.Customize <Cart>().Set(x => x.IsCheckedOut, false);
            var cart = fixture.Generate <Cart>();

            dataProvider.Setup(x => x.ProvideAsync())
            .ReturnsAsync(new List <Cart> {
                cart
            });

            var repository = new InMemoryCartRepository(dataProvider.Object);

            // Act
            await repository.AddItemToCartAsync(cart.Name, (x) => throw new ProdcutNotFoundException(), fixture.Generate <CartItem>());

            //Assert Exception
        }
        public async Task AddItemToCart_When_ProductOutOfStock_Then_ExceptionIsThrown()
        {
            // Arrange
            fixture.Customize <Cart>().Set(x => x.IsCheckedOut, false);
            var cart     = fixture.Generate <Cart>();
            var cartItem = fixture.Generate <CartItem>();

            dataProvider.Setup(x => x.ProvideAsync())
            .ReturnsAsync(new List <Cart> {
                cart
            });

            var repository = new InMemoryCartRepository(dataProvider.Object);

            // Act
            await repository.AddItemToCartAsync(cart.Name,
                                                (x) => Task.FromResult(fixture.Generate <Product>(constraints: new { Stock = cartItem.Quantity - 1 })),
                                                cartItem);

            // Assert Exception
        }
        public async Task AddItemToCart_When_DataIsValid_Then_ItemIsAdded()
        {
            // Arrange
            fixture.Customize <Cart>().Set(x => x.IsCheckedOut, false);
            var cart     = fixture.Generate <Cart>();
            var cartItem = fixture.Generate <CartItem>();

            dataProvider.Setup(x => x.ProvideAsync())
            .ReturnsAsync(new List <Cart> {
                cart
            });

            var repository = new InMemoryCartRepository(dataProvider.Object);

            // Act
            await repository.AddItemToCartAsync(cart.Name,
                                                (x) => Task.FromResult(fixture.Generate <Product>(constraints: new { Stock = cartItem.Quantity })),
                                                cartItem);

            // Assert
            cart.Items.Should().Contain(cartItem);
        }