Example #1
0
        public void ForMemberShouldThrowIfTheResultManifestHasNoChildrenOfThatName([ManifestModel] ValidationManifest manifest)
        {
            manifest.ValidatedType = typeof(string);
            var sut = new ValidationResult <string>(Enumerable.Empty <ValidationRuleResult>(), manifest);

            Assert.That(() => sut.ForMember(x => x.Length), Throws.ArgumentException);
        }
Example #2
0
        /// <inheritdoc/>
        public IValidator GetValidator(ValidationManifest manifest)
        {
            var validator         = BaseValidatorFactory.GetValidator(manifest);
            var messaageValidator = MessageSupportWrapper.GetValidatorWithMessageSupport(validator);

            return(ExceptionBehaviourWrapper.WrapValidator(messaageValidator));
        }
Example #3
0
        public async Task RecursiveValidationShouldReturnaResultFromADescendentObjectValidatedUsingTheSameManifestAsAnAncestor([IntegrationTesting] IGetsValidator validatorFactory)
        {
            var manifest = new ValidationManifest
            {
                ValidatedType = typeof(Node),
                RootValue     = new ManifestValue
                {
                    ValidatedType    = typeof(Node),
                    IdentityAccessor = obj => ((Node)obj).Identity,
                    Children         = new[] {
                        new ManifestValue
                        {
                            ValidatedType      = typeof(NodeChild),
                            IdentityAccessor   = obj => ((NodeChild)obj).Identity,
                            AccessorFromParent = obj => ((Node)obj).Child,
                        },
                        new ManifestValue
                        {
                            ValidatedType      = typeof(string),
                            AccessorFromParent = obj => ((Node)obj).Name,
                        }
                    }
                }
            };
            var nameValue = manifest.RootValue.Children.Single(x => x.ValidatedType == typeof(string));
            var nameRule  = new ManifestRule(nameValue, new ManifestRuleIdentifier(nameValue, typeof(MatchesRegex)))
            {
                RuleConfiguration = obj => ((MatchesRegex)obj).Pattern = "^Foo",
            };

            nameValue.Rules.Add(nameRule);
            var childValue     = manifest.RootValue.Children.Single(x => x.ValidatedType == typeof(NodeChild));
            var recursiveValue = new RecursiveManifestValue(manifest.RootValue)
            {
                AccessorFromParent = obj => ((NodeChild)obj).Node,
            };

            childValue.Children.Add(recursiveValue);

            var validatedObject = new Node
            {
                Child = new NodeChild
                {
                    Node = new Node
                    {
                        Child = new NodeChild {
                            Node = new Node {
                                Name = "Invalid"
                            }
                        }
                    }
                }
            };
            var sut = validatorFactory.GetValidator <Node>(manifest);

            var result = await sut.ValidateAsync(validatedObject);

            Assert.That(result, Has.One.Matches <ValidationRuleResult>(r => r.Outcome == RuleOutcome.Failed && Equals(r.ValidatedValue, "Invalid")));
        }
Example #4
0
        public void ValidatingACircularReferenceShouldNotThrowOrTimeOut([IntegrationTesting] IGetsValidator validatorFactory)
        {
            var manifest = new ValidationManifest
            {
                ValidatedType = typeof(Node),
                RootValue     = new ManifestValue
                {
                    ValidatedType    = typeof(Node),
                    IdentityAccessor = obj => ((Node)obj).Identity,
                    Children         = new[] {
                        new ManifestValue
                        {
                            ValidatedType      = typeof(NodeChild),
                            IdentityAccessor   = obj => ((NodeChild)obj).Identity,
                            AccessorFromParent = obj => ((Node)obj).Child,
                        },
                        new ManifestValue
                        {
                            ValidatedType      = typeof(string),
                            AccessorFromParent = obj => ((Node)obj).Name,
                        }
                    }
                }
            };
            var nameValue = manifest.RootValue.Children.Single(x => x.ValidatedType == typeof(string));
            var nameRule  = new ManifestRule(nameValue, new ManifestRuleIdentifier(nameValue, typeof(MatchesRegex)))
            {
                RuleConfiguration = obj => ((MatchesRegex)obj).Pattern = "^Foo",
            };

            nameValue.Rules.Add(nameRule);
            var childValue     = manifest.RootValue.Children.Single(x => x.ValidatedType == typeof(NodeChild));
            var recursiveValue = new RecursiveManifestValue(manifest.RootValue)
            {
                AccessorFromParent = obj => ((NodeChild)obj).Node,
            };

            childValue.Children.Add(recursiveValue);

            var validatedObject = new Node
            {
                Child = new NodeChild
                {
                    Node = new Node
                    {
                        Child = new NodeChild {
                            Node = new Node {
                                Name = "Invalid"
                            }
                        }
                    }
                }
            };

            validatedObject.Child.Node.Child.Node.Child = validatedObject.Child;
            var sut = validatorFactory.GetValidator <Node>(manifest);

            Assert.That(() => sut.ValidateAsync(validatedObject).Wait(300), Is.True, "Validation completes within 300ms");
        }
        public void GetValidatorNonGenericShouldReturnValidatorManifest([Frozen] IGetsValidatorFromManifest validatorFromManifestFactory,
                                                                        BaseValidatorFactory sut,
                                                                        [ManifestModel] ValidationManifest manifest,
                                                                        IValidator validator)
        {
            Mock.Get(validatorFromManifestFactory).Setup(x => x.GetValidator(manifest)).Returns(validator);

            Assert.That(() => sut.GetValidator(manifest), Is.SameAs(validator));
        }
Example #6
0
 /// <summary>
 /// Initialises a new generic instance of <see cref="ValidationResult{TValidated}"/>.
 /// </summary>
 /// <param name="ruleResults">The rule results.</param>
 /// <param name="manifest">The validation manifest.</param>
 /// <exception cref="ArgumentException">If <paramref name="manifest"/> is for a type that is not compatible with <typeparamref name="TValidated"/>.</exception>
 /// <exception cref="ArgumentNullException">If either parameter is <see langword="null" />.</exception>
 public ValidationResult(IEnumerable <ValidationRuleResult> ruleResults, ValidationManifest manifest) : base(ruleResults, manifest)
 {
     if (!typeof(TValidated).IsAssignableFrom(manifest.ValidatedType))
     {
         var message = String.Format(Resources.ExceptionMessages.GetExceptionMessage("ValidationResultMustBeOfCorrectType"),
                                     typeof(TValidated).FullName,
                                     manifest.ValidatedType.FullName);
         throw new ArgumentException(message, nameof(manifest));
     }
 }
Example #7
0
        /// <summary>
        /// Initialises a new instance of <see cref="ValidationResult"/>.
        /// </summary>
        /// <param name="ruleResults">The rule results.</param>
        /// <param name="manifest">The validation manifest</param>
        /// <exception cref="ArgumentNullException">If either parameter is <see langword="null" />.</exception>
        protected ValidationResult(IEnumerable <ValidationRuleResult> ruleResults, ValidationManifest manifest)
        {
            if (ruleResults is null)
            {
                throw new ArgumentNullException(nameof(ruleResults));
            }

            RuleResults = ruleResults.ToList();
            Passed      = RuleResults.All(r => r.Outcome == RuleOutcome.Passed);
            Manifest    = manifest ?? throw new ArgumentNullException(nameof(manifest));
        }
        public void GetValidatorShouldReturnCorrectGenericValidatorForManifest(IGetsValidator factory,
                                                                               StubValidator validator,
                                                                               [ManifestModel] ValidationManifest manifest)
        {
            Mock.Get(factory)
            .Setup(x => x.GetValidator(manifest))
            .Returns(validator);
            manifest.ValidatedType = typeof(ValidatedObject);

            Assert.That(() => factory.GetValidator <ValidatedObject>(manifest), Is.SameAs(validator));
        }
Example #9
0
 /// <summary>
 /// Initialises a new instance of <see cref="Validator{TValidated}"/>.
 /// </summary>
 /// <param name="manifest">A validation manifest from which to creator the validator.</param>
 /// <param name="executorFactory">The rule-executor factory.</param>
 /// <param name="ruleFactory">The rule factory.</param>
 /// <param name="optionsResolver">An options resolver.</param>
 /// <param name="contextFactory">A rule execution context factory.</param>
 /// <exception cref="ArgumentNullException">If any parameter is <see langword="null" />.</exception>
 public Validator(ValidationManifest manifest,
                  IGetsRuleExecutor executorFactory,
                  IGetsAllExecutableRulesWithDependencies ruleFactory,
                  IGetsResolvedValidationOptions optionsResolver,
                  IGetsRuleExecutionContext contextFactory)
 {
     this.manifest        = manifest ?? throw new ArgumentNullException(nameof(manifest));
     this.executorFactory = executorFactory ?? throw new ArgumentNullException(nameof(executorFactory));
     this.ruleFactory     = ruleFactory ?? throw new ArgumentNullException(nameof(ruleFactory));
     this.optionsResolver = optionsResolver ?? throw new ArgumentNullException(nameof(optionsResolver));
     this.contextFactory  = contextFactory ?? throw new ArgumentNullException(nameof(contextFactory));
 }
Example #10
0
        public async Task ValidateAsyncNonGenericShouldReturnReturnValidationResultContainingRuleResults([ManifestModel, Frozen] ValidationManifest manifest,
                                                                                                         [Frozen] IGetsRuleExecutor executorFactory,
                                                                                                         [Frozen] IGetsAllExecutableRulesWithDependencies ruleFactory,
                                                                                                         [Frozen] IGetsRuleExecutionContext contextFactory,
                                                                                                         IExecutesAllRules executor,
                                                                                                         Validator <object> sut,
                                                                                                         object validatedObject,
                                                                                                         ValidationOptions options,
                                                                                                         CancellationToken cancellationToken,
                                                                                                         IRuleExecutionContext context,
                                                                                                         [ExecutableModel] ExecutableRuleAndDependencies[] ruleAndDependencies,
                                                                                                         [RuleResult] ValidationRuleResult[] results)
        {
            Mock.Get(executorFactory)
            .Setup(x => x.GetRuleExecutorAsync(It.IsAny <ResolvedValidationOptions>(), cancellationToken))
            .Returns(Task.FromResult(executor));
            Mock.Get(contextFactory)
            .Setup(x => x.GetExecutionContext(ruleAndDependencies, It.IsAny <ResolvedValidationOptions>()))
            .Returns(context);
            Mock.Get(executor)
            .Setup(x => x.ExecuteAllRulesAsync(context, cancellationToken))
            .Returns(Task.FromResult((IReadOnlyCollection <ValidationRuleResult>)results));
            Mock.Get(ruleFactory)
            .Setup(x => x.GetRulesWithDependencies(manifest.RootValue, validatedObject, It.IsAny <ResolvedValidationOptions>()))
            .Returns(ruleAndDependencies);

            var result = await((IValidator)sut).ValidateAsync(validatedObject, options, cancellationToken);

            Assert.That(result.RuleResults, Is.EqualTo(results));
        }
Example #11
0
 public void ConstructorShouldThrowIfInstantiatedForAnIncompatibleType([ManifestModel] ValidationManifest manifest)
 {
     manifest.ValidatedType = typeof(string);
     Assert.That(() => new ValidationResult <int>(Enumerable.Empty <ValidationRuleResult>(), manifest), Throws.ArgumentException);
 }
Example #12
0
 public void ConstructorShouldNotThrowIfInstantiatedForACompatible([ManifestModel] ValidationManifest manifest)
 {
     manifest.ValidatedType = typeof(string);
     Assert.That(() => new ValidationResult <object>(Enumerable.Empty <ValidationRuleResult>(), manifest), Throws.Nothing);
 }
Example #13
0
        public void ForMatchingMemberItemShouldThrowIfTheResultManifestHasNoChildrenOfThatName([ManifestModel] ValidationManifest manifest, Person person, Pet pet)
        {
            person.Pets.Add(pet);
            manifest.ValidatedType = typeof(Person);
            var sut = new ValidationResult <Person>(Enumerable.Empty <ValidationRuleResult>(), manifest);

            Assert.That(() => sut.ForMatchingMemberItem(x => x.Pets, pet),
                        Throws.ArgumentException.And.Message.Contains("does not contain any values for a member named"));
        }
 /// <inheritdoc/>
 public IValidator GetValidator(ValidationManifest manifest)
 => validatorFromManifestProvider.GetValidator(manifest);
Example #15
0
        public void ForMatchingMemberItemShouldThrowIfTheRequestedMemberIsNotACollectionItem([ManifestModel] ValidationManifest manifest,
                                                                                             [ManifestModel] ManifestValue value,
                                                                                             Person person,
                                                                                             Pet pet)
        {
            person.Pets.Add(pet);
            manifest.ValidatedType = typeof(Person);
            manifest.RootValue.Children.Add(value);
            value.MemberName          = nameof(Person.Pets);
            value.CollectionItemValue = null;
            var sut = new ValidationResult <Person>(Enumerable.Empty <ValidationRuleResult>(), manifest);

            Assert.That(() => sut.ForMatchingMemberItem(x => x.Pets, pet),
                        Throws.ArgumentException.And.Message.Contains("but in order to use ForMatchingMemberItem, that value must represent a collection of items"));
        }
        public void GetValidatorGenericShouldReturnGenericValidatorFromCreatedManifest([Frozen] IGetsManifestFromBuilder manifestFromBuilderProvider,
                                                                                       [Frozen] IGetsValidatorFromManifest validatorFromManifestFactory,
                                                                                       BaseValidatorFactory sut,
                                                                                       IBuildsValidator <object> builder,
                                                                                       [ManifestModel] ValidationManifest manifest)
        {
            Mock.Get(manifestFromBuilderProvider).Setup(x => x.GetManifest(builder)).Returns(manifest);
            var validator           = new Mock <IValidator <object> >();
            var nonGenericValidator = validator.As <IValidator>();

            Mock.Get(validatorFromManifestFactory).Setup(x => x.GetValidator(manifest)).Returns(nonGenericValidator.Object);

            Assert.That(() => sut.GetValidator(builder), Is.SameAs(nonGenericValidator.Object));
        }
Example #17
0
        public void PolymorphicAsShouldThrowIfTheManifestDoesNotHaveAMatchingPolymorphicType([ManifestModel] ValidationManifest manifest,
                                                                                             [ManifestModel] ManifestValue value)
        {
            manifest.ValidatedType = typeof(Person);
            manifest.RootValue     = value;
            value.ValidatedType    = typeof(Person);
            value.PolymorphicTypes.Clear();
            var sut = new ValidationResult <Person>(Enumerable.Empty <ValidationRuleResult>(), manifest);

            Assert.That(() => sut.PolymorphicAs <Employee>(),
                        Throws.ArgumentException.And.Message.StartsWith("The validation manifest value (for CSF.Validation.IntegrationTests.Person) must contain a polymorphic"));
        }
 public void GetValidatorShouldThrowIfManifestTypeIsNotCorrectForValidatedType(IGetsValidator factory,
                                                                               [ManifestModel] ValidationManifest manifest)
 {
     manifest.ValidatedType = typeof(string);
     Assert.That(() => factory.GetValidator <ValidatedObject>(manifest), Throws.ArgumentException);
 }
Example #19
0
        public void GetValidatorFromManifestModelShouldReturnValidatorUsingManifestCreatedFromModelWrappedInThrowingBehaviour([Frozen, AutofixtureServices] IServiceProvider serviceProvider,
                                                                                                                              [Frozen] IGetsBaseValidator baseValidatorFactory,
                                                                                                                              [Frozen] IWrapsValidatorWithExceptionBehaviour exceptionBehaviourWrapper,
                                                                                                                              [Frozen] IWrapsValidatorWithMessageSupport messageWrapper,
                                                                                                                              [Frozen] IGetsValidationManifestFromModel manifestFromModelProvider,
                                                                                                                              ValidatorFactory sut,
                                                                                                                              [ManifestModel] Value manifestModel,
                                                                                                                              Type validatedType,
                                                                                                                              [ManifestModel] ValidationManifest manifest,
                                                                                                                              IValidator baseValidator)
        {
            var expectedValidatorMock = new Mock <IValidator <ValidatedObject> >();
            var expectedValidator     = expectedValidatorMock.As <IValidator>().Object;
            var messageValidatorMock  = new Mock <IValidator <ValidatedObject> >();
            var messageValidator      = messageValidatorMock.As <IValidator>().Object;

            Mock.Get(manifestFromModelProvider).Setup(x => x.GetValidationManifest(manifestModel, validatedType)).Returns(manifest);
            Mock.Get(baseValidatorFactory).Setup(x => x.GetValidator(manifest)).Returns(baseValidator);
            Mock.Get(messageWrapper).Setup(x => x.GetValidatorWithMessageSupport(baseValidator)).Returns(messageValidator);
            Mock.Get(exceptionBehaviourWrapper).Setup(x => x.WrapValidator(messageValidator)).Returns(expectedValidator);

            Assert.That(() => sut.GetValidator(manifestModel, validatedType), Is.SameAs(expectedValidator));
        }