public void GetValidators_CachesAllValidators()
        {
            // Arrange
            var cache             = new ValidatorCache();
            var metadata          = new TestModelMetadataProvider().GetMetadataForProperty(typeof(TypeWithProperty), "Property1");
            var validatorProvider = TestModelValidatorProvider.CreateDefaultProvider();

            // Act - 1
            var validators1 = cache.GetValidators(metadata, validatorProvider);

            // Assert - 1
            var attribute1 = Assert.IsType <DataAnnotationsModelValidator>(validators1[0]).Attribute;
            var attribute2 = Assert.IsType <DataAnnotationsModelValidator>(validators1[1]).Attribute;

            Assert.Contains(attribute1, metadata.ValidatorMetadata); // Copied by provider
            Assert.Contains(attribute2, metadata.ValidatorMetadata); // Copied by provider

            // Act - 2
            var validators2 = cache.GetValidators(metadata, validatorProvider);

            // Assert - 2
            Assert.Same(validators1, validators2);

            Assert.Contains(validators1[0], validators2); // Cached
            Assert.Contains(validators1[1], validators2); // Cached
        }
        public void CreateValidators_ModelValidatorAttributeOnClass()
        {
            // Arrange
            var metadataProvider  = TestModelMetadataProvider.CreateDefaultProvider();
            var validatorProvider = TestModelValidatorProvider.CreateDefaultProvider();

            var metadata = metadataProvider.GetMetadataForType(typeof(ModelValidatorAttributeOnClass));
            var context  = new ModelValidatorProviderContext(metadata, GetValidatorItems(metadata));

            // Act
            validatorProvider.CreateValidators(context);

            // Assert
            var validatorItems = context.Results;

            var validator = Assert.IsType <CustomModelValidatorAttribute>(Assert.Single(validatorItems).Validator);

            Assert.Equal("Class", validator.Tag);
        }
        public void CreateValidators_ForIValidatableObject()
        {
            // Arrange
            var metadataProvider  = TestModelMetadataProvider.CreateDefaultProvider();
            var validatorProvider = TestModelValidatorProvider.CreateDefaultProvider();

            var metadata = metadataProvider.GetMetadataForType(typeof(ValidatableObject));
            var context  = new ModelValidatorProviderContext(metadata, GetValidatorItems(metadata));

            // Act
            validatorProvider.CreateValidators(context);

            // Assert
            var validatorItems = context.Results;

            var validatorItem = Assert.Single(validatorItems);

            Assert.IsType <ValidatableObjectAdapter>(validatorItem.Validator);
        }
        public void CreateValidators_ModelValidatorAttributeOnPropertyAndClass()
        {
            // Arrange
            var metadataProvider  = TestModelMetadataProvider.CreateDefaultProvider();
            var validatorProvider = TestModelValidatorProvider.CreateDefaultProvider();

            var metadata = metadataProvider.GetMetadataForProperty(
                typeof(ModelValidatorAttributeOnPropertyAndClass),
                nameof(ModelValidatorAttributeOnPropertyAndClass.Property));
            var context = new ModelValidatorProviderContext(metadata, GetValidatorItems(metadata));

            // Act
            validatorProvider.CreateValidators(context);

            // Assert
            var validatorItems = context.Results;

            Assert.Equal(2, validatorItems.Count);
            Assert.Single(validatorItems, v => Assert.IsType <CustomModelValidatorAttribute>(v.Validator).Tag == "Class");
            Assert.Single(validatorItems, v => Assert.IsType <CustomModelValidatorAttribute>(v.Validator).Tag == "Property");
        }
        public void CreateValidators_FromModelMetadataType_MergedValidators()
        {
            // Arrange
            var metadataProvider  = TestModelMetadataProvider.CreateDefaultProvider();
            var validatorProvider = TestModelValidatorProvider.CreateDefaultProvider();

            var metadata = metadataProvider.GetMetadataForProperty(
                typeof(ProductViewModel),
                nameof(ProductViewModel.Name));
            var context = new ModelValidatorProviderContext(metadata, GetValidatorItems(metadata));

            // Act
            validatorProvider.CreateValidators(context);

            // Assert
            var validatorItems = context.Results;

            Assert.Equal(2, validatorItems.Count);
            Assert.Single(validatorItems, v => ((DataAnnotationsModelValidator)v.Validator).Attribute is RegularExpressionAttribute);
            Assert.Single(validatorItems, v => ((DataAnnotationsModelValidator)v.Validator).Attribute is StringLengthAttribute);
        }
        public void CreateValidators_FromModelMetadataType_SingleValidator()
        {
            // Arrange
            var metadataProvider  = TestModelMetadataProvider.CreateDefaultProvider();
            var validatorProvider = TestModelValidatorProvider.CreateDefaultProvider();

            var metadata = metadataProvider.GetMetadataForProperty(
                typeof(ProductViewModel),
                nameof(ProductViewModel.Id));
            var context = new ModelValidatorProviderContext(metadata, GetValidatorItems(metadata));

            // Act
            validatorProvider.CreateValidators(context);

            // Assert
            var validatorItems = context.Results;

            var adapter = Assert.IsType <DataAnnotationsModelValidator>(Assert.Single(validatorItems).Validator);

            Assert.IsType <RangeAttribute>(adapter.Attribute);
        }