コード例 #1
0
        public async Task itemItemsAreValidated()
        {
            var currentInstant  = Instant.FromUtc(2017, 08, 17, 12, 0, 0);
            var fakeClock       = new FakeClock(currentInstant);
            var headerValidator = new OrderHeaderValidator(fakeClock) as IMessageValidator <OrderHeader>;
            var itemValidator   = new itemItemValidator() as IMessageValidator <ItemAsset>;
            var validator       = new ItemOutValidator(itemValidator);
            var header          = new OrderHeader {
                OrderId = "ABC123", OrderDate = currentInstant.ToDateTimeUtc()
            };
            var item = new List <ItemAsset>();

            item.Add(new ItemAsset {
                Name = "Item", Location = null
            });

            var target = new LineItem
            {
                Assets = item
            };

            var result = await validator.ValidateAsync(target);

            var failurePath = $"{ nameof(LineItem.Assets) }[0].{ nameof(ItemAsset.Location) }";

            result.Should().NotBeNull("because a validation result should have been returned");
            result.Should().ContainSingle(error => error.MemberPath == failurePath, "because the item item value was not set");
        }
コード例 #2
0
        public async Task OrderIdIsRequired()
        {
            var currentInstant = Instant.FromUtc(2017, 08, 17, 12, 0, 0);
            var fakeClock      = new FakeClock(currentInstant);
            var validator      = new OrderHeaderValidator(fakeClock);
            var target         = new OrderHeader {
                OrderId = null, OrderDate = currentInstant.ToDateTimeUtc()
            };

            var result = await validator.ValidateAsync(target);

            result.Should().NotBeNull("because a validation result should have been returned");
            result.Should().ContainSingle(error => ((error.MemberPath == nameof(OrderHeader.OrderId)) && (error.Code == ErrorCode.ValueIsRequired.ToString())), "because the order id was not provided");
        }
コード例 #3
0
        public async Task OrderDateIsNotRequired()
        {
            var orderId        = new String('1', OrderHeaderValidator.OrderIdMaxLength - 1);
            var currentInstant = Instant.FromUtc(2017, 08, 17, 12, 0, 0);
            var fakeClock      = new FakeClock(currentInstant);
            var validator      = new OrderHeaderValidator(fakeClock);
            var target         = new OrderHeader {
                OrderId = orderId, OrderDate = null
            };

            var result = await validator.ValidateAsync(target);

            result.Should().NotBeNull("because a validation result should have been returned");
            result.Should().HaveCount(0, "because a null order date is allowed");
        }
コード例 #4
0
        public async Task OrderIdLengthIsEnforced()
        {
            var orderId        = new String('j', OrderHeaderValidator.OrderIdMaxLength + 1);
            var currentInstant = Instant.FromUtc(2017, 08, 17, 12, 0, 0);
            var fakeClock      = new FakeClock(currentInstant);
            var validator      = new OrderHeaderValidator(fakeClock);
            var target         = new OrderHeader {
                OrderId = orderId, OrderDate = currentInstant.ToDateTimeUtc()
            };

            var result = await validator.ValidateAsync(target);

            result.Should().NotBeNull("because a validation result should have been returned");
            result.Should().ContainSingle(error => ((error.MemberPath == nameof(OrderHeader.OrderId)) && (error.Code == ErrorCode.LengthIsInvalid.ToString())), "because the order id was too long");
        }
コード例 #5
0
        public async Task OrderDateIsValidated()
        {
            var orderId        = new String('5', OrderHeaderValidator.OrderIdMaxLength - 1);
            var currentInstant = Instant.FromUtc(2017, 08, 17, 12, 0, 0);
            var laterInstant   = currentInstant.Plus(Duration.FromHours(1));
            var fakeClock      = new FakeClock(currentInstant);
            var validator      = new OrderHeaderValidator(fakeClock);
            var target         = new OrderHeader {
                OrderId = orderId, OrderDate = laterInstant.ToDateTimeUtc()
            };

            var result = await validator.ValidateAsync(target);

            result.Should().NotBeNull("because a validation result should have been returned");
            result.Should().ContainSingle(error => (error.MemberPath == nameof(OrderHeader.OrderDate)), "because the order date was in the future");
        }
コード例 #6
0
        public async Task RequestHeaderIsRequired()
        {
            var currentInstant   = Instant.FromUtc(2017, 08, 17, 12, 0, 0);
            var fakeClock        = new FakeClock(currentInstant);
            var headerValidator  = new OrderHeaderValidator(fakeClock) as IMessageValidator <OrderHeader>;
            var itemValidator    = new itemItemValidator() as IMessageValidator <ItemAsset>;
            var itemOutValidator = new ItemOutValidator(itemValidator) as IMessageValidator <LineItem>;
            var validator        = new OrderFulfillmentMessageValidator(headerValidator, itemOutValidator);

            var target = new OrderFulfillmentMessage
            {
                OrderRequestHeader = null,
                LineItems          = new List <LineItem>()
            };

            var result = await validator.ValidateAsync(target);

            result.Should().NotBeNull("because a validation result should have been returned");
            result.Should().ContainSingle(error => ((error.MemberPath == nameof(OrderFulfillmentMessage.OrderRequestHeader)) && (error.Code == ErrorCode.ValueIsRequired.ToString())), "because the order header was not provided");
        }
コード例 #7
0
        public async Task RequestHeaderIsValidated()
        {
            var currentInstant   = Instant.FromUtc(2017, 08, 17, 12, 0, 0);
            var fakeClock        = new FakeClock(currentInstant);
            var headerValidator  = new OrderHeaderValidator(fakeClock) as IMessageValidator <OrderHeader>;
            var itemValidator    = new itemItemValidator() as IMessageValidator <ItemAsset>;
            var itemOutValidator = new ItemOutValidator(itemValidator) as IMessageValidator <LineItem>;
            var validator        = new OrderFulfillmentMessageValidator(headerValidator, itemOutValidator);
            var header           = new OrderHeader {
                OrderId = null, OrderDate = currentInstant.ToDateTimeUtc()
            };

            var target = new OrderFulfillmentMessage
            {
                OrderRequestHeader = header,
                LineItems          = new List <LineItem>()
            };

            var result = await validator.ValidateAsync(target);

            result.Should().NotBeNull("because a validation result should have been returned");
            result.Should().ContainSingle(error => (error.MemberPath == $"{ nameof(OrderFulfillmentMessage.OrderRequestHeader) }.{ nameof(OrderHeader.OrderId) }"), "because the order id was not provided in the header");
        }
コード例 #8
0
        public async Task EmptyItemOutIsValid()
        {
            var currentInstant   = Instant.FromUtc(2017, 08, 17, 12, 0, 0);
            var fakeClock        = new FakeClock(currentInstant);
            var headerValidator  = new OrderHeaderValidator(fakeClock) as IMessageValidator <OrderHeader>;
            var itemValidator    = new itemItemValidator() as IMessageValidator <ItemAsset>;
            var itemOutValidator = new ItemOutValidator(itemValidator) as IMessageValidator <LineItem>;
            var validator        = new OrderFulfillmentMessageValidator(headerValidator, itemOutValidator);
            var header           = new OrderHeader {
                OrderId = "ABC123", OrderDate = currentInstant.ToDateTimeUtc()
            };

            var target = new OrderFulfillmentMessage
            {
                OrderRequestHeader = header,
                LineItems          = new List <LineItem>()
            };

            var result = await validator.ValidateAsync(target);

            result.Should().NotBeNull("because a validation result should have been returned");
            result.Should().BeEmpty("because an empty itemout set is allowed");
        }
コード例 #9
0
        public async Task ItemOutsAreValidated()
        {
            var currentInstant   = Instant.FromUtc(2017, 08, 17, 12, 0, 0);
            var fakeClock        = new FakeClock(currentInstant);
            var headerValidator  = new OrderHeaderValidator(fakeClock) as IMessageValidator <OrderHeader>;
            var itemValidator    = new itemItemValidator() as IMessageValidator <ItemAsset>;
            var itemOutValidator = new ItemOutValidator(itemValidator) as IMessageValidator <LineItem>;
            var validator        = new OrderFulfillmentMessageValidator(headerValidator, itemOutValidator);
            var header           = new OrderHeader {
                OrderId = "ABC123", OrderDate = currentInstant.ToDateTimeUtc()
            };

            var itemOuts = new List <LineItem>
            {
                new LineItem
                {
                    Assets = new List <ItemAsset>
                    {
                        new ItemAsset(),
                        new ItemAsset()
                    }
                }
            };

            var target = new OrderFulfillmentMessage
            {
                OrderRequestHeader = header,
                LineItems          = itemOuts
            };

            var result = await validator.ValidateAsync(target);

            var failurePath = $"{ nameof(OrderFulfillmentMessage.LineItems) }[0].{ nameof(LineItem.Assets) }";

            result.Should().NotBeNull("because a validation result should have been returned");
            result.Should().ContainSingle(error => error.MemberPath == failurePath, "because the itemout violated a rule");
        }