Beispiel #1
0
        public async Task ValidateAsync(object value, ValidationContext context, AddError addError)
        {
            try
            {
                object typedValue = null;

                if (value is JToken jToken)
                {
                    typedValue = jToken.IsNull() ? null : JsonValueConverter.ConvertValue(field, jToken);
                }

                var tasks = new List <Task>();

                foreach (var validator in ValidatorsFactory.CreateValidators(field))
                {
                    tasks.Add(validator.ValidateAsync(typedValue, context, addError));
                }

                await Task.WhenAll(tasks);
            }
            catch
            {
                addError(context.Path, "Not a valid value.");
            }
        }
Beispiel #2
0
        public void Should_InitSpecification_OnlyOnce()
        {
            var validatorsFactoryMock = new Mock <ISpecificationsRepository>();

            Specification <User> userSpecification = m => m.SetSingleError("user");

            var userSpecificationExecuted = 0;

            validatorsFactoryMock
            .Setup(r => r.Get <User>())
            .Returns(() =>
            {
                userSpecificationExecuted++;

                return(userSpecification);
            });

            var validatorsFactory = new ValidatorsFactory(validatorsFactoryMock.Object);

            validatorsFactory.GetOrInit <User>();
            validatorsFactory.GetOrInit <User>();
            var validator = validatorsFactory.GetOrInit <User>();

            Assert.NotNull(validator);
            Assert.Equal(1, userSpecificationExecuted);

            Assert.Equal(typeof(User).FullName, validatorsFactory.Keys.Single());

            Assert.Equal("user", validator.SingleError.Message);
        }
Beispiel #3
0
        public void Should_InitializeEmpty()
        {
            var validatorsFactoryMock = new Mock <ISpecificationsRepository>();

            var validatorsFactory = new ValidatorsFactory(validatorsFactoryMock.Object);

            Assert.Empty(validatorsFactory.Keys);
        }
Beispiel #4
0
 public ValidationContext(IValidationContextOptions options = null)
 {
     Id      = Guid.NewGuid();
     Options = OptionsService.GetVerifiedValidationContextOptions(options ?? new ValidationContextOptions());
     SpecificationsRepository = new SpecificationsRepository(Options.Specifications);
     ValidatorsFactory        = new ValidatorsFactory(SpecificationsRepository);
     TranslatorsRepository    = new TranslatorsRepository(Options.Translations.ToArray());
 }
Beispiel #5
0
        public void Should_ThrowException_If_GettingNonExistingSpecification_ByType()
        {
            var validatorsFactoryMock = new Mock <ISpecificationsRepository>();

            validatorsFactoryMock
            .Setup(r => r.Get <User>())
            .Returns(n => n);

            var validatorsFactory = new ValidatorsFactory(validatorsFactoryMock.Object);

            Assert.Throws <KeyNotFoundException>(() => { validatorsFactory.Get <Address>(); });
        }
Beispiel #6
0
        public IValidationResult <T> Validate <T>(T model, Func <IValidationOptions, IValidationOptions> setOptions = null)
            where T : class
        {
            if (!Types.Contains(typeof(T)))
            {
                throw new SpecificationNotFoundException(typeof(T));
            }

            var validationOptions = setOptions != null
                ? OptionsService.GetVerifiedValidationOptions(setOptions(Options.ValidationOptions))
                : Options.ValidationOptions;

            var defaultTranslator = validationOptions.TranslationName != null
                ? TranslatorsRepository.Get(validationOptions.TranslationName)
                : TranslatorsRepository.GetOriginal();

            var translationProxy = new TranslationProxy(defaultTranslator, TranslatorsRepository);

            if (model == null)
            {
                switch (validationOptions.NullRootStrategy)
                {
                case NullRootStrategy.ArgumentNullException:
                {
                    throw new ArgumentNullException(nameof(model));
                }

                case NullRootStrategy.NoErrors:
                {
                    return(new ValidationResult <T>(Id, translationProxy, Options.ValidationOptions));
                }

                default:
                {
                    var report = new ErrorsCollection();

                    report.AddError(Options.ValidationOptions.RequiredError);

                    return(new ValidationResult <T>(Id, translationProxy, Options.ValidationOptions, null, report));
                }
                }
            }

            var specification = ValidatorsFactory.GetOrInit <T>();

            var executionContext = new ExecutionContext(validationOptions, ValidatorsFactory);

            var errorsCollection = ValidatorExecutor.Execute(specification, model, executionContext, validationOptions.ValidationStrategy, 0);

            return(new ValidationResult <T>(Id, translationProxy, Options.ValidationOptions, model, errorsCollection));
        }
        private void InitializeValidators()
        {
            validators = new List <IValidator>();

            // Ideally this should be a dependency in the construtor, but since requirement is for parameterless constructor, create a new factory object here.
            IValidatorsFactory validatorsFactory = new ValidatorsFactory();

            // Ideally set of validators should be defined in some external configuration. For brevity, hard coding it here.
            // Note: Order of validators is also carefully defined with consideration. In case of multiple violation, first validation error will only occur.

            validators.Add(validatorsFactory.GetValidator(Constants.LengthValidatorName));
            validators.Add(validatorsFactory.GetValidator(Constants.InvalidCharValidatorName));
            validators.Add(validatorsFactory.GetValidator(Constants.ChecksumValidatorName));
        }
Beispiel #8
0
        public void Should_InitSpecification_WithValidator_And_WithKey()
        {
            var validatorsFactoryMock = new Mock <ISpecificationsRepository>();

            Specification <User> userSpecification = m => m.SetSingleError("user");

            var userSpecificationExecuted = false;

            validatorsFactoryMock
            .Setup(r => r.Get <User>())
            .Returns(() =>
            {
                userSpecificationExecuted = true;

                return(userSpecification);
            });

            Specification <Address> addressSpecification = m => m.SetSingleError("address");

            var addressSpecificationExecuted = false;

            validatorsFactoryMock
            .Setup(r => r.Get <Address>())
            .Returns(() =>
            {
                addressSpecificationExecuted = true;

                return(addressSpecification);
            });

            var validatorsFactory = new ValidatorsFactory(validatorsFactoryMock.Object);

            Specification <User> userDefinedSpecification = m => m.SetSingleError("user_defined");

            var validator = validatorsFactory.GetOrInit(userDefinedSpecification, "key");

            Assert.NotNull(validator);
            Assert.False(userSpecificationExecuted);
            Assert.False(addressSpecificationExecuted);

            Assert.Equal("key", validatorsFactory.Keys.Single());

            Assert.Equal("user_defined", validator.SingleError.Message);
        }
 public static Task ValidateOptionalAsync(this IField field, IJsonValue value, IList <string> errors, ValidationContext context = null)
 {
     return(new FieldValidator(ValidatorsFactory.CreateValidators(field).ToArray(), field).ValidateAsync(value,
                                                                                                         CreateContext(context).Optional(true),
                                                                                                         CreateFormatter(errors)));
 }