Example #1
0
        public async Task SubtractAvailabilityAsync_ShouldFail_WhenValueToSubtractIsBiggerThanProductAvailableValue()
        {
            // Arrange
            _fixture.Behaviors.Add(new OmitOnRecursionBehavior());
            var subtractProductAvailabilities = _fixture.Create <IReadOnlyCollection <SubtractProductAvailability> >();
            var product = _fixture.Create <Product>();

            product.Id = subtractProductAvailabilities.First().Id;
            product.AvailableQuantity = 0;

            var expectedResult = new ExceededProductQuantityException(product.Name, product.PackageType,
                                                                      product.AvailableQuantity, subtractProductAvailabilities.First().SubtractQuantity);

            _productRepository.GetAsync(subtractProductAvailabilities.Select(_ => _.Id).ToList())
            .ReturnsForAnyArgs(new List <Product> {
                product
            });

            // Act
            var result = await Assert.ThrowsAnyAsync <ExceededProductQuantityException>(async() =>
                                                                                        await _sut.SubtractAvailabilityAsync(subtractProductAvailabilities));

            // Assert
            Assert.Equal(expectedResult.Message, result.Message);
        }
        public async Task CreateAsync_ShouldFailAndDeleteOrder_WhenOrderedProductsExceedAvailability()
        {
            // Arrange
            var cartOverview          = _fixture.Create <CartOverview>();
            var payment               = _fixture.Create <PaymentDto>();
            var address               = _fixture.Create <AddressDto>();
            var productAvailabilities = _fixture.CreateMany <SubtractProductAvailability>();

            _fixture.Behaviors.Add(new OmitOnRecursionBehavior());

            var order          = _fixture.Create <Order>();
            var product        = order.OrderProducts.First().Product;
            var expectedResult =
                new ExceededProductQuantityException(product.Name, product.PackageType, product.AvailableQuantity, 1);

            _orderRepository.CreateAsync(new Order()).ReturnsForAnyArgs(order);
            _productService.SubtractAvailabilityAsync(productAvailabilities.ToList()).ThrowsForAnyArgs(expectedResult);

            // Act
            var result = await Assert.ThrowsAsync <ExceededProductQuantityException>(async() => await _sut.CreateAsync(cartOverview, address, payment));

            // Assert
            result.Should().BeEquivalentTo(expectedResult);
            await _orderRepository.Received(1).DeleteAsync(order);
        }
        public async Task AddProductAsync_ShouldFail_WhenCartHasProductAndProductQuantityExceedsAvailability()
        {
            // Arrange
            _fixture.Behaviors.Add(new OmitOnRecursionBehavior());

            var cart    = _fixture.Create <Cart>();
            var product = _fixture.Create <Product>();

            cart.CartProducts.Add(new CartProduct
            {
                ProductId = product.Id,
                CartId    = cart.Id,
                Quantity  = product.AvailableQuantity
            });
            var requestedQuantity = _fixture.Create <int>() + product.AvailableQuantity;
            var expectedResult    = new ExceededProductQuantityException(product.Name, product.PackageType,
                                                                         product.AvailableQuantity, requestedQuantity);

            _cartRepository.GetAsync(cart.Id).Returns(cart);
            _productRepository.GetAsync(product.Id).Returns(product);

            // Act
            var result = await Assert.ThrowsAsync <ExceededProductQuantityException>(async() => await _sut.AddProductAsync(cart.Id, product.Id, requestedQuantity));

            // Assert
            Assert.Equal(expectedResult.Message, result.Message);
        }