Пример #1
0
    public void GetModelBinderFactory_ReturnsNullIfPageModelHasNoBoundProperties()
    {
        // Arrange
        var actionDescriptor = new CompiledPageActionDescriptor
        {
            PageTypeInfo  = typeof(PageWithNoBoundProperties).GetTypeInfo(),
            ModelTypeInfo = typeof(PageModelWithNoBoundProperties).GetTypeInfo(),
        };
        var modelMetadataProvider = TestModelMetadataProvider.CreateDefaultProvider();
        var modelBinderFactory    = TestModelBinderFactory.CreateDefault();

        var binder = new ParameterBinder(
            modelMetadataProvider,
            modelBinderFactory,
            Mock.Of <IObjectModelValidator>(),
            _optionsAccessor,
            NullLoggerFactory.Instance);

        // Act
        var factory = PageBinderFactory.CreatePropertyBinder(binder, modelMetadataProvider, modelBinderFactory, actionDescriptor);

        // Assert
        Assert.Same(PageBinderFactory.NullPropertyBinder, factory);
    }
        private static ControllerActionInvokerCache CreateControllerActionInvokerCache(
            ControllerContext controllerContext,
            IFilterProvider[] filterProviders)
        {
            var descriptorProvider = new CustomActionDescriptorCollectionProvider(
                new[] { controllerContext.ActionDescriptor });
            var modelMetadataProvider = new EmptyModelMetadataProvider();
            var modelBinderFactory    = TestModelBinderFactory.CreateDefault();
            var mvcOptions            = Options.Create(new MvcOptions());

            return(new ControllerActionInvokerCache(
                       descriptorProvider,
                       new ParameterBinder(
                           modelMetadataProvider,
                           modelBinderFactory,
                           Mock.Of <IObjectModelValidator>(),
                           mvcOptions,
                           NullLoggerFactory.Instance),
                       modelBinderFactory,
                       modelMetadataProvider,
                       filterProviders,
                       Mock.Of <IControllerFactoryProvider>(),
                       mvcOptions));
        }
Пример #3
0
        public async Task CreateHandlerBinder_SkipBindingParametersThatDisallowBinding()
        {
            // Arrange
            var type             = typeof(PageModelWithExecutors);
            var actionDescriptor = GetActionDescriptorWithHandlerMethod(type, nameof(PageModelWithExecutors.OnGetWithBindNever));

            // Act
            var parameterBinder = new TestParameterBinder(new Dictionary <string, object>()
            {
                { "id", "value" },
            });

            var modelMetadataProvider = TestModelMetadataProvider.CreateDefaultProvider();
            var modelBinderFactory    = TestModelBinderFactory.CreateDefault();

            var factory = PageBinderFactory.CreateHandlerBinder(
                parameterBinder,
                modelMetadataProvider,
                modelBinderFactory,
                actionDescriptor,
                actionDescriptor.HandlerMethods[0]);

            var page = new PageWithProperty
            {
                PageContext = GetPageContext()
            };

            var model     = new PageModelWithExecutors();
            var arguments = new Dictionary <string, object>();

            // Act
            await factory(page.PageContext, arguments);

            // Assert
            Assert.Empty(arguments);
        }
Пример #4
0
        public async Task ModelBinderFactory_BindsPropertyWithoutSupportsGet_WhenRequestIsNotGet()
        {
            // Arrange
            var type = typeof(PageModelWithSupportsGetProperty).GetTypeInfo();

            var actionDescriptor = new CompiledPageActionDescriptor
            {
                BoundProperties = new[]
                {
                    new PageBoundPropertyDescriptor()
                    {
                        Name          = nameof(PageModelWithSupportsGetProperty.SupportsGet),
                        ParameterType = typeof(string),
                        Property      = type.GetProperty(nameof(PageModelWithSupportsGetProperty.SupportsGet)),
                        BindingInfo   = new BindingInfo()
                        {
                            RequestPredicate = ((IRequestPredicateProvider) new BindPropertyAttribute()
                            {
                                SupportsGet = true
                            }).RequestPredicate,
                        }
                    },
                    new PageBoundPropertyDescriptor()
                    {
                        Name          = nameof(PageModelWithSupportsGetProperty.Default),
                        ParameterType = typeof(string),
                        Property      = type.GetProperty(nameof(PageModelWithSupportsGetProperty.Default)),
                    },
                },

                HandlerTypeInfo = type,
                PageTypeInfo    = typeof(PageWithProperty).GetTypeInfo(),
                ModelTypeInfo   = type,
            };

            var binder = new TestParameterBinder(new Dictionary <string, object>()
            {
                { "SupportsGet", "value" },
                { "Default", "value" },
            });

            var modelMetadataProvider = TestModelMetadataProvider.CreateDefaultProvider();
            var modelBinderFactory    = TestModelBinderFactory.CreateDefault();

            var factory = PageBinderFactory.CreatePropertyBinder(binder, modelMetadataProvider, modelBinderFactory, actionDescriptor);

            var page = new PageWithProperty
            {
                PageContext = GetPageContext()
            };

            page.HttpContext.Request.Method = "Post";

            var model = new PageModelWithSupportsGetProperty();

            // Act
            await factory(page.PageContext, model);

            // Assert
            Assert.Equal("value", model.SupportsGet);
            Assert.Equal("value", model.Default);
        }
Пример #5
0
        public async Task ModelBinderFactory_BindsPropertiesOnPageModel()
        {
            // Arrange
            var type = typeof(PageModelWithProperty).GetTypeInfo();

            var actionDescriptor = new CompiledPageActionDescriptor
            {
                BoundProperties = new[]
                {
                    new PageBoundPropertyDescriptor()
                    {
                        Name          = nameof(PageModelWithProperty.Id),
                        ParameterType = typeof(int),
                        Property      = type.GetProperty(nameof(PageModelWithProperty.Id)),
                    },
                    new PageBoundPropertyDescriptor()
                    {
                        Name          = nameof(PageModelWithProperty.RouteDifferentValue),
                        ParameterType = typeof(string),
                        Property      = type.GetProperty(nameof(PageModelWithProperty.RouteDifferentValue)),
                    },
                    new PageBoundPropertyDescriptor()
                    {
                        Name          = nameof(PageModelWithProperty.PropertyWithNoValue),
                        ParameterType = typeof(string),
                        Property      = type.GetProperty(nameof(PageModelWithProperty.PropertyWithNoValue)),
                    }
                },

                HandlerTypeInfo = typeof(PageModelWithProperty).GetTypeInfo(),
                PageTypeInfo    = typeof(PageWithProperty).GetTypeInfo(),
                ModelTypeInfo   = typeof(PageModelWithProperty).GetTypeInfo(),
            };

            var binder = new TestParameterBinder(new Dictionary <string, object>
            {
                { nameof(PageModelWithProperty.Id), 10 },
                { nameof(PageModelWithProperty.RouteDifferentValue), "route-value" }
            });

            var modelMetadataProvider = TestModelMetadataProvider.CreateDefaultProvider();
            var modelBinderFactory    = TestModelBinderFactory.CreateDefault();

            var factory = PageBinderFactory.CreatePropertyBinder(binder, modelMetadataProvider, modelBinderFactory, actionDescriptor);

            var page = new PageWithProperty
            {
                PageContext = GetPageContext()
            };

            var model = new PageModelWithProperty();

            // Act
            await factory(page.PageContext, model);

            // Assert
            // Verify that the page properties were not bound.
            Assert.Equal(default(int), page.Id);
            Assert.Null(page.RouteDifferentValue);

            Assert.Equal(10, model.Id);
            Assert.Equal("route-value", model.RouteDifferentValue);
            Assert.Null(model.PropertyWithNoValue);
        }
Пример #6
0
        public async Task MultipleActionParameter_ValidModelState(List <ParameterDescriptor> parameters)
        {
            // Since validation attribute is only present on the FromBody model's property(TransferInfo's AccountId),
            // validation should not trigger for the parameter which is bound from Uri.

            // Arrange
            var actionDescriptor = new ControllerActionDescriptor()
            {
                BoundProperties = new List <ParameterDescriptor>(),
                Parameters      = parameters
            };
            var modelMetadataProvider = new EmptyModelMetadataProvider();
            var modelBinderProvider   = new BodyModelBinderProvider(new[] { Mock.Of <IInputFormatter>() }, Mock.Of <IHttpRequestStreamReaderFactory>());
            var factory         = TestModelBinderFactory.CreateDefault(modelBinderProvider);
            var parameterBinder = new Mock <ParameterBinder>(
                new EmptyModelMetadataProvider(),
                factory,
                CreateMockValidator());

            parameterBinder.Setup(p => p.BindModelAsync(
                                      It.IsAny <ActionContext>(),
                                      It.IsAny <IModelBinder>(),
                                      It.IsAny <IValueProvider>(),
                                      It.IsAny <ParameterDescriptor>(),
                                      It.IsAny <ModelMetadata>(),
                                      null))
            .Returns((ActionContext context, IModelBinder modelBinder, IValueProvider valueProvider, ParameterDescriptor descriptor, ModelMetadata metadata, object v) =>
            {
                ModelBindingResult result;
                if (descriptor.Name == "accountId")
                {
                    result = ModelBindingResult.Success(10);
                }
                else if (descriptor.Name == "transferInfo")
                {
                    result = ModelBindingResult.Success(new TransferInfo
                    {
                        AccountId = 40,
                        Amount    = 250.0
                    });
                }
                else
                {
                    result = ModelBindingResult.Failed();
                }

                return(Task.FromResult(result));
            });

            var controllerContext = new ControllerContext
            {
                ActionDescriptor = actionDescriptor,
            };

            var arguments  = new Dictionary <string, object>(StringComparer.Ordinal);
            var modelState = controllerContext.ModelState;

            // Act
            var binderDelegate = ControllerBinderDelegateProvider.CreateBinderDelegate(
                parameterBinder.Object,
                factory,
                TestModelMetadataProvider.CreateDefaultProvider(),
                actionDescriptor);

            await binderDelegate(controllerContext, new TestController(), arguments);

            // Assert
            Assert.True(modelState.IsValid);
            Assert.True(arguments.TryGetValue("accountId", out var value));
            var accountId = Assert.IsType <int>(value);

            Assert.Equal(10, accountId);
            Assert.True(arguments.TryGetValue("transferInfo", out value));
            var transferInfo = Assert.IsType <TransferInfo>(value);

            Assert.NotNull(transferInfo);
            Assert.Equal(40, transferInfo.AccountId);
            Assert.Equal(250.0, transferInfo.Amount);
        }