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 factory = PagePropertyBinderFactory.CreateBinder(binder, modelMetadataProvider, 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);
        }
    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, page.Id);
        public async Task CreatePropertyBinder_ValidatesTopLevelProperties()
        {
            // Arrange
            var type = typeof(PageModelWithValidation).GetTypeInfo();

            var actionDescriptor = new CompiledPageActionDescriptor
            {
                BoundProperties = new[]
                {
                    new PageBoundPropertyDescriptor()
                    {
                        Name          = nameof(PageModelWithValidation.Validated),
                        ParameterType = typeof(string),
                        Property      = type.GetProperty(nameof(PageModelWithValidation.Validated)),
                    },
                },

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

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

            var binder = new ParameterBinder(
                modelMetadataProvider,
                modelBinderFactory,
                new DefaultObjectValidator(
                    modelMetadataProvider,
                    new[] { TestModelValidatorProvider.CreateDefaultProvider() }),
                NullLoggerFactory.Instance);

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

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

            var model = new PageModelWithValidation();

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

            // Assert
            var modelState = page.PageContext.ModelState;

            Assert.False(modelState.IsValid);
            Assert.Collection(
                modelState,
                kvp =>
            {
                Assert.Equal(nameof(PageModelWithValidation.Validated), kvp.Key);
            });
        }
        public async Task CreateHandlerBinder_ValidatesTopLevelParameters()
        {
            // Arrange
            var type             = typeof(PageModelWithExecutors);
            var actionDescriptor = GetActionDescriptorWithHandlerMethod(type, nameof(PageModelWithExecutors.OnPostWithValidation));

            // Act

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

            var parameterBinder = new ParameterBinder(
                modelMetadataProvider,
                modelBinderFactory,
                new DefaultObjectValidator(
                    modelMetadataProvider,
                    new[] { TestModelValidatorProvider.CreateDefaultProvider() }),
                NullLoggerFactory.Instance);

            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
            var modelState = page.PageContext.ModelState;

            Assert.False(modelState.IsValid);
            Assert.Collection(
                page.PageContext.ModelState,
                kvp =>
            {
                Assert.Equal("name", kvp.Key);
            });
        }
Exemple #5
0
        public async Task CreatePropertyBinder_SkipsBindingPropertiesWithBindNever()
        {
            // Arrange
            var type = typeof(PageModelWithBindNeverProperty).GetTypeInfo();

            var actionDescriptor = new CompiledPageActionDescriptor
            {
                BoundProperties = new[]
                {
                    new PageBoundPropertyDescriptor()
                    {
                        Name          = nameof(PageModelWithBindNeverProperty.BindNeverProperty),
                        ParameterType = typeof(string),
                        Property      = type.GetProperty(nameof(PageModelWithBindNeverProperty.BindNeverProperty)),
                    },
                },

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

            var binder = new TestParameterBinder(new Dictionary <string, object>
            {
                { nameof(PageModelWithBindNeverProperty.BindNeverProperty), "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 PageModelWithBindNeverProperty();

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

            // Assert
            Assert.Null(model.BindNeverProperty);
        }
Exemple #6
0
        public async Task ModelBinderFactory_PreservesExistingValueIfModelBindingFailed()
        {
            // Arrange
            var type = typeof(PageModelWithDefaultValue).GetTypeInfo();

            var actionDescriptor = new CompiledPageActionDescriptor
            {
                BoundProperties = new[]
                {
                    new PageBoundPropertyDescriptor()
                    {
                        Name          = nameof(PageModelWithDefaultValue.PropertyWithDefaultValue),
                        ParameterType = typeof(string),
                        Property      = type.GetProperty(nameof(PageModelWithDefaultValue.PropertyWithDefaultValue)),
                    },
                },

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

            var binder = new TestParameterBinder(new Dictionary <string, object>());

            var modelMetadataProvider = TestModelMetadataProvider.CreateDefaultProvider();
            var factory = PagePropertyBinderFactory.CreateBinder(binder, modelMetadataProvider, actionDescriptor);

            var page = new PageWithProperty
            {
                PageContext = new PageContext()
                {
                    HttpContext = new DefaultHttpContext(),
                }
            };

            var model        = new PageModelWithDefaultValue();
            var defaultValue = model.PropertyWithDefaultValue;

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

            // Assert
            Assert.Equal(defaultValue, model.PropertyWithDefaultValue);
        }
Exemple #7
0
        public async Task CreateHandlerBinder_BindsHandlerParameters()
        {
            // Arrange
            var type             = typeof(PageModelWithExecutors);
            var actionDescriptor = GetActionDescriptorWithHandlerMethod(type, nameof(PageModelWithExecutors.OnGet));

            // 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.Collection(
                arguments,
                kvp =>
            {
                Assert.Equal("id", kvp.Key);
                Assert.Equal("value", kvp.Value);
            });
        }
Exemple #8
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);
        }