public void RegisterProviderPutsNewProviderAtEndOfListWhenDA35ProviderNotPresent()
        {
            var oldProviders = ModelValidatorProviders.Providers.ToList();
            var oldProvider  = oldProviders.Single(p => p is DataAnnotationsModelValidatorProvider);

            try {
                // Arrange
                ModelValidatorProviders.Providers.Remove(oldProvider);
                int oldCount = ModelValidatorProviders.Providers.Count;

                // Act
                DataAnnotations4ModelValidatorProvider.RegisterProvider();

                // Assert
                Assert.AreEqual(oldCount + 1, ModelValidatorProviders.Providers.Count);
                Assert.IsTrue(ModelValidatorProviders.Providers[oldCount] is DataAnnotations4ModelValidatorProvider);
            }
            finally {
                ModelValidatorProviders.Providers.Clear();

                foreach (ModelValidatorProvider p in oldProviders)
                {
                    ModelValidatorProviders.Providers.Add(p);
                }
            }
        }
        public void RegisterAdapterGuardClauses()
        {
            // Attribute type cannot be null
            ExceptionHelper.ExpectArgumentNullException(
                () => DataAnnotations4ModelValidatorProvider.RegisterAdapter(null, typeof(MyValidationAttributeAdapter)),
                "attributeType");

            // Adapter type cannot be null
            ExceptionHelper.ExpectArgumentNullException(
                () => DataAnnotations4ModelValidatorProvider.RegisterAdapter(typeof(MyValidationAttribute), null),
                "adapterType");

            // Validation attribute must derive from ValidationAttribute
            ExceptionHelper.ExpectArgumentException(
                () => DataAnnotations4ModelValidatorProvider.RegisterAdapter(typeof(object), typeof(MyValidationAttributeAdapter)),
                "The type System.Object must derive from System.ComponentModel.DataAnnotations.ValidationAttribute.\r\nParameter name: attributeType");

            // Adapter must derive from ModelValidator
            ExceptionHelper.ExpectArgumentException(
                () => DataAnnotations4ModelValidatorProvider.RegisterAdapter(typeof(MyValidationAttribute), typeof(object)),
                "The type System.Object must derive from System.Web.Mvc.ModelValidator.\r\nParameter name: adapterType");

            // Adapter must have the expected constructor
            ExceptionHelper.ExpectArgumentException(
                () => DataAnnotations4ModelValidatorProvider.RegisterAdapter(typeof(MyValidationAttribute), typeof(MyValidationAttributeAdapterBadCtor)),
                "The type Microsoft.Web.Mvc.AspNet4.Test.DataAnnotations4ModelValidatorProviderTest+MyValidationAttributeAdapterBadCtor must have a public constructor which accepts three parameters of types System.Web.Mvc.ModelMetadata, System.Web.Mvc.ControllerContext, and Microsoft.Web.Mvc.AspNet4.Test.DataAnnotations4ModelValidatorProviderTest+MyValidationAttribute.\r\nParameter name: adapterType");
        }
 public void RegisterDefaultValidatableObjectAdapterFactoryGuardClauses()
 {
     // Factory cannot be null
     ExceptionHelper.ExpectArgumentNullException(
         () => DataAnnotations4ModelValidatorProvider.RegisterDefaultValidatableObjectAdapterFactory(null),
         "factory");
 }
        public void RegisterAdapter()
        {
            var oldFactories = DataAnnotations4ModelValidatorProvider.AttributeFactories;

            try {
                // Arrange
                DataAnnotations4ModelValidatorProvider.AttributeFactories = new Dictionary <Type, DataAnnotationsModelValidationFactory>();

                // Act
                DataAnnotations4ModelValidatorProvider.RegisterAdapter(typeof(MyValidationAttribute), typeof(MyValidationAttributeAdapter));

                // Assert
                var type = DataAnnotations4ModelValidatorProvider.AttributeFactories.Keys.Single();
                Assert.AreEqual(typeof(MyValidationAttribute), type);

                var factory   = DataAnnotations4ModelValidatorProvider.AttributeFactories.Values.Single();
                var metadata  = ModelMetadataProviders.Current.GetMetadataForType(() => null, typeof(object));
                var context   = new ControllerContext();
                var attribute = new MyValidationAttribute();
                var validator = factory(metadata, context, attribute);
                Assert.AreEqual(typeof(MyValidationAttributeAdapter), validator.GetType());
            }
            finally {
                DataAnnotations4ModelValidatorProvider.AttributeFactories = oldFactories;
            }
        }
        public void ReferenceTypesDontGetImplicitRequiredAttribute()
        {
            // Arrange
            var provider = new DataAnnotations4ModelValidatorProvider();
            var context  = new ControllerContext();
            var metadata = ModelMetadataProviders.Current.GetMetadataForType(() => null, typeof(string));

            // Act
            IEnumerable <ModelValidator> validators = provider.GetValidators(metadata, context);

            // Assert
            Assert.AreEqual(0, validators.Count());
        }
        public void IValidatableObjectGetsAValidator()
        {
            // Arrange
            var provider        = new DataAnnotations4ModelValidatorProvider();
            var mockValidatable = new Mock <IValidatableObject>();
            var context         = new ControllerContext();
            var metadata        = ModelMetadataProviders.Current.GetMetadataForType(() => null, mockValidatable.Object.GetType());

            // Act
            IEnumerable <ModelValidator> validators = provider.GetValidators(metadata, context);

            // Assert
            Assert.AreEqual(1, validators.Count());
        }
        public void NonNullableValueTypeDoesntGetImplicitRequiredAttributeWhenFlagIsOff()
        {
            // Arrange
            var provider = new DataAnnotations4ModelValidatorProvider {
                AddImpliedRequiredAttributes = false
            };
            var context  = new ControllerContext();
            var metadata = ModelMetadataProviders.Current.GetMetadataForProperty(() => null, typeof(DummyRequiredAttributeHelperClass), "WithoutAttribute");

            // Act
            IEnumerable <ModelValidator> validators = provider.GetValidators(metadata, context);

            // Assert
            Assert.AreEqual(0, validators.Count());
        }
        public void UnknownValidationAttributeGetsDefaultAdapter()
        {
            // Arrange
            var provider = new DataAnnotations4ModelValidatorProvider();
            var context  = new ControllerContext();
            var metadata = ModelMetadataProviders.Current.GetMetadataForType(() => null, typeof(DummyClassWithDummyValidationAttribute));

            // Act
            IEnumerable <ModelValidator> validators = provider.GetValidators(metadata, context);

            // Assert
            var validator = validators.Single();

            Assert.AreEqual(typeof(DataAnnotations4ModelValidator), validator.GetType());
        }
        public void NonNullableValueTypesGetImplicitRequiredAttribute()
        {
            // Arrange
            var provider = new DataAnnotations4ModelValidatorProvider();
            var context  = new ControllerContext();
            var metadata = ModelMetadataProviders.Current.GetMetadataForProperty(() => null, typeof(DummyRequiredAttributeHelperClass), "WithoutAttribute");

            // Act
            IEnumerable <ModelValidator> validators = provider.GetValidators(metadata, context);

            // Assert
            ModelValidator            validator = validators.Single();
            ModelClientValidationRule rule      = validator.GetClientValidationRules().Single();

            Assert.AreEqual(typeof(ModelClientValidationRequiredRule), rule.GetType());
        }
        public void RegisterDefaultValidatableObjectAdapterGuardClauses()
        {
            // Adapter type cannot be null
            ExceptionHelper.ExpectArgumentNullException(
                () => DataAnnotations4ModelValidatorProvider.RegisterDefaultValidatableObjectAdapter(null),
                "adapterType");

            // Adapter must derive from ModelValidator
            ExceptionHelper.ExpectArgumentException(
                () => DataAnnotations4ModelValidatorProvider.RegisterDefaultValidatableObjectAdapter(typeof(object)),
                "The type System.Object must derive from System.Web.Mvc.ModelValidator.\r\nParameter name: adapterType");

            // Adapter must have the expected constructor
            ExceptionHelper.ExpectArgumentException(
                () => DataAnnotations4ModelValidatorProvider.RegisterDefaultValidatableObjectAdapter(typeof(MyValidatableAdapterBadCtor)),
                "The type Microsoft.Web.Mvc.AspNet4.Test.DataAnnotations4ModelValidatorProviderTest+MyValidatableAdapterBadCtor must have a public constructor which accepts two parameters of types System.Web.Mvc.ModelMetadata and System.Web.Mvc.ControllerContext.\r\nParameter name: adapterType");
        }
        public void RegisterValidatableObjectAdapterFactoryGuardClauses()
        {
            DataAnnotations4ValidatableObjectAdapterFactory factory = (metadata, context) => null;

            // Attribute type cannot be null
            ExceptionHelper.ExpectArgumentNullException(
                () => DataAnnotations4ModelValidatorProvider.RegisterValidatableObjectAdapterFactory(null, factory),
                "modelType");

            // Factory cannot be null
            ExceptionHelper.ExpectArgumentNullException(
                () => DataAnnotations4ModelValidatorProvider.RegisterValidatableObjectAdapterFactory(typeof(MyValidatableClass), null),
                "factory");

            // Validation attribute must derive from ValidationAttribute
            ExceptionHelper.ExpectArgumentException(
                () => DataAnnotations4ModelValidatorProvider.RegisterValidatableObjectAdapterFactory(typeof(object), factory),
                "The type System.Object must derive from System.ComponentModel.DataAnnotations.IValidatableObject.\r\nParameter name: modelType");
        }
        public void RegisterDefaultValidatableObjectAdapter()
        {
            var oldFactory = DataAnnotations4ModelValidatorProvider.DefaultValidatableFactory;

            try {
                // Arrange
                var metadata = ModelMetadataProviders.Current.GetMetadataForType(() => null, typeof(MyValidatableClass));
                var context  = new ControllerContext();
                DataAnnotations4ModelValidatorProvider.RegisterDefaultValidatableObjectAdapter(typeof(MyValidatableAdapter));

                // Act
                var result = new DataAnnotations4ModelValidatorProvider().GetValidators(metadata, context).Single();

                // Assert
                Assert.AreEqual(typeof(MyValidatableAdapter), result.GetType());
            }
            finally {
                DataAnnotations4ModelValidatorProvider.DefaultValidatableFactory = oldFactory;
            }
        }
        public void RegisterValidatableObjectAdapterFactory()
        {
            var oldFactories = DataAnnotations4ModelValidatorProvider.ValidatableFactories;

            try {
                // Arrange
                DataAnnotations4ModelValidatorProvider.ValidatableFactories = new Dictionary <Type, DataAnnotations4ValidatableObjectAdapterFactory>();
                DataAnnotations4ValidatableObjectAdapterFactory factory = delegate { return(null); };

                // Act
                DataAnnotations4ModelValidatorProvider.RegisterValidatableObjectAdapterFactory(typeof(MyValidatableClass), factory);

                // Assert
                var type = DataAnnotations4ModelValidatorProvider.ValidatableFactories.Keys.Single();
                Assert.AreEqual(typeof(MyValidatableClass), type);
                Assert.AreSame(factory, DataAnnotations4ModelValidatorProvider.ValidatableFactories.Values.Single());
            }
            finally {
                DataAnnotations4ModelValidatorProvider.ValidatableFactories = oldFactories;
            }
        }
        public void RegisterDefaultValidatableObjectAdapterFactory()
        {
            var oldFactory = DataAnnotations4ModelValidatorProvider.DefaultValidatableFactory;

            try {
                // Arrange
                var            metadata  = ModelMetadataProviders.Current.GetMetadataForType(() => null, typeof(MyValidatableClass));
                var            context   = new ControllerContext();
                ModelValidator validator = new Mock <ModelValidator>(metadata, context).Object;
                DataAnnotations4ValidatableObjectAdapterFactory factory = delegate { return(validator); };
                DataAnnotations4ModelValidatorProvider.RegisterDefaultValidatableObjectAdapterFactory(factory);

                // Act
                var result = new DataAnnotations4ModelValidatorProvider().GetValidators(metadata, context).Single();

                // Assert
                Assert.AreSame(validator, result);
            }
            finally {
                DataAnnotations4ModelValidatorProvider.DefaultValidatableFactory = oldFactory;
            }
        }
        public void RegisterProviderRemovesExistingDA35ProviderAndRegistersItself()
        {
            var oldProviders     = ModelValidatorProviders.Providers.ToList();
            var oldProvider      = oldProviders.Single(p => p is DataAnnotationsModelValidatorProvider);
            int oldProviderIndex = oldProviders.IndexOf(oldProvider);

            try {
                // Act
                DataAnnotations4ModelValidatorProvider.RegisterProvider();

                // Assert
                Assert.AreEqual(oldProviders.Count, ModelValidatorProviders.Providers.Count);
                Assert.IsTrue(ModelValidatorProviders.Providers[oldProviderIndex] is DataAnnotations4ModelValidatorProvider);
            }
            finally {
                ModelValidatorProviders.Providers.Clear();

                foreach (ModelValidatorProvider p in oldProviders)
                {
                    ModelValidatorProviders.Providers.Add(p);
                }
            }
        }