public void GetBinderReturnsValueFromFirstSuccessfulBinderProvider()
        {
            // Arrange
            var testType = typeof(string);
            IModelBinder nullModelBinder = null;
            IModelBinder expectedBinder = new Mock<IModelBinder>().Object;
            IModelBinder secondMatchingBinder = new Mock<IModelBinder>().Object;

            var provider1 = new Mock<IModelBinderProvider>();
            provider1.Setup(p => p.GetBinder(testType)).Returns(nullModelBinder);

            var provider2 = new Mock<IModelBinderProvider>(MockBehavior.Strict);
            provider2.Setup(p => p.GetBinder(testType)).Returns(expectedBinder);

            var provider3 = new Mock<IModelBinderProvider>(MockBehavior.Strict);
            provider3.Setup(p => p.GetBinder(testType)).Returns(secondMatchingBinder);

            var collection = new ModelBinderProviderCollection(new[] { provider1.Object, provider2.Object, provider3.Object });

            // Act
            IModelBinder returnedBinder = collection.GetBinder(testType);

            // Assert
            Assert.Same(expectedBinder, returnedBinder);
        }
        public void GuardClause()
        {
            // Arrange
            var collection = new ModelBinderProviderCollection();

            // Act & Assert
            Assert.ThrowsArgumentNull(
                () => collection.GetBinder(null),
                "modelType"
                );
        }
        public void GuardClause() {

            //Arrange
            var collection = new ModelBinderProviderCollection();

            //Act & Assert
            ExceptionHelper.ExpectArgumentNullException(
                () => collection.GetBinder(null),
                "modelType"
                );
        }
        public void GetBinderUsesRegisteredProviders() {
            //Arrange
            var testType = typeof(string);
            var expectedBinder = new Mock<IModelBinder>().Object;

            var provider = new Mock<IModelBinderProvider>(MockBehavior.Strict);
            provider.Setup(p => p.GetBinder(testType)).Returns(expectedBinder);
            var collection = new ModelBinderProviderCollection(new[] { provider.Object });

            //Act
            IModelBinder returnedBinder = collection.GetBinder(testType);

            //Assert
            Assert.AreSame(expectedBinder, returnedBinder);
        }
        public void Initialize_ReplacesOriginalCollection() {
            // Arrange
            ModelBinderDictionary oldBinders = new ModelBinderDictionary();
            oldBinders[typeof(int)] = new Mock<IModelBinder>().Object;
            ModelBinderProviderCollection newBinderProviders = new ModelBinderProviderCollection();

            // Act
            ModelBinderConfig.Initialize(oldBinders, newBinderProviders);

            // Assert
            Assert.AreEqual(0, oldBinders.Count, "Old binder dictionary should have been cleared.");

            ExtensibleModelBinderAdapter shimBinder = oldBinders.DefaultBinder as ExtensibleModelBinderAdapter;
            Assert.IsNotNull(shimBinder, "The default binder for the old system should have been replaced with a compatibility shim.");
            Assert.AreSame(newBinderProviders, shimBinder.Providers, "Providers collection was not passed through correctly.");
        }
        public void Initialize_ReplacesOriginalCollection()
        {
            // Arrange
            ModelBinderDictionary oldBinders = new ModelBinderDictionary();
            oldBinders[typeof(int)] = new Mock<IModelBinder>().Object;
            ModelBinderProviderCollection newBinderProviders = new ModelBinderProviderCollection();

            // Act
            ModelBinderConfig.Initialize(oldBinders, newBinderProviders);

            // Assert
            Assert.Empty(oldBinders);

            var shimBinder = Assert.IsType<ExtensibleModelBinderAdapter>(oldBinders.DefaultBinder);
            Assert.Same(newBinderProviders, shimBinder.Providers);
        }
        public void BindModel_SuccessfulBind_RunsValidationAndReturnsModel()
        {
            // Arrange
            ControllerContext controllerContext = GetControllerContext();
            bool validationCalled = false;

            ModelBindingContext bindingContext = new ModelBindingContext
            {
                FallbackToEmptyPrefix = true,
                ModelMetadata = new DataAnnotationsModelMetadataProvider().GetMetadataForType(null, typeof(int)),
                ModelName = "someName",
                ModelState = controllerContext.Controller.ViewData.ModelState,
                PropertyFilter = _ => true,
                ValueProvider = new SimpleValueProvider
                {
                    { "someName", "dummyValue" }
                }
            };

            Mock<IExtensibleModelBinder> mockIntBinder = new Mock<IExtensibleModelBinder>();
            mockIntBinder
                .Setup(o => o.BindModel(controllerContext, It.IsAny<ExtensibleModelBindingContext>()))
                .Returns(
                    delegate(ControllerContext cc, ExtensibleModelBindingContext mbc)
                    {
                        Assert.Same(bindingContext.ModelMetadata, mbc.ModelMetadata);
                        Assert.Equal("someName", mbc.ModelName);
                        Assert.Same(bindingContext.ValueProvider, mbc.ValueProvider);

                        mbc.Model = 42;
                        mbc.ValidationNode.Validating += delegate { validationCalled = true; };
                        return true;
                    });

            ModelBinderProviderCollection binderProviders = new ModelBinderProviderCollection();
            binderProviders.RegisterBinderForType(typeof(int), mockIntBinder.Object, false /* suppressPrefixCheck */);
            ExtensibleModelBinderAdapter shimBinder = new ExtensibleModelBinderAdapter(binderProviders);

            // Act
            object retVal = shimBinder.BindModel(controllerContext, bindingContext);

            // Assert
            Assert.Equal(42, retVal);
            Assert.True(validationCalled);
            Assert.True(bindingContext.ModelState.IsValid);
        }
        private static void TestCacheReset(Action<ModelBinderProviderCollection> mutatingAction)
        {
            // Arrange
            var providers = new List<IModelBinderProvider>() 
            {
                new Mock<IModelBinderProvider>(MockBehavior.Strict).Object, 
                new Mock<IModelBinderProvider>(MockBehavior.Strict).Object
            };
            var collection = new ModelBinderProviderCollection(providers);

            // Act
            mutatingAction(collection);

            IModelBinderProvider[] combined = collection.CombinedItems;

            // Assert
            Assert.Equal(providers, combined);
        }
        public void ModelBinderProviderCollectionCombinedItemsCaches()
        {
            // Arrange
            var providers = new IModelBinderProvider[] 
            {
                new Mock<IModelBinderProvider>(MockBehavior.Strict).Object, 
                new Mock<IModelBinderProvider>(MockBehavior.Strict).Object
            };
            var collection = new ModelBinderProviderCollection(providers);

            // Act
            var combined1 = collection.CombinedItems;
            var combined2 = collection.CombinedItems;

            // Assert
            Assert.Equal(providers, combined1);
            Assert.Same(combined1, combined2);
        }
        public void GetBinderReturnsNullWhenNoSuccessfulBinderProviders() {
            //Arrange
            var testType = typeof(string);
            IModelBinder nullModelBinder = null;

            var provider1 = new Mock<IModelBinderProvider>();
            provider1.Setup(p => p.GetBinder(testType)).Returns(nullModelBinder);

            var provider2 = new Mock<IModelBinderProvider>(MockBehavior.Strict);
            provider2.Setup(p => p.GetBinder(testType)).Returns(nullModelBinder);

            var collection = new ModelBinderProviderCollection(new[] { provider1.Object, provider2.Object });

            //Act
            IModelBinder returnedBinder = collection.GetBinder(testType);

            //Assert
            Assert.IsNull(returnedBinder);
        }
Esempio n. 11
0
        public void GetBinderReturnsNullIfNoProviderMatches()
        {
            // Arrange
            ControllerContext             controllerContext = new ControllerContext();
            ExtensibleModelBindingContext bindingContext    = new ExtensibleModelBindingContext
            {
                ModelMetadata = new EmptyModelMetadataProvider().GetMetadataForType(null, typeof(object))
            };

            ModelBinderProviderCollection collection = new ModelBinderProviderCollection(new[]
            {
                new Mock <ModelBinderProvider>().Object,
            });

            // Act
            IExtensibleModelBinder returned = collection.GetBinder(controllerContext, bindingContext);

            // Assert
            Assert.Null(returned);
        }
        public void RegisterBinderForType_Factory()
        {
            // Arrange
            ModelBinderProvider    mockProvider = new Mock <ModelBinderProvider>().Object;
            IExtensibleModelBinder mockBinder   = new Mock <IExtensibleModelBinder>().Object;

            ModelBinderProviderCollection collection = new ModelBinderProviderCollection
            {
                mockProvider
            };

            // Act
            collection.RegisterBinderForType(typeof(int), () => mockBinder);

            // Assert
            var simpleProvider = Assert.IsType <SimpleModelBinderProvider>(collection[0]);

            Assert.Equal(typeof(int), simpleProvider.ModelType);
            Assert.Equal(mockProvider, collection[1]);
        }
Esempio n. 13
0
        public void GetRequiredBinderThrowsIfNoProviderMatches()
        {
            // Arrange
            ControllerContext             controllerContext = new ControllerContext();
            ExtensibleModelBindingContext bindingContext    = new ExtensibleModelBindingContext()
            {
                ModelMetadata = new EmptyModelMetadataProvider().GetMetadataForType(null, typeof(int))
            };

            ModelBinderProviderCollection collection = new ModelBinderProviderCollection(new ModelBinderProvider[] {
                new Mock <ModelBinderProvider>().Object,
            });

            // Act & assert
            ExceptionHelper.ExpectInvalidOperationException(
                delegate {
                collection.GetRequiredBinder(controllerContext, bindingContext);
            },
                @"A binder for type System.Int32 could not be located.");
        }
Esempio n. 14
0
        public void RegisterBinderForType_Instance_InsertsNewProviderBehindFrontOfListProviders()
        {
            // Arrange
            ModelBinderProvider    frontOfListProvider = new ProviderAtFront();
            IExtensibleModelBinder mockBinder          = new Mock <IExtensibleModelBinder>().Object;

            ModelBinderProviderCollection collection = new ModelBinderProviderCollection()
            {
                frontOfListProvider
            };

            // Act
            collection.RegisterBinderForType(typeof(int), mockBinder);

            // Assert
            CollectionAssert.AreEqual(
                new Type[] { typeof(ProviderAtFront), typeof(SimpleModelBinderProvider) },
                collection.Select(o => o.GetType()).ToArray(),
                "New provider should be inserted after any marked 'front of list'.");
        }
Esempio n. 15
0
        public void RegisterBinderForGenericType_Type()
        {
            // Arrange
            ModelBinderProvider    mockProvider = new Mock <ModelBinderProvider>().Object;
            IExtensibleModelBinder mockBinder   = new Mock <IExtensibleModelBinder>().Object;

            ModelBinderProviderCollection collection = new ModelBinderProviderCollection
            {
                mockProvider
            };

            // Act
            collection.RegisterBinderForGenericType(typeof(List <>), typeof(CollectionModelBinder <>));

            // Assert
            var genericProvider = Assert.IsType <GenericModelBinderProvider>(collection[0]);

            Assert.Equal(typeof(List <>), genericProvider.ModelType);
            Assert.Equal(mockProvider, collection[1]);
        }
        public void BindModel_PropertyFilterIsSet_Throws() {
            // Arrange
            ControllerContext controllerContext = GetControllerContext();

            ModelBindingContext bindingContext = new ModelBindingContext() {
                FallbackToEmptyPrefix = true,
                ModelMetadata = new DataAnnotationsModelMetadataProvider().GetMetadataForType(null, typeof(SimpleModel)),
                PropertyFilter = (new BindAttribute() { Include = "FirstName " }).IsPropertyAllowed
            };

            ModelBinderProviderCollection binderProviders = new ModelBinderProviderCollection();
            ExtensibleModelBinderAdapter shimBinder = new ExtensibleModelBinderAdapter(binderProviders);

            // Act & assert
            ExceptionHelper.ExpectInvalidOperationException(
                delegate {
                    shimBinder.BindModel(controllerContext, bindingContext);
                },
                @"The new model binding system cannot be used when a property whitelist or blacklist has been specified in [Bind] or via the call to UpdateModel() / TryUpdateModel(). Use the [BindRequired] and [BindNever] attributes on the model type or its properties instead.");
        }
        public void BindModel_PropertyFilterIsSet_Throws()
        {
            // Arrange
            ControllerContext controllerContext = GetControllerContext();

            ModelBindingContext bindingContext = new ModelBindingContext
            {
                FallbackToEmptyPrefix = true,
                ModelMetadata = new DataAnnotationsModelMetadataProvider().GetMetadataForType(null, typeof(SimpleModel)),
                PropertyFilter = (new BindAttribute { Include = "FirstName " }).IsPropertyAllowed
            };

            ModelBinderProviderCollection binderProviders = new ModelBinderProviderCollection();
            ExtensibleModelBinderAdapter shimBinder = new ExtensibleModelBinderAdapter(binderProviders);

            // Act & assert

            Assert.Throws<InvalidOperationException>(
                delegate { shimBinder.BindModel(controllerContext, bindingContext); },
                @"The new model binding system cannot be used when a property whitelist or blacklist has been specified in [Bind] or via the call to UpdateModel() / TryUpdateModel(). Use the [BindRequired] and [BindNever] attributes on the model type or its properties instead.");
        }
        public void ModelBinderProviderCollectionCombinedItemsDelegatesToResolver()
        {
            // Arrange
            var firstProvider = new Mock<IModelBinderProvider>();
            var secondProvider = new Mock<IModelBinderProvider>();
            var thirdProvider = new Mock<IModelBinderProvider>();
            var dependencyProviders = new IModelBinderProvider[] { firstProvider.Object, secondProvider.Object };
            var collectionProviders = new IModelBinderProvider[] { thirdProvider.Object };
            var expectedProviders = new IModelBinderProvider[] { firstProvider.Object, secondProvider.Object, thirdProvider.Object };

            var resolver = new Mock<IDependencyResolver>();
            resolver.Setup(r => r.GetServices(typeof(IModelBinderProvider))).Returns(dependencyProviders);

            var providers = new ModelBinderProviderCollection(collectionProviders, resolver.Object);

            // Act
            IModelBinderProvider[] combined = providers.CombinedItems;

            // Assert
            Assert.Equal(expectedProviders, combined);
        }
Esempio n. 19
0
        public void RegisterBinderForGenericType_Instance()
        {
            // Arrange
            ModelBinderProvider    mockProvider = new Mock <ModelBinderProvider>().Object;
            IExtensibleModelBinder mockBinder   = new Mock <IExtensibleModelBinder>().Object;

            ModelBinderProviderCollection collection = new ModelBinderProviderCollection()
            {
                mockProvider
            };

            // Act
            collection.RegisterBinderForGenericType(typeof(List <>), mockBinder);

            // Assert
            GenericModelBinderProvider genericProvider = collection[0] as GenericModelBinderProvider;

            Assert.IsNotNull(genericProvider, "Generic provider should've been inserted at the front of the list.");
            Assert.AreEqual(typeof(List <>), genericProvider.ModelType);
            Assert.AreEqual(mockProvider, collection[1]);
        }
Esempio n. 20
0
        public void RegisterBinderForType_Instance()
        {
            // Arrange
            ModelBinderProvider    mockProvider = new Mock <ModelBinderProvider>().Object;
            IExtensibleModelBinder mockBinder   = new Mock <IExtensibleModelBinder>().Object;

            ModelBinderProviderCollection collection = new ModelBinderProviderCollection()
            {
                mockProvider
            };

            // Act
            collection.RegisterBinderForType(typeof(int), mockBinder);

            // Assert
            SimpleModelBinderProvider simpleProvider = collection[0] as SimpleModelBinderProvider;

            Assert.IsNotNull(simpleProvider, "Simple provider should've been inserted at the front of the list.");
            Assert.AreEqual(typeof(int), simpleProvider.ModelType);
            Assert.AreEqual(mockProvider, collection[1]);
        }
        public void GetBinderConsultsProviders() {

            //Arrange
            Type modelType = typeof(string);
            IModelBinder expectedBinderFromProvider = new Mock<IModelBinder>().Object;

            Mock<IModelBinderProvider> locatedProvider = new Mock<IModelBinderProvider>();
            locatedProvider.Setup(p => p.GetBinder(modelType))
                .Returns(expectedBinderFromProvider);

            Mock<IModelBinderProvider> secondProvider = new Mock<IModelBinderProvider>();

            ModelBinderProviderCollection providers = new ModelBinderProviderCollection(new IModelBinderProvider[] { locatedProvider.Object, secondProvider.Object });
            ModelBinderDictionary binders = new ModelBinderDictionary(providers);

            //Act
            IModelBinder returnedBinder = binders.GetBinder(modelType);

            //Assert
            Assert.AreSame(expectedBinderFromProvider, returnedBinder);
        }
        public void GetBinderThrowsIfGenericProviderHasNoParameterlessConstructor()
        {
            // Arrange
            ControllerContext             controllerContext = new ControllerContext();
            ModelBinderProviderCollection collection        = new ModelBinderProviderCollection();
            ExtensibleModelBindingContext bindingContext    = new ExtensibleModelBindingContext
            {
                ModelMetadata = new EmptyModelMetadataProvider().GetMetadataForType(
                    null,
                    typeof(ModelWithProviderAttribute_ProviderHasNoParameterlessConstructor <int>)
                    ),
            };

            // Act & Assert, confirming type name and full stack are available in Exception
            MissingMethodException exception = Assert.Throws <MissingMethodException>(
                () => collection.GetBinder(controllerContext, bindingContext),
                "No parameterless constructor defined for this object. Object type 'Microsoft.Web.Mvc.ModelBinding.Test.ModelBinderProviderCollectionTest+NoParameterlessCtorBinder`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'."
                );

            Assert.Contains("System.Activator.CreateInstance(", exception.ToString());
        }
Esempio n. 23
0
        public void GetBinderDelegatesToResolver()
        {
            // Arrange
            Type         modelType      = typeof(string);
            IModelBinder expectedBinder = new Mock <IModelBinder>().Object;

            Mock <IModelBinderProvider> locatedProvider = new Mock <IModelBinderProvider>();

            locatedProvider.Setup(p => p.GetBinder(modelType)).Returns(expectedBinder);

            Mock <IModelBinderProvider> secondProvider = new Mock <IModelBinderProvider>();
            Mock <IModelBinderProvider> thirdProvider  = new Mock <IModelBinderProvider>();

            IModelBinderProvider[] dependencyProviders = new IModelBinderProvider[]
            {
                locatedProvider.Object,
                secondProvider.Object
            };
            IModelBinderProvider[] collectionProviders = new IModelBinderProvider[]
            {
                thirdProvider.Object
            };

            Mock <IDependencyResolver> resolver = new Mock <IDependencyResolver>();

            resolver
            .Setup(r => r.GetServices(typeof(IModelBinderProvider)))
            .Returns(dependencyProviders);

            ModelBinderProviderCollection providers = new ModelBinderProviderCollection(
                collectionProviders,
                resolver.Object
                );

            // Act
            IModelBinder returnedBinder = providers.GetBinder(modelType);

            // Assert
            Assert.Same(expectedBinder, returnedBinder);
        }
        public void GetBinderThrowsIfModelTypeHasBindAttribute()
        {
            // Arrange
            ControllerContext             controllerContext = new ControllerContext();
            ExtensibleModelBindingContext bindingContext    = new ExtensibleModelBindingContext
            {
                ModelMetadata = new EmptyModelMetadataProvider().GetMetadataForType(
                    null,
                    typeof(ModelWithBindAttribute)
                    )
            };
            ModelBinderProviderCollection collection = new ModelBinderProviderCollection();

            // Act & assert
            Assert.Throws <InvalidOperationException>(
                delegate
            {
                collection.GetBinder(controllerContext, bindingContext);
            },
                @"The model of type 'Microsoft.Web.Mvc.ModelBinding.Test.ModelBinderProviderCollectionTest+ModelWithBindAttribute' has a [Bind] attribute. The new model binding system cannot be used with models that have type-level [Bind] attributes. Use the [BindRequired] and [BindNever] attributes on the model type or its properties instead."
                );
        }
Esempio n. 25
0
        public void GetBinderConsultsProviders()
        {
            //Arrange
            Type         modelType = typeof(string);
            IModelBinder expectedBinderFromProvider = new Mock <IModelBinder>().Object;

            Mock <IModelBinderProvider> locatedProvider = new Mock <IModelBinderProvider>();

            locatedProvider.Setup(p => p.GetBinder(modelType))
            .Returns(expectedBinderFromProvider);

            Mock <IModelBinderProvider> secondProvider = new Mock <IModelBinderProvider>();

            ModelBinderProviderCollection providers = new ModelBinderProviderCollection(new IModelBinderProvider[] { locatedProvider.Object, secondProvider.Object });
            ModelBinderDictionary         binders   = new ModelBinderDictionary(providers);

            //Act
            IModelBinder returnedBinder = binders.GetBinder(modelType);

            //Assert
            Assert.AreSame(expectedBinderFromProvider, returnedBinder);
        }
        public void GetBinderReturnsNullWhenNoSuccessfulBinderProviders()
        {
            // Arrange
            var          testType        = typeof(string);
            IModelBinder nullModelBinder = null;

            var provider1 = new Mock <IModelBinderProvider>();

            provider1.Setup(p => p.GetBinder(testType)).Returns(nullModelBinder);

            var provider2 = new Mock <IModelBinderProvider>(MockBehavior.Strict);

            provider2.Setup(p => p.GetBinder(testType)).Returns(nullModelBinder);

            var collection = new ModelBinderProviderCollection(new[] { provider1.Object, provider2.Object });

            // Act
            IModelBinder returnedBinder = collection.GetBinder(testType);

            // Assert
            Assert.Null(returnedBinder);
        }
Esempio n. 27
0
        public void ModelBinderProviderCollectionCombinedItemsDelegatesToResolver()
        {
            // Arrange
            var firstProvider       = new Mock <IModelBinderProvider>();
            var secondProvider      = new Mock <IModelBinderProvider>();
            var thirdProvider       = new Mock <IModelBinderProvider>();
            var dependencyProviders = new IModelBinderProvider[] { firstProvider.Object, secondProvider.Object };
            var collectionProviders = new IModelBinderProvider[] { thirdProvider.Object };
            var expectedProviders   = new IModelBinderProvider[] { firstProvider.Object, secondProvider.Object, thirdProvider.Object };

            var resolver = new Mock <IDependencyResolver>();

            resolver.Setup(r => r.GetServices(typeof(IModelBinderProvider))).Returns(dependencyProviders);

            var providers = new ModelBinderProviderCollection(collectionProviders, resolver.Object);

            // Act
            IModelBinderProvider[] combined = providers.CombinedItems;

            // Assert
            Assert.Equal(expectedProviders, combined);
        }
        public void GetBinder_FromAttribute_BadAttribute_Throws()
        {
            // Arrange
            ControllerContext             controllerContext = new ControllerContext();
            ExtensibleModelBindingContext bindingContext    = new ExtensibleModelBindingContext
            {
                ModelMetadata = new EmptyModelMetadataProvider().GetMetadataForType(
                    null,
                    typeof(ModelWithProviderAttribute_BadAttribute)
                    )
            };

            ModelBinderProviderCollection providers = new ModelBinderProviderCollection();

            // Act & assert
            Assert.Throws <InvalidOperationException>(
                delegate
            {
                providers.GetBinder(controllerContext, bindingContext);
            },
                @"The type 'System.Object' does not subclass Microsoft.Web.Mvc.ModelBinding.ModelBinderProvider or implement the interface Microsoft.Web.Mvc.ModelBinding.IExtensibleModelBinder."
                );
        }
        public void GetBinderReturnsFirstBinderFromProviders()
        {
            // Arrange
            ControllerContext             controllerContext = new ControllerContext();
            ExtensibleModelBindingContext bindingContext    = new ExtensibleModelBindingContext
            {
                ModelMetadata = new EmptyModelMetadataProvider().GetMetadataForType(
                    null,
                    typeof(object)
                    )
            };
            IExtensibleModelBinder expectedBinder = new Mock <IExtensibleModelBinder>().Object;

            Mock <ModelBinderProvider> mockProvider = new Mock <ModelBinderProvider>();

            mockProvider
            .Setup(p => p.GetBinder(controllerContext, bindingContext))
            .Returns(expectedBinder);

            ModelBinderProviderCollection collection = new ModelBinderProviderCollection(
                new[]
            {
                new Mock <ModelBinderProvider>().Object,
                mockProvider.Object,
                new Mock <ModelBinderProvider>().Object
            }
                );

            // Act
            IExtensibleModelBinder returned = collection.GetBinder(
                controllerContext,
                bindingContext
                );

            // Assert
            Assert.Equal(expectedBinder, returned);
        }
        public void GetBinderDelegatesToResolver()
        {
            // Arrange
            Type         modelType      = typeof(string);
            IModelBinder expectedBinder = new Mock <IModelBinder>().Object;

            Mock <IModelBinderProvider> locatedProvider = new Mock <IModelBinderProvider>();

            locatedProvider.Setup(p => p.GetBinder(modelType))
            .Returns(expectedBinder);

            Mock <IModelBinderProvider> secondProvider = new Mock <IModelBinderProvider>();
            Resolver <IEnumerable <IModelBinderProvider> > resolver = new Resolver <IEnumerable <IModelBinderProvider> > {
                Current = new IModelBinderProvider[] { locatedProvider.Object, secondProvider.Object }
            };

            ModelBinderProviderCollection providers = new ModelBinderProviderCollection(resolver);

            // Act
            IModelBinder returnedBinder = providers.GetBinder(modelType);

            // Assert
            Assert.Same(expectedBinder, returnedBinder);
        }
Esempio n. 31
0
        public void GetBinder_FromAttribute_Binder_ValueNotPresent_ReturnsNull()
        {
            // Arrange
            ControllerContext             controllerContext = new ControllerContext();
            ExtensibleModelBindingContext bindingContext    = new ExtensibleModelBindingContext()
            {
                ModelMetadata = new EmptyModelMetadataProvider().GetMetadataForType(null, typeof(ModelWithProviderAttribute_Binder)),
                ModelName     = "foo",
                ValueProvider = new SimpleValueProvider()
                {
                    { "bar", "barValue" }
                }
            };

            ModelBinderProviderCollection providers = new ModelBinderProviderCollection();

            providers.RegisterBinderForType(typeof(ModelWithProviderAttribute_Binder), new Mock <IExtensibleModelBinder>().Object, true /* suppressPrefix */);

            // Act
            IExtensibleModelBinder binder = providers.GetBinder(controllerContext, bindingContext);

            // Assert
            Assert.IsNull(binder, "Binder should've come from attribute rather than collection, even if the attribute's provider returns null.");
        }
        public void GetBinder_FromAttribute_Binder_ValuePresent_ReturnsBinder()
        {
            // Arrange
            ControllerContext             controllerContext = new ControllerContext();
            ExtensibleModelBindingContext bindingContext    = new ExtensibleModelBindingContext
            {
                ModelMetadata = new EmptyModelMetadataProvider().GetMetadataForType(null, typeof(ModelWithProviderAttribute_Binder)),
                ModelName     = "foo",
                ValueProvider = new SimpleValueProvider
                {
                    { "foo", "fooValue" }
                }
            };

            ModelBinderProviderCollection providers = new ModelBinderProviderCollection();

            providers.RegisterBinderForType(typeof(ModelWithProviderAttribute_Binder), new Mock <IExtensibleModelBinder>().Object, true /* suppressPrefix */);

            // Act
            IExtensibleModelBinder binder = providers.GetBinder(controllerContext, bindingContext);

            // Assert
            Assert.IsType <CustomBinder>(binder);
        }
Esempio n. 33
0
        public void GetBinder_FromAttribute_Binder_SuppressPrefixCheck_ReturnsBinder()
        {
            // Arrange
            ControllerContext             controllerContext = new ControllerContext();
            ExtensibleModelBindingContext bindingContext    = new ExtensibleModelBindingContext()
            {
                ModelMetadata = new EmptyModelMetadataProvider().GetMetadataForType(null, typeof(ModelWithProviderAttribute_Binder_SuppressPrefix)),
                ModelName     = "foo",
                ValueProvider = new SimpleValueProvider()
                {
                    { "bar", "barValue" }
                }
            };

            ModelBinderProviderCollection providers = new ModelBinderProviderCollection();

            providers.RegisterBinderForType(typeof(ModelWithProviderAttribute_Binder_SuppressPrefix), new Mock <IExtensibleModelBinder>().Object, true /* suppressPrefix */);

            // Act
            IExtensibleModelBinder binder = providers.GetBinder(controllerContext, bindingContext);

            // Assert
            Assert.AreEqual(typeof(CustomBinder), binder.GetType(), "Binder should've come from attribute rather than collection.");
        }
        public void BindModel_SuccessfulBind_ComplexTypeFallback_RunsValidationAndReturnsModel() {
            // Arrange
            ControllerContext controllerContext = GetControllerContext();

            bool validationCalled = false;
            List<int> expectedModel = new List<int>() { 1, 2, 3, 4, 5 };

            ModelBindingContext bindingContext = new ModelBindingContext() {
                FallbackToEmptyPrefix = true,
                ModelMetadata = new DataAnnotationsModelMetadataProvider().GetMetadataForType(null, typeof(List<int>)),
                ModelName = "someName",
                ModelState = controllerContext.Controller.ViewData.ModelState,
                PropertyFilter = _ => true,
                ValueProvider = new SimpleValueProvider() {
                    { "someOtherName", "dummyValue" }
                }
            };

            Mock<IExtensibleModelBinder> mockIntBinder = new Mock<IExtensibleModelBinder>();
            mockIntBinder
                .Expect(o => o.BindModel(controllerContext, It.IsAny<ExtensibleModelBindingContext>()))
                .Returns(
                    delegate(ControllerContext cc, ExtensibleModelBindingContext mbc) {
                        Assert.AreSame(bindingContext.ModelMetadata, mbc.ModelMetadata, "ModelMetadata wasn't correct.");
                        Assert.AreEqual("", mbc.ModelName, "ModelName wasn't correct.");
                        Assert.AreSame(bindingContext.ValueProvider, mbc.ValueProvider, "ValueProvider wasn't correct.");

                        mbc.Model = expectedModel;
                        mbc.ValidationNode.Validating += delegate { validationCalled = true; };
                        return true;
                    });

            ModelBinderProviderCollection binderProviders = new ModelBinderProviderCollection();
            binderProviders.RegisterBinderForType(typeof(List<int>), mockIntBinder.Object, false /* suppressPrefixCheck */);
            ExtensibleModelBinderAdapter shimBinder = new ExtensibleModelBinderAdapter(binderProviders);

            // Act
            object retVal = shimBinder.BindModel(controllerContext, bindingContext);

            // Assert
            Assert.AreEqual(expectedModel, retVal);
            Assert.IsTrue(validationCalled);
            Assert.IsTrue(bindingContext.ModelState.IsValid, "No errors should have been added to ModelState.");
        }
        public void BindModel_UnsuccessfulBind_SimpleTypeNoFallback_ReturnsNull() {
            // Arrange
            ControllerContext controllerContext = GetControllerContext();
            Mock<ModelBinderProvider> mockBinderProvider = new Mock<ModelBinderProvider>();
            mockBinderProvider.Expect(o => o.GetBinder(controllerContext, It.IsAny<ExtensibleModelBindingContext>())).Returns((IExtensibleModelBinder)null).AtMostOnce().Verifiable();
            ModelBinderProviderCollection binderProviders = new ModelBinderProviderCollection() {
                mockBinderProvider.Object
            };
            ExtensibleModelBinderAdapter shimBinder = new ExtensibleModelBinderAdapter(binderProviders);

            ModelBindingContext bindingContext = new ModelBindingContext() {
                FallbackToEmptyPrefix = true,
                ModelMetadata = new DataAnnotationsModelMetadataProvider().GetMetadataForType(null, typeof(int)),
                ModelState = controllerContext.Controller.ViewData.ModelState
            };

            // Act
            object retVal = shimBinder.BindModel(controllerContext, bindingContext);

            // Assert
            Assert.IsNull(retVal);
            Assert.IsTrue(bindingContext.ModelState.IsValid, "No errors should have been added to ModelState.");
            mockBinderProvider.Verify();
        }
Esempio n. 36
0
 public static void RegisterBinderProviders(ModelBinderProviderCollection binderProviders)
 {
     binderProviders.Add(new EntityBinder());
 }
        public void BindModel() {
            // Arrange
            ControllerContext controllerContext = new ControllerContext();
            MyModel model = new MyModel();
            ModelMetadata modelMetadata = new EmptyModelMetadataProvider().GetMetadataForType(() => model, typeof(MyModel));
            ComplexModelDto dto = new ComplexModelDto(modelMetadata, modelMetadata.Properties);

            Mock<IExtensibleModelBinder> mockStringBinder = new Mock<IExtensibleModelBinder>();
            mockStringBinder
                .Expect(b => b.BindModel(controllerContext, It.IsAny<ExtensibleModelBindingContext>()))
                .Returns(
                    delegate(ControllerContext cc, ExtensibleModelBindingContext mbc) {
                        Assert.AreEqual(typeof(string), mbc.ModelType);
                        Assert.AreEqual("theModel.StringProperty", mbc.ModelName);
                        mbc.ValidationNode = new ModelValidationNode(mbc.ModelMetadata, "theModel.StringProperty");
                        mbc.Model = "someStringValue";
                        return true;
                    });

            Mock<IExtensibleModelBinder> mockIntBinder = new Mock<IExtensibleModelBinder>();
            mockIntBinder
                .Expect(b => b.BindModel(controllerContext, It.IsAny<ExtensibleModelBindingContext>()))
                .Returns(
                    delegate(ControllerContext cc, ExtensibleModelBindingContext mbc) {
                        Assert.AreEqual(typeof(int), mbc.ModelType);
                        Assert.AreEqual("theModel.IntProperty", mbc.ModelName);
                        mbc.ValidationNode = new ModelValidationNode(mbc.ModelMetadata, "theModel.IntProperty");
                        mbc.Model = 42;
                        return true;
                    });

            Mock<IExtensibleModelBinder> mockDateTimeBinder = new Mock<IExtensibleModelBinder>();
            mockDateTimeBinder
                .Expect(b => b.BindModel(controllerContext, It.IsAny<ExtensibleModelBindingContext>()))
                .Returns(
                    delegate(ControllerContext cc, ExtensibleModelBindingContext mbc) {
                        Assert.AreEqual(typeof(DateTime), mbc.ModelType);
                        Assert.AreEqual("theModel.DateTimeProperty", mbc.ModelName);
                        return false;
                    });

            ModelBinderProviderCollection binders = new ModelBinderProviderCollection();
            binders.RegisterBinderForType(typeof(string), mockStringBinder.Object, true /* suppressPrefixCheck */);
            binders.RegisterBinderForType(typeof(int), mockIntBinder.Object, true /* suppressPrefixCheck */);
            binders.RegisterBinderForType(typeof(DateTime), mockDateTimeBinder.Object, true /* suppressPrefixCheck */);

            ExtensibleModelBindingContext parentBindingContext = new ExtensibleModelBindingContext() {
                ModelMetadata = new EmptyModelMetadataProvider().GetMetadataForType(() => dto, typeof(ComplexModelDto)),
                ModelName = "theModel",
                ModelBinderProviders = binders
            };

            ComplexModelDtoModelBinder binder = new ComplexModelDtoModelBinder();

            // Act
            bool retVal = binder.BindModel(controllerContext, parentBindingContext);

            // Assert
            Assert.IsTrue(retVal);
            Assert.AreEqual(dto, parentBindingContext.Model, "The return model should have been the original DTO.");

            ComplexModelDtoResult stringDtoResult = dto.Results[dto.PropertyMetadata.Where(m => m.ModelType == typeof(string)).First()];
            Assert.AreEqual("someStringValue", stringDtoResult.Model);
            Assert.AreEqual("theModel.StringProperty", stringDtoResult.ValidationNode.ModelStateKey);

            ComplexModelDtoResult intDtoResult = dto.Results[dto.PropertyMetadata.Where(m => m.ModelType == typeof(int)).First()];
            Assert.AreEqual(42, intDtoResult.Model);
            Assert.AreEqual("theModel.IntProperty", intDtoResult.ValidationNode.ModelStateKey);

            ComplexModelDtoResult dateTimeDtoResult = dto.Results[dto.PropertyMetadata.Where(m => m.ModelType == typeof(DateTime)).First()];
            Assert.IsNull(dateTimeDtoResult);
        }
        public void GetBinderDelegatesToResolver()
        {
            // Arrange
            Type modelType = typeof(string);
            IModelBinder expectedBinder = new Mock<IModelBinder>().Object;

            Mock<IModelBinderProvider> locatedProvider = new Mock<IModelBinderProvider>();
            locatedProvider.Setup(p => p.GetBinder(modelType))
                .Returns(expectedBinder);

            Mock<IModelBinderProvider> secondProvider = new Mock<IModelBinderProvider>();
            Resolver<IEnumerable<IModelBinderProvider>> resolver = new Resolver<IEnumerable<IModelBinderProvider>> { Current = new IModelBinderProvider[] { locatedProvider.Object, secondProvider.Object } };

            ModelBinderProviderCollection providers = new ModelBinderProviderCollection(resolver);

            // Act
            IModelBinder returnedBinder = providers.GetBinder(modelType);

            // Assert
            Assert.Same(expectedBinder, returnedBinder);
        }
        public void GetBinderDelegatesToResolver()
        {
            // Arrange
            Type modelType = typeof(string);
            IModelBinder expectedBinder = new Mock<IModelBinder>().Object;

            Mock<IModelBinderProvider> locatedProvider = new Mock<IModelBinderProvider>();
            locatedProvider.Setup(p => p.GetBinder(modelType))
                .Returns(expectedBinder);

            Mock<IModelBinderProvider> secondProvider = new Mock<IModelBinderProvider>();
            Mock<IModelBinderProvider> thirdProvider = new Mock<IModelBinderProvider>();
            IModelBinderProvider[] dependencyProviders = new IModelBinderProvider[] { locatedProvider.Object, secondProvider.Object };
            IModelBinderProvider[] collectionProviders = new IModelBinderProvider[] { thirdProvider.Object };

            Mock<IDependencyResolver> resolver = new Mock<IDependencyResolver>();
            resolver.Setup(r => r.GetServices(typeof(IModelBinderProvider))).Returns(dependencyProviders);

            ModelBinderProviderCollection providers = new ModelBinderProviderCollection(collectionProviders, resolver.Object);

            // Act
            IModelBinder returnedBinder = providers.GetBinder(modelType);

            // Assert
            Assert.Same(expectedBinder, returnedBinder);
        }
 public ExtensibleModelBinderAdapter(ModelBinderProviderCollection providers)
 {
     Providers = providers ?? ModelBinderProviders.Providers;
 }
        public void BindModel_UnsuccessfulBind_BinderFails_ReturnsNull() {
            // Arrange
            ControllerContext controllerContext = GetControllerContext();
            Mock<IExtensibleModelBinder> mockListBinder = new Mock<IExtensibleModelBinder>();
            mockListBinder.Expect(o => o.BindModel(controllerContext, It.IsAny<ExtensibleModelBindingContext>())).Returns(false).Verifiable();

            ModelBinderProviderCollection binderProviders = new ModelBinderProviderCollection();
            binderProviders.RegisterBinderForType(typeof(List<int>), mockListBinder.Object, true /* suppressPrefixCheck */);
            ExtensibleModelBinderAdapter shimBinder = new ExtensibleModelBinderAdapter(binderProviders);

            ModelBindingContext bindingContext = new ModelBindingContext() {
                FallbackToEmptyPrefix = false,
                ModelMetadata = new EmptyModelMetadataProvider().GetMetadataForType(null, typeof(List<int>)),
                ModelState = controllerContext.Controller.ViewData.ModelState
            };

            // Act
            object retVal = shimBinder.BindModel(controllerContext, bindingContext);

            // Assert
            Assert.IsNull(retVal);
            Assert.IsTrue(bindingContext.ModelState.IsValid, "No errors should have been added to ModelState.");
            mockListBinder.Verify();
        }
        public void BindModel_SuccessfulBind_RunsValidationAndReturnsModel()
        {
            // Arrange
            ControllerContext controllerContext = GetControllerContext();
            bool validationCalled = false;

            ModelBindingContext bindingContext = new ModelBindingContext
            {
                FallbackToEmptyPrefix = true,
                ModelMetadata         = new DataAnnotationsModelMetadataProvider().GetMetadataForType(
                    null,
                    typeof(int)
                    ),
                ModelName      = "someName",
                ModelState     = controllerContext.Controller.ViewData.ModelState,
                PropertyFilter = _ => true,
                ValueProvider  = new SimpleValueProvider {
                    { "someName", "dummyValue" }
                }
            };

            Mock <IExtensibleModelBinder> mockIntBinder = new Mock <IExtensibleModelBinder>();

            mockIntBinder
            .Setup(
                o => o.BindModel(controllerContext, It.IsAny <ExtensibleModelBindingContext>())
                )
            .Returns(
                delegate(ControllerContext cc, ExtensibleModelBindingContext mbc)
            {
                Assert.Same(bindingContext.ModelMetadata, mbc.ModelMetadata);
                Assert.Equal("someName", mbc.ModelName);
                Assert.Same(bindingContext.ValueProvider, mbc.ValueProvider);

                mbc.Model = 42;
                mbc.ValidationNode.Validating += delegate
                {
                    validationCalled = true;
                };
                return(true);
            }
                );

            ModelBinderProviderCollection binderProviders = new ModelBinderProviderCollection();

            binderProviders.RegisterBinderForType(
                typeof(int),
                mockIntBinder.Object,
                false /* suppressPrefixCheck */
                );
            ExtensibleModelBinderAdapter shimBinder = new ExtensibleModelBinderAdapter(
                binderProviders
                );

            // Act
            object retVal = shimBinder.BindModel(controllerContext, bindingContext);

            // Assert
            Assert.Equal(42, retVal);
            Assert.True(validationCalled);
            Assert.True(bindingContext.ModelState.IsValid);
        }
 internal static void Initialize(ModelBinderDictionary binders, ModelBinderProviderCollection providers)
 {
     binders.Clear();
     binders.DefaultBinder = new ExtensibleModelBinderAdapter(providers);
 }
        public void BindModel()
        {
            // Arrange
            ControllerContext controllerContext = new ControllerContext();
            MyModel           model             = new MyModel();
            ModelMetadata     modelMetadata     = new EmptyModelMetadataProvider().GetMetadataForType(() => model, typeof(MyModel));
            ComplexModelDto   dto = new ComplexModelDto(modelMetadata, modelMetadata.Properties);

            Mock <IExtensibleModelBinder> mockStringBinder = new Mock <IExtensibleModelBinder>();

            mockStringBinder
            .Setup(b => b.BindModel(controllerContext, It.IsAny <ExtensibleModelBindingContext>()))
            .Returns(
                delegate(ControllerContext cc, ExtensibleModelBindingContext mbc)
            {
                Assert.Equal(typeof(string), mbc.ModelType);
                Assert.Equal("theModel.StringProperty", mbc.ModelName);
                mbc.ValidationNode = new ModelValidationNode(mbc.ModelMetadata, "theModel.StringProperty");
                mbc.Model          = "someStringValue";
                return(true);
            });

            Mock <IExtensibleModelBinder> mockIntBinder = new Mock <IExtensibleModelBinder>();

            mockIntBinder
            .Setup(b => b.BindModel(controllerContext, It.IsAny <ExtensibleModelBindingContext>()))
            .Returns(
                delegate(ControllerContext cc, ExtensibleModelBindingContext mbc)
            {
                Assert.Equal(typeof(int), mbc.ModelType);
                Assert.Equal("theModel.IntProperty", mbc.ModelName);
                mbc.ValidationNode = new ModelValidationNode(mbc.ModelMetadata, "theModel.IntProperty");
                mbc.Model          = 42;
                return(true);
            });

            Mock <IExtensibleModelBinder> mockDateTimeBinder = new Mock <IExtensibleModelBinder>();

            mockDateTimeBinder
            .Setup(b => b.BindModel(controllerContext, It.IsAny <ExtensibleModelBindingContext>()))
            .Returns(
                delegate(ControllerContext cc, ExtensibleModelBindingContext mbc)
            {
                Assert.Equal(typeof(DateTime), mbc.ModelType);
                Assert.Equal("theModel.DateTimeProperty", mbc.ModelName);
                return(false);
            });

            ModelBinderProviderCollection binders = new ModelBinderProviderCollection();

            binders.RegisterBinderForType(typeof(string), mockStringBinder.Object, true /* suppressPrefixCheck */);
            binders.RegisterBinderForType(typeof(int), mockIntBinder.Object, true /* suppressPrefixCheck */);
            binders.RegisterBinderForType(typeof(DateTime), mockDateTimeBinder.Object, true /* suppressPrefixCheck */);

            ExtensibleModelBindingContext parentBindingContext = new ExtensibleModelBindingContext
            {
                ModelMetadata        = new EmptyModelMetadataProvider().GetMetadataForType(() => dto, typeof(ComplexModelDto)),
                ModelName            = "theModel",
                ModelBinderProviders = binders
            };

            ComplexModelDtoModelBinder binder = new ComplexModelDtoModelBinder();

            // Act
            bool retVal = binder.BindModel(controllerContext, parentBindingContext);

            // Assert
            Assert.True(retVal);
            Assert.Equal(dto, parentBindingContext.Model);

            ComplexModelDtoResult stringDtoResult = dto.Results[dto.PropertyMetadata.Where(m => m.ModelType == typeof(string)).First()];

            Assert.Equal("someStringValue", stringDtoResult.Model);
            Assert.Equal("theModel.StringProperty", stringDtoResult.ValidationNode.ModelStateKey);

            ComplexModelDtoResult intDtoResult = dto.Results[dto.PropertyMetadata.Where(m => m.ModelType == typeof(int)).First()];

            Assert.Equal(42, intDtoResult.Model);
            Assert.Equal("theModel.IntProperty", intDtoResult.ValidationNode.ModelStateKey);

            ComplexModelDtoResult dateTimeDtoResult = dto.Results[dto.PropertyMetadata.Where(m => m.ModelType == typeof(DateTime)).First()];

            Assert.Null(dateTimeDtoResult);
        }
Esempio n. 45
0
 public static void Configure(ModelBinderProviderCollection binders)
 {
     binders.Add(new QuestionModelBinderProvider());
     binders.Add(new CustomCancellationTokenModelBinder());
 }
 internal static void RegisterModelBinders(ModelBinderProviderCollection modelBinderProviderCollection)
 {
     modelBinderProviderCollection.Add(new EntityModelBinderProvider());
 }