コード例 #1
0
        public void Skips_null_items()
        {
            var validator = new TestValidator {
                v => v.RuleFor(x => x.Surname).NotNull(),
                v => v.RuleFor(x => x.Orders).SetCollectionValidator(new OrderValidator())
            };

            person.Orders[0] = null;
            var results = validator.Validate(person);

            results.Errors.Count.ShouldEqual(2);             //2 errors - 1 for person, 1 for 2nd Order.
        }
コード例 #2
0
        public void When_using_explicitly_localized_message_with_custom_validator_does_not_fall_back_to_ResourceProvider()
        {
            ValidatorOptions.ResourceProviderType = typeof(MyResources);

            var validator = new TestValidator {
                v => v.RuleFor(x => x.Surname).SetValidator(new MyPropertyValidator())
                .WithLocalizedMessage(typeof(MyOverridenResources), nameof(MyOverridenResources.notempty_error))
            };

            var results = validator.Validate(new Person());

            results.Errors.Single().ErrorMessage.ShouldEqual("bar");
        }
コード例 #3
0
        public void ResourceProviderType_overrides_default_messagesnote()
        {
            ValidatorOptions.ResourceProviderType = typeof(MyResources);

            var validator = new TestValidator()
            {
                v => v.RuleFor(x => x.Surname).NotEmpty()
            };

            var result = validator.Validate(new Person());

            result.Errors.Single().ErrorMessage.ShouldEqual("foo");
        }
コード例 #4
0
        public void Validates_nullable_with_nullable_property()
        {
            var validator = new TestValidator(v => v.RuleFor(x => x.NullableInt).LessThan(x => x.OtherNullableInt));

            var resultNull = validator.Validate(new Person {
                NullableInt = 0, OtherNullableInt = null
            });
            var resultLess = validator.Validate(new Person {
                NullableInt = 0, OtherNullableInt = -1
            });
            var resultEqual = validator.Validate(new Person {
                NullableInt = 0, OtherNullableInt = 0
            });
            var resultMore = validator.Validate(new Person {
                NullableInt = 0, OtherNullableInt = 1
            });

            resultNull.IsValid.ShouldBeFalse();
            resultLess.IsValid.ShouldBeFalse();
            resultEqual.IsValid.ShouldBeFalse();
            resultMore.IsValid.ShouldBeTrue();
        }
コード例 #5
0
        public void Nested_conditions_with_Custom_rule()
        {
            var validator = new TestValidator();

            validator.When(x => true, () => {
                validator.When(x => false, () => {
                    validator.Custom(x => new ValidationFailure("Custom", "The validation failed"));
                });
            });
            var result = validator.Validate(new Person());

            result.IsValid.ShouldBeTrue();
        }
コード例 #6
0
        public void Executes_rules_in_default_ruleset_and_specific_ruleset()
        {
            var validator = new TestValidator();

            validator.RuleSet("foo", () => {
                validator.RuleFor(x => x.Age).NotEqual(0);
            });

            var result = validator.Validate(new Person(), ruleSet: "default,Names");

            result.Errors.Count.ShouldEqual(3);
            AssertExecuted(result, "default", "Names");
        }
コード例 #7
0
        public void Nested_async_conditions_with_Custom_rule()
        {
            var validator = new TestValidator();

            validator.When(x => true, () => {
                validator.WhenAsync(async(x, c) => (false), () => {
                    validator.RuleFor(x => x).Custom((x, ctx) => ctx.AddFailure(new ValidationFailure("Custom", "The validation failed")));
                });
            });
            var result = validator.Validate(new Person());

            result.IsValid.ShouldBeTrue();
        }
コード例 #8
0
        public void Executes_multiple_rulesets()
        {
            var validator = new TestValidator();

            validator.RuleSet("Id", () => {
                validator.RuleFor(x => x.Id).NotEqual(0);
            });

            var person = new Person();
            var result = validator.Validate(new ValidationContext <Person>(person, new PropertyChain(), new RulesetValidatorSelector("Names", "Id")));

            result.Errors.Count.ShouldEqual(3);
        }
コード例 #9
0
        public void Uses_custom_property_name()
        {
            ValidatorOptions.PropertyNameResolver = (type, prop, expr) => "foo";

            var validator = new TestValidator()
            {
                v => v.RuleFor(x => x.Surname).NotNull()
            };

            var error = validator.Validate(new Person()).Errors.Single();

            error.PropertyName.ShouldEqual("foo");
        }
コード例 #10
0
        public void Does_not_invoke_dependent_rule_if_parent_rule_passes()
        {
            var validator = new TestValidator();
            validator.RuleFor(x => x.Surname).NotNull()
                .DependentRules(d =>
                {
                    d.RuleFor(x => x.Forename).NotNull();
                });

            var results = validator.Validate(new Person { Surname = null });
            results.Errors.Count.ShouldEqual(1);
            results.Errors.Single().PropertyName.ShouldEqual("Surname");
        }
コード例 #11
0
        public void Async_condition_executed_synchronosuly_with_asynchronous_collection_rule()
        {
            var validator = new TestValidator();

            validator.RuleForEach(x => x.NickNames)
            .MustAsync((n, c) => Task.FromResult(n != null))
            .WhenAsync((x, token) => Task.FromResult(false));
            var result = validator.Validate(new Person {
                NickNames = new string[0]
            });

            result.IsValid.ShouldBeTrue();
        }
        public void Can_use_property_with_include()
        {
            var validator  = new TestValidator();
            var validator2 = new TestValidator();

            validator2.RuleFor(x => x.Forename).NotNull();
            validator.Include(validator2);

#pragma warning disable 618
            var result = validator.Validate(new Person(), "Forename");
#pragma warning restore 618
            result.IsValid.ShouldBeFalse();
        }
コード例 #13
0
        public void Validates_with_nullable_property()
        {
            validator = new TestValidator(v => v.RuleFor(x => x.Id).GreaterThanOrEqualTo(x => x.NullableInt));

            var resultNull = validator.Validate(new Person {
                Id = 0, NullableInt = null
            });
            var resultLess = validator.Validate(new Person {
                Id = 0, NullableInt = -1
            });
            var resultEqual = validator.Validate(new Person {
                Id = 0, NullableInt = 0
            });
            var resultMore = validator.Validate(new Person {
                Id = 0, NullableInt = 1
            });

            resultNull.IsValid.ShouldBeFalse();
            resultLess.IsValid.ShouldBeTrue();
            resultEqual.IsValid.ShouldBeTrue();
            resultMore.IsValid.ShouldBeFalse();
        }
コード例 #14
0
        public void Includes_nested_property()
        {
            var validtor = new TestValidator {
                v => v.RuleFor(x => x.Surname).NotNull(),
                v => v.RuleFor(x => x.Address.Id).NotEqual(0)
            };

            var result = validtor.Validate(new Person {
                Address = new Address()
            }, "Address.Id");

            result.Errors.Count.ShouldEqual(1);
            result.Errors[0].PropertyName.ShouldEqual("Address.Id");
        }
コード例 #15
0
        public void Throws_exception_with_a_ruleset()
        {
            var validator = new TestValidator {
                v => v.RuleFor(x => x.Surname).NotNull()
            };

            const string ruleSetName = "blah";

            validator.RuleSet(ruleSetName, () => { validator.RuleFor(x => x.Forename).NotNull(); });

            Assert.Throws <ValidationException>(() => {
                validator.Validate(new Person(), v => v.IncludeRuleSets(ruleSetName).ThrowOnFailures());
            });
        }
コード例 #16
0
        public void Executes_correct_rule_when_using_property_with_include()
        {
            var validator  = new TestValidator();
            var validator2 = new TestValidator();

            validator2.RuleFor(x => x.Forename).NotNull();
            validator2.RuleFor(x => x.Surname).NotNull();
            validator.Include(validator2);

            var result = validator.Validate(new Person(), "Forename");

            result.Errors.Count.ShouldEqual(1);
            result.Errors[0].PropertyName.ShouldEqual("Forename");
        }
コード例 #17
0
        public void Executes_rule_for_each_item_in_collection()
        {
            var validator = new TestValidator {
                v => v.RuleForEach(x => x.NickNames).NotNull()
            };

            var person = new Person {
                NickNames = new[] { null, "foo", null }
            };

            var result = validator.Validate(person);

            result.Errors.Count.ShouldEqual(2);
        }
コード例 #18
0
        public void Condition_can_be_used_inside_ruleset()
        {
            var validator = new TestValidator();

            validator.RuleSet("foo", () => { validator.When(x => x.Id > 0, () => { validator.RuleFor(x => x.Forename).NotNull(); }); });
            validator.RuleFor(x => x.Surname).NotNull();

            var result = validator.Validate(new Person {
                Id = 5
            }, ruleSet: "foo");

            result.Errors.Count.ShouldEqual(1);
            result.Errors.Single().PropertyName.ShouldEqual("Forename");
        }
コード例 #19
0
        public void Validates_collection()
        {
            var validator = new TestValidator {
                v => v.RuleFor(x => x.Surname).NotNull(),
                v => v.RuleFor(x => x.Orders).SetCollectionValidator(new OrderValidator())
            };

            var results = validator.Validate(person);

            results.Errors.Count.ShouldEqual(3);

            results.Errors[1].PropertyName.ShouldEqual("Orders[0].ProductName");
            results.Errors[2].PropertyName.ShouldEqual("Orders[1].Amount");
        }
コード例 #20
0
        public void When_the_text_is_empty_then_the_validator_should_fail()
        {
            string email  = String.Empty;
            var    result = validator.Validate(new Person {
                Email = email
            });

            result.IsValid.ShouldBeFalse();
        }
コード例 #21
0
        public void Should_format_custom_message()
        {
            const string expected = "Surname";

            validator.RuleFor(x => x.Surname).NotNull().WithMessage("{PropertyName}");
            string error = validator.Validate(new Person()).Errors.Single().ErrorMessage;

            error.ShouldEqual(expected);
        }
コード例 #22
0
        public void When_the_text_matches_the_regular_expression_then_the_validator_should_pass()
        {
            string input  = "S3";
            var    result = validator.Validate(new Person {
                Surname = input
            });

            result.IsValid.ShouldBeTrue();
        }
        public void Validates_across_properties()
        {
            var validator = new TestValidator(
                v => v.RuleFor(x => x.Forename)
                .NotEqual(x => x.Surname)
                .WithMessage("{ComparisonProperty}")
                );

            var result = validator.Validate(new Person {
                Surname = "foo", Forename = "foo"
            });

            result.IsValid.ShouldBeFalse();
            result.Errors[0].ErrorMessage.ShouldEqual("Surname");
        }
コード例 #24
0
        public void InheritanceValidator_should_fail_if_car_iselectric_is_false()
        {
            var validator = new TestValidator(v => {
                v.RuleFor(x => x.Vehicle).AddInheritance(i => {
                    i.Include <Car>(b => { b.RuleFor(m => m.IsElectric).Must(x => x); });
                    i.Include <Bike>(b => { b.RuleFor(m => m.HasBell).Must(x => x); });
                });
            });

            var result = validator.Validate(new Person {
                Vehicle = new Car()
            });

            result.IsValid.ShouldBeFalse();
        }
        public void Includes_nested_property_using_expression()
        {
            var validator = new TestValidator {
                v => v.RuleFor(x => x.Surname).NotNull(),
                v => v.RuleFor(x => x.Address.Id).NotEqual(0)
            };

#pragma warning disable 618
            var result = validator.Validate(new Person {
                Address = new Address()
            }, x => x.Address.Id);
#pragma warning restore 618
            result.Errors.Count.ShouldEqual(1);
            result.Errors[0].PropertyName.ShouldEqual("Address.Id");
        }
コード例 #26
0
        public void Correctly_gets_collection_indicies()
        {
            var validator = new TestValidator {
                v => v.RuleForEach(x => x.NickNames).NotNull()
            };

            var person = new Person {
                NickNames = new[] { null, "foo", null }
            };

            var result = validator.Validate(person);

            result.Errors[0].PropertyName.ShouldEqual("NickNames[0]");
            result.Errors[1].PropertyName.ShouldEqual("NickNames[2]");
        }
コード例 #27
0
        public void Comparison_property_uses_custom_resolver()
        {
            var originalResolver = ValidatorOptions.Global.DisplayNameResolver;

            try {
                ValidatorOptions.Global.DisplayNameResolver = (type, member, expr) => member.Name + "Foo";
                var validator = new TestValidator(v => v.RuleFor(x => x.Id).LessThan(x => x.AnotherInt).WithMessage("{ComparisonProperty}"));
                var result    = validator.Validate(new Person {
                    Id = 2, AnotherInt = 1
                });
                result.Errors[0].ErrorMessage.ShouldEqual("AnotherIntFoo");
            }
            finally {
                ValidatorOptions.Global.DisplayNameResolver = originalResolver;
            }
        }
コード例 #28
0
        public void Treats_root_level_RuleFor_call_as_dependent_rule_if_user_forgets_to_use_DependentRulesBuilder()
        {
            var validator = new TestValidator();

            validator.RuleFor(x => x.Surname).NotNull()
            .DependentRules(() => {
                validator.RuleFor(x => x.Forename).NotNull();                          // Shouldn't be invoked
            });

            var results = validator.Validate(new Person {
                Surname = null
            });

            results.Errors.Count.ShouldEqual(1);             //only the root NotNull should fire
            results.Errors.Single().PropertyName.ShouldEqual("Surname");
        }
コード例 #29
0
        public void Can_validate_using_validator_for_base_type()
        {
            var addressValidator = new InlineValidator <IAddress>()
            {
                v => v.RuleFor(x => x.Line1).NotNull()
            };

            var validator = new TestValidator {
                v => v.RuleFor(x => x.Address).SetValidator(addressValidator)
            };

            var result = validator.Validate(new Person {
                Address = new Address()
            });

            result.IsValid.ShouldBeFalse();
        }
コード例 #30
0
        public void Dependent_rules_inside_when()
        {
            var validator = new TestValidator();

            validator.When(o => o.Forename != null, () =>
            {
                validator.RuleFor(o => o.Age).LessThan(1)
                .DependentRules(d =>
                {
                    d.RuleFor(o => o.Forename).NotNull();
                });
            });;

            var result = validator.Validate(new Person());

            result.IsValid.ShouldBeTrue();
        }