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); }); }
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); }
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); }
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); }); }
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); }