Example #1
0
        public void Dependent_rules_inside_ruleset()
        {
            var validator = new TestValidator();

            validator.RuleSet("MyRuleSet", () => {
                validator.RuleFor(x => x.Surname).NotNull()
                .DependentRules(() => {
                    validator.RuleFor(x => x.Forename).NotNull();
                });
            });

            var results = validator.Validate(new Person {
                Surname = "foo"
            }, ruleSet: "MyRuleSet");

            results.Errors.Count.ShouldEqual(1);
            results.Errors.Single().PropertyName.ShouldEqual("Forename");
        }
Example #2
0
        public void Overrides_localization_key()
        {
            var validator = new TestValidator();

            validator.RuleFor(x => x.Forename).SetValidator(new CustomNotNull());
            var result = validator.Validate(new Person());

            result.Errors.Single().ErrorMessage.ShouldEqual("'Forename' is not a valid credit card number.");
        }
Example #3
0
        public void Formats_string_with_placeholders_when_you_cant_edit_the_string()
        {
            var validator = new TestValidator();

            validator.RuleFor(x => x.Forename).NotNull().WithMessage(x => string.Format("{{PropertyName}} {0}", x.AnotherInt));
            var result = validator.Validate(new Person());

            result.Errors[0].ErrorMessage.ShouldEqual("Forename 0");
        }
Example #4
0
        public void Async_condition_can_be_used_inside_ruleset()
        {
            var validator = new TestValidator();

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

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

            result.Errors.Count.ShouldEqual(1);
            result.Errors.Single().PropertyName.ShouldEqual("Forename");
        }
Example #5
0
        public void Sets_localised_message_via_type_name()
        {
            var validator = new TestValidator();

            validator.RuleFor(x => x.Surname).NotEmpty().WithLocalizedMessage(typeof(MyResources), nameof(MyResources.notempty_error));
            var result = validator.Validate(new Person());

            result.Errors.Single().ErrorMessage.ShouldEqual("foo");
        }
        public void When_condition_only_executed_once()
        {
            var validator  = new TestValidator();
            int executions = 0;

            validator.When(x => {
                executions++;
                return(x.Age > 10);
            }, () => {
                validator.RuleFor(x => x.Surname).NotNull();
                validator.RuleFor(x => x.Forename).NotNull();
            });

            validator.Validate(new Person {
                Age = 11
            });
            executions.ShouldEqual(1);
        }
Example #7
0
        public async Task Async_condition_can_be_used_inside_ruleset()
        {
            var validator = new TestValidator();

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

#pragma warning disable 618
            var result = await validator.ValidateAsync(new Person { Id = 5 }, ruleSet : "foo");

#pragma warning restore 618
            result.Errors.Count.ShouldEqual(1);
            result.Errors.Single().PropertyName.ShouldEqual("Forename");
        }
Example #8
0
        public void Async_condition_executed_synchronosuly_with_synchronous_role()
        {
            var validator = new TestValidator();

            validator.RuleFor(x => x.Surname).NotNull()
            .WhenAsync((x, token) => Task.FromResult(false));
            var result = validator.Validate(new Person());

            result.IsValid.ShouldBeTrue();
        }
Example #9
0
        public void ShouldHaveValidationError_with_an_unmatched_rule_and_multiple_errors_should_throw_an_exception()
        {
            var validator = new TestValidator();

            validator.RuleFor(x => x.NullableInt).GreaterThan(1);
            validator.RuleFor(x => x.Age).GreaterThan(1);
            validator.RuleFor(x => x.AnotherInt).GreaterThan(2);

            var result = validator.TestValidate(new Person()
            {
                NullableInt = 1,
                Age         = 1,
                AnotherInt  = 1
            });

            var ex = Assert.Throws <ValidationTestException>(() => result.ShouldHaveValidationErrorFor(x => x.NullableInt.Value));

            Assert.Equal("Expected a validation error for property NullableInt.Value\n----\nProperties with Validation Errors:\n[0]: NullableInt\n[1]: Age\n[2]: AnotherInt\n", ex.Message);
        }
        public void Uses_func_to_get_message()
        {
            var validator = new TestValidator();

            validator.RuleFor(x => x.Forename).NotNull().WithMessage(x => "el foo");

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

            result.Errors[0].ErrorMessage.ShouldEqual("el foo");
        }
        public void Async_condition_throws_when_executed_synchronosuly_with_asynchronous_rule()
        {
            var validator = new TestValidator();

            validator.RuleFor(x => x.Surname)
            .MustAsync((surname, c) => Task.FromResult(surname != null))
            .WhenAsync((x, token) => Task.FromResult(false));

            Assert.Throws <AsyncValidatorInvokedSynchronouslyException>(() => validator.Validate(new Person()));
        }
        public async Task Executes_customasync_rule_when_async_condition_true()
        {
            var validator = new TestValidator();

            validator.WhenAsync(async(x, c) => (true), () => validator.RuleFor(x => x).CustomAsync(async(x, ctx, c) => ctx.AddFailure(new ValidationFailure("foo", "bar"))));

            var result = await validator.ValidateAsync(new Person());

            result.IsValid.ShouldBeFalse();
        }
        public void ShouldHaveValidationErrorFor_takes_account_of_rulesets_fluent_approach()
        {
            var testValidator = new TestValidator();

            testValidator.RuleSet("Names", () => {
                testValidator.RuleFor(x => x.Surname).NotNull();
                testValidator.RuleFor(x => x.Forename).NotNull();
            });
            testValidator.RuleFor(x => x.Id).NotEqual(0);

#pragma warning disable 618
            var assertionRoot = testValidator.TestValidate(new Person(), "Names");
#pragma warning restore 618

            assertionRoot.ShouldHaveValidationErrorFor(x => x.Forename)
            .WithErrorCode("NotNullValidator");
            assertionRoot.ShouldHaveValidationErrorFor(x => x.Surname).WithErrorCode("NotNullValidator");
            assertionRoot.ShouldNotHaveValidationErrorFor(x => x.Id);
        }
        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);
        }
        public void Validates_at_model_level()
        {
            var v = new TestValidator();

            v.RuleFor(x => x).Must(x => false);

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

            result.Errors.Count.ShouldEqual(1);
            result.Errors.Single().PropertyName.ShouldEqual("");
        }
        public void Should_use_ordinal_comparison_by_default()
        {
            var validator = new TestValidator();

            validator.RuleFor(x => x.Surname).NotEqual("a");
            var result = validator.Validate(new Person {
                Surname = "a\0"
            });

            result.IsValid.ShouldBeTrue();
        }
        public void Can_use_child_validator_at_model_level()
        {
            var v = new TestValidator();

            v.RuleFor(x => x).SetValidator(new ChildValidator());

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

            result.Errors.Count.ShouldEqual(1);
            result.Errors.Single().PropertyName.ShouldEqual("Forename");
        }
        public void Uses_string_format_with_property_value()
        {
            var validator = new TestValidator();

            validator.RuleFor(x => x.Forename).Equal("Foo").WithMessage((x, forename) => $"Hello {forename}");
            var result = validator.Validate(new Person {
                Forename = "Jeremy"
            });

            result.Errors[0].ErrorMessage.ShouldEqual("Hello Jeremy");
        }
        public void Not_Setting_global_resource_provider_uses_default_messages_in_metadata()
        {
            var validator = new TestValidator();

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

            var descriptor   = validator.CreateDescriptor();
            var resourceType = descriptor.GetMembersWithValidators().First().First().ErrorMessageSource.ResourceType;

            Assert.Equal(typeof(Messages), resourceType);
        }
        public void Runs_otherwise_conditons_for_Unless()
        {
            var validator = new TestValidator();

            validator.Unless(x => x.Age > 10, () => {
                validator.RuleFor(x => x.Forename).NotNull();
            }).Otherwise(() => {
                validator.RuleFor(x => x.Surname).NotNull();
            });

            var result1 = validator.Validate(new Person {
                Age = 11
            });

            result1.Errors.Single().PropertyName.ShouldEqual("Surname");
            var result2 = validator.Validate(new Person {
                Age = 9
            });

            result2.Errors.Single().PropertyName.ShouldEqual("Forename");
        }
Example #21
0
        public void Can_use_property_with_include()
        {
            var validator  = new TestValidator();
            var validator2 = new TestValidator();

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

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

            result.IsValid.ShouldBeFalse();
        }
        public void Executes_custom_rule_when_condition_true()
        {
            var validator = new TestValidator();

            validator.When(x => true, () => {
                validator.RuleFor(x => x).Custom((x, ctx) => ctx.AddFailure(new ValidationFailure("foo", "bar")));
            });

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

            result.IsValid.ShouldBeFalse();
        }
        public void Does_not_execute_customasync_Rule_when_condition_false()
        {
            var validator = new TestValidator();

            validator.When(x => false, () => {
                validator.RuleFor(x => x).CustomAsync(async(x, ctx, c) => ctx.AddFailure(new ValidationFailure("foo", "bar")));
            });

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

            result.IsValid.ShouldBeTrue();
        }
        public async Task Does_not_execute_custom_Rule_when_async_condition_false()
        {
            var validator = new TestValidator();

            validator.WhenAsync(async(x, c) => (false), () => {
                validator.RuleFor(x => x).Custom((x, ctx) => ctx.AddFailure(new ValidationFailure("foo", "bar")));
            });

            var result = await validator.ValidateAsync(new Person());

            result.IsValid.ShouldBeTrue();
        }
        public void Can_access_expression_in_message_lambda_regex()
        {
            var v = new TestValidator();

            v.RuleFor(x => x.Forename).Matches(x => x.AnotherRegex).WithMessage("test {RegularExpression}");

            var result = v.Validate(new Person {
                Forename = "", AnotherRegex = new System.Text.RegularExpressions.Regex(@"^\w\d$")
            });

            result.Errors.Single().ErrorMessage.ShouldEqual(@"test ^\w\d$");
        }
        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(); });

            typeof(ValidationException).ShouldBeThrownBy(() => validator.ValidateAndThrow(new Person(), ruleSetName));
        }
        public void Can_access_expression_in_message()
        {
            var v = new TestValidator();

            v.RuleFor(x => x.Forename).Matches(@"^\w\d$").WithMessage("test {RegularExpression}");

            var result = v.Validate(new Person {
                Forename = ""
            });

            result.Errors.Single().ErrorMessage.ShouldEqual(@"test ^\w\d$");
        }
Example #28
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);
        }
        public void Invokes_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 = "foo"});
            results.Errors.Count.ShouldEqual(1);
            results.Errors.Single().PropertyName.ShouldEqual("Forename");
        }
Example #30
0
        public void Setting_global_resource_provider_propogates_to_metadata()
        {
            ValidatorOptions.ResourceProviderType = typeof(TestMessages);
            var validator = new TestValidator();

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

            var descriptor   = validator.CreateDescriptor();
            var resourceType = descriptor.GetMembersWithValidators().First().First().ErrorMessageSource.ResourceType;

            Assert.Equal(typeof(TestMessages), resourceType);
        }