public async Task ValidateItemQtyAdjustment_LineItemIsReadOnly_Invalid()
        {
            // Arrange
            var aggregate = GetValidCartAggregate();

            var lineItem = _fixture
                           .Build <LineItem>()
                           .With(x => x.IsReadOnly, true)
                           .Create();

            aggregate.Cart.Items = new List <LineItem> {
                lineItem
            };

            var item = _fixture
                       .Build <ItemQtyAdjustment>()
                       .With(x => x.LineItemId, lineItem.Id)
                       .With(x => x.LineItem, lineItem)
                       .Create();

            var validator = new ItemQtyAdjustmentValidator();

            // Act
            var result = await validator.ValidateAsync(item);

            var expected = CartErrorDescriber.LineItemIsReadOnly(lineItem);

            // Assert
            result.Errors.Should().Contain(x =>
                                           x.ErrorMessage == expected.ErrorMessage &&
                                           x.ErrorCode == expected.ErrorCode);
        }
        public async Task ValidateItemQtyAdjustment_ProductAvailable_Valid()
        {
            // Arrange
            var aggregate = GetValidCartAggregate();

            var lineItem = _fixture.Create <LineItem>();

            lineItem.IsGift = false;

            aggregate.Cart.Items = new List <LineItem> {
                lineItem
            };

            var item = _fixture
                       .Build <ItemQtyAdjustment>()
                       .With(x => x.LineItemId, lineItem.Id)
                       .With(x => x.NewQuantity, lineItem.Quantity) // Request max quantity of line item
                       .Create();

            var validator = new ItemQtyAdjustmentValidator();

            // Act
            var result = await validator.ValidateAsync(item);

            // Assert
            result.IsValid.Should().BeTrue();
        }
        public async Task ValidateItemQtyAdjustment_ProductIsUnavailable_Invalid()
        {
            // Arrange
            var aggregate = GetValidCartAggregate();

            var lineItem = _fixture.Create <LineItem>();

            aggregate.Cart.Items = new List <LineItem> {
                lineItem
            };

            var item = _fixture
                       .Build <ItemQtyAdjustment>()
                       .With(x => x.LineItemId, lineItem.Id)
                       .Create();

            var validator = new ItemQtyAdjustmentValidator();

            // Act
            var result = await validator.ValidateAsync(item);

            var expected = CartErrorDescriber.ProductQtyInsufficientError(
                item.CartProduct,
                item.NewQuantity,
                item.CartProduct.AvailableQuantity);

            // Assert
            result.Errors.Should().Contain(x =>
                                           x.ErrorMessage == expected.ErrorMessage &&
                                           x.ErrorCode == expected.ErrorCode);
        }
        public async Task ValidateItemQtyAdjustment_CartProductIsNull_Invalid()
        {
            // Arrange
            var item = _fixture.Create <ItemQtyAdjustment>();

            item.CartProduct = null;

            var validator = new ItemQtyAdjustmentValidator();

            // Act
            var result = await validator.ValidateAsync(item);

            // Assert
            result.IsValid.Should().BeFalse();
            result.Errors.Should().Contain(x => x.PropertyName == "CartProduct" && x.ErrorCode.Contains("NotNullValidator"));
        }
        public async Task ValidateItemQtyAdjustment_NewQuantityLessOrEqualZero_Invalid(int newQuantity)
        {
            // Arrange
            var item = _fixture.Create <ItemQtyAdjustment>();

            item.NewQuantity = newQuantity;

            var validator = new ItemQtyAdjustmentValidator();

            // Act
            var result = await validator.ValidateAsync(item);

            // Assert
            result.IsValid.Should().BeFalse();
            result.Errors.Should().Contain(x => x.PropertyName == "NewQuantity" && x.ErrorCode.Contains("GreaterThanValidator"));
        }
        public async Task ValidateItemQtyAdjustment_LineItemIdIsNull_Invalid()
        {
            // Arrange
            var item = _fixture.Create <ItemQtyAdjustment>();

            item.LineItemId = null;

            var aggregate = GetValidCartAggregate();
            var validator = new ItemQtyAdjustmentValidator(aggregate);

            // Act
            var result = await validator.ValidateAsync(item);

            // Assert
            result.IsValid.Should().BeFalse();
            result.Errors.Should().Contain(x => x.PropertyName == "LineItemId" && x.ErrorCode == nameof(NotNullValidator));
        }
        public async Task ValidateItemQtyAdjustment_LineItemNotFound_Invalid()
        {
            // Arrange
            var item = _fixture.Create <ItemQtyAdjustment>();

            item.LineItem = null;
            var validator = new ItemQtyAdjustmentValidator();

            // Act
            var result = await validator.ValidateAsync(item);

            var expected = CartErrorDescriber.LineItemWithGivenIdNotFound(new LineItem
            {
                Id = item.LineItemId
            });

            // Assert
            result.Errors.Should().Contain(x =>
                                           x.ErrorMessage == expected.ErrorMessage &&
                                           x.ErrorCode == expected.ErrorCode);
        }
        public async Task ValidateItemQtyAdjustment_LineItemNotFound_Invalid()
        {
            // Arrange
            var item      = _fixture.Create <ItemQtyAdjustment>();
            var aggregate = GetValidCartAggregate();

            aggregate.Cart.Items = Enumerable.Empty <LineItem>().ToList();
            var validator = new ItemQtyAdjustmentValidator(aggregate);

            // Act
            var result = await validator.ValidateAsync(item);

            var expected = CartErrorDescriber.LineItemWithGivenIdNotFound(new LineItem
            {
                Id = item.LineItemId
            });

            // Assert
            result.Errors.Should().Contain(x =>
                                           x.ErrorMessage == expected.ErrorMessage &&
                                           x.ErrorCode == expected.ErrorCode);
        }