public void OnProvidersExecuting_DiscoversHandlersFromModel()
        {
            // Arrange
            var provider   = new DefaultPageApplicationModelProvider();
            var typeInfo   = typeof(PageWithModel).GetTypeInfo();
            var modelType  = typeof(TestPageModel);
            var descriptor = new PageActionDescriptor();
            var context    = new PageApplicationModelProviderContext(descriptor, typeInfo);

            // Act
            provider.OnProvidersExecuting(context);

            // Assert
            Assert.NotNull(context.PageApplicationModel);
            Assert.Collection(
                context.PageApplicationModel.HandlerMethods.OrderBy(p => p.Name),
                handler =>
            {
                var name = nameof(TestPageModel.OnGetUser);
                Assert.Equal(modelType.GetMethod(name), handler.MethodInfo);
                Assert.Equal(name, handler.Name);
                Assert.Equal("Get", handler.HttpMethod);
                Assert.Equal("User", handler.HandlerName);
            });
        }
        public void PopulateHandlerProperties_SupportsGet_OnProperty()
        {
            // Arrange
            var provider  = new DefaultPageApplicationModelProvider();
            var typeInfo  = typeof(ModelSupportsGetOnProperty).GetTypeInfo();
            var pageModel = new PageApplicationModel(new PageActionDescriptor(), typeInfo, new object[0]);

            // Act
            provider.PopulateHandlerProperties(pageModel);

            // Assert
            var properties = pageModel.HandlerProperties;

            Assert.Collection(
                properties.OrderBy(p => p.PropertyName),
                p =>
            {
                Assert.Equal(typeInfo.GetProperty(nameof(ModelSupportsGetOnProperty.Property)), p.PropertyInfo);
                Assert.NotNull(p.BindingInfo.RequestPredicate);
                Assert.True(p.BindingInfo.RequestPredicate(new ActionContext
                {
                    HttpContext = new DefaultHttpContext
                    {
                        Request =
                        {
                            Method = "GET",
                        }
                    }
                }));
            });
        }
        public void OnProvidersExecuting_DiscoversProperties_FromAllSubTypesThatDeclaresBindProperty()
        {
            // Arrange
            var provider   = new DefaultPageApplicationModelProvider();
            var typeInfo   = typeof(BindPropertyAttributeOnBaseModelPage).GetTypeInfo();
            var descriptor = new PageActionDescriptor();
            var context    = new PageApplicationModelProviderContext(descriptor, typeInfo);

            // Act
            provider.OnProvidersExecuting(context);

            // Assert
            Assert.NotNull(context.PageApplicationModel);
            Assert.Collection(
                context.PageApplicationModel.HandlerProperties.OrderBy(p => p.PropertyName).Where(p => p.BindingInfo != null),
                property =>
            {
                var name = nameof(ModelLevel3.Property2);
                Assert.Equal(typeof(ModelLevel3).GetProperty(name), property.PropertyInfo);
                Assert.Equal(name, property.PropertyName);
                Assert.NotNull(property.BindingInfo);
            },
                property =>
            {
                var name = nameof(ModelLevel3.Property3);
                Assert.Equal(typeof(ModelLevel3).GetProperty(name), property.PropertyInfo);
                Assert.Equal(name, property.PropertyName);
                Assert.NotNull(property.BindingInfo);
            });
        }
        [Fact] // If the model does not have the PageModelAttribute, we look at the page instead.
        public void OnProvidersExecuting_FindsHandlerMethodOnPage_WhenModelIsNotAnnotatedWithPageModelAttribute()
        {
            // Arrange
            var provider = new DefaultPageApplicationModelProvider();
            var typeInfo = typeof(PageWithHandler).GetTypeInfo();
            var context  = new PageApplicationModelProviderContext(new PageActionDescriptor(), typeInfo);

            // Act
            provider.OnProvidersExecuting(context);

            // Assert
            var pageModel        = context.PageApplicationModel;
            var propertiesOnPage = pageModel.HandlerProperties
                                   .Where(p => p.PropertyInfo.DeclaringType.GetTypeInfo() == typeInfo);

            Assert.Collection(
                propertiesOnPage.OrderBy(p => p.PropertyName),
                p => Assert.Equal(typeInfo.GetProperty(nameof(PageWithHandler.BindMe)), p.PropertyInfo),
                p => Assert.Equal(typeInfo.GetProperty(nameof(PageWithHandler.Model)), p.PropertyInfo));

            Assert.Collection(
                pageModel.HandlerMethods,
                p => Assert.Equal(typeInfo.GetMethod(nameof(PageWithHandler.OnGet)), p.MethodInfo));

            Assert.Same(typeof(PageWithHandler).GetTypeInfo(), pageModel.HandlerType);
            Assert.Same(typeof(PocoModel).GetTypeInfo(), pageModel.ModelType);
            Assert.Same(typeof(PageWithHandler).GetTypeInfo(), pageModel.PageType);
        }
        [Fact] // If the model has handler methods, we prefer those.
        public void CreateDescriptor_FindsHandlerMethod_OnModel()
        {
            // Arrange
            var provider  = new DefaultPageApplicationModelProvider();
            var typeInfo  = typeof(PageWithHandlerThatGetsIgnored).GetTypeInfo();
            var modelType = typeof(ModelWithHandler);
            var context   = new PageApplicationModelProviderContext(new PageActionDescriptor(), typeInfo);

            // Act
            provider.OnProvidersExecuting(context);

            // Assert
            var pageModel = context.PageApplicationModel;

            Assert.Contains(
                pageModel.HandlerProperties,
                p => p.PropertyInfo == modelType.GetProperty(nameof(ModelWithHandler.BindMe)));

            Assert.Collection(
                pageModel.HandlerMethods,
                p => Assert.Equal(modelType.GetMethod(nameof(ModelWithHandler.OnGet)), p.MethodInfo));

            Assert.Same(typeof(ModelWithHandler).GetTypeInfo(), pageModel.HandlerType);
            Assert.Same(typeof(ModelWithHandler).GetTypeInfo(), pageModel.ModelType);
            Assert.Same(typeof(PageWithHandlerThatGetsIgnored).GetTypeInfo(), pageModel.PageType);
        }
        public void PopulateHandlerMethods_DiscoversHandlersFromBaseType()
        {
            // Arrange
            var provider  = new DefaultPageApplicationModelProvider();
            var typeInfo  = typeof(InheritsMethods).GetTypeInfo();
            var baseType  = typeof(TestSetPageModel);
            var pageModel = new PageApplicationModel(new PageActionDescriptor(), typeInfo, new object[0]);

            // Act
            provider.PopulateHandlerMethods(pageModel);

            // Assert
            var handlerMethods = pageModel.HandlerMethods;

            Assert.Collection(
                handlerMethods.OrderBy(h => h.MethodInfo.DeclaringType.Name).ThenBy(h => h.MethodInfo.Name),
                handler =>
            {
                Assert.Equal(nameof(InheritsMethods.OnGet), handler.MethodInfo.Name);
                Assert.Equal(typeInfo, handler.MethodInfo.DeclaringType.GetTypeInfo());
            },
                handler =>
            {
                Assert.Equal(nameof(TestSetPageModel.OnGet), handler.MethodInfo.Name);
                Assert.Equal(baseType, handler.MethodInfo.DeclaringType);
            },
                handler =>
            {
                Assert.Equal(nameof(TestSetPageModel.OnPost), handler.MethodInfo.Name);
                Assert.Equal(baseType, handler.MethodInfo.DeclaringType);
            });
        }
        public void CreateHandlerMethods_AddsParameterDescriptors()
        {
            // Arrange
            var provider  = new DefaultPageApplicationModelProvider();
            var typeInfo  = typeof(PageWithHandlerParameters).GetTypeInfo();
            var expected  = typeInfo.GetMethod(nameof(PageWithHandlerParameters.OnPost));
            var pageModel = new PageApplicationModel(new PageActionDescriptor(), typeInfo, new object[0]);

            // Act
            provider.PopulateHandlerMethods(pageModel);

            // Assert
            var handlerMethods = pageModel.HandlerMethods;
            var handler        = Assert.Single(handlerMethods);

            Assert.Collection(
                handler.Parameters,
                p =>
            {
                Assert.NotNull(p.ParameterInfo);
                Assert.Equal(typeof(string), p.ParameterInfo.ParameterType);
                Assert.Equal("name", p.ParameterName);
            },
                p =>
            {
                Assert.NotNull(p.ParameterInfo);
                Assert.Equal(typeof(int), p.ParameterInfo.ParameterType);
                Assert.Equal("id", p.ParameterName);
                Assert.Equal("personId", p.BindingInfo.BinderModelName);
            });
        }
        public void OnProvidersExecuting_DiscoversBindingInfoFromHandler()
        {
            // Arrange
            var provider   = new DefaultPageApplicationModelProvider();
            var typeInfo   = typeof(PageWithBindPropertyModel).GetTypeInfo();
            var modelType  = typeof(ModelWithBindProperty);
            var descriptor = new PageActionDescriptor();
            var context    = new PageApplicationModelProviderContext(descriptor, typeInfo);

            // Act
            provider.OnProvidersExecuting(context);

            // Assert
            Assert.NotNull(context.PageApplicationModel);
            Assert.Collection(
                context.PageApplicationModel.HandlerProperties.OrderBy(p => p.PropertyName),
                property =>
            {
                Assert.Equal(nameof(ModelWithBindProperty.Property1), property.PropertyName);
                Assert.NotNull(property.BindingInfo);
            },
                property =>
            {
                Assert.Equal(nameof(ModelWithBindProperty.Property2), property.PropertyName);
                Assert.NotNull(property.BindingInfo);
                Assert.Equal(BindingSource.Path, property.BindingInfo.BindingSource);
            });
        }
Example #9
0
        private static PageApplicationModelProviderContext GetApplicationProviderContext(TypeInfo typeInfo)
        {
            var defaultProvider = new DefaultPageApplicationModelProvider();
            var context         = new PageApplicationModelProviderContext(new PageActionDescriptor(), typeInfo);

            defaultProvider.OnProvidersExecuting(context);
            return(context);
        }
        public void TryParseHandler_ParsesHandlerNames_InvalidData(string methodName)
        {
            // Act
            var result = DefaultPageApplicationModelProvider.TryParseHandlerMethod(methodName, out var httpMethod, out var handler);

            // Assert
            Assert.False(result);
            Assert.Null(httpMethod);
            Assert.Null(handler);
        }
Example #11
0
        private static PageApplicationModelProviderContext GetApplicationProviderContext(TypeInfo typeInfo)
        {
            var defaultProvider = new DefaultPageApplicationModelProvider(
                TestModelMetadataProvider.CreateDefaultProvider(),
                Options.Create(new MvcOptions()));
            var context = new PageApplicationModelProviderContext(new PageActionDescriptor(), typeInfo);

            defaultProvider.OnProvidersExecuting(context);
            return(context);
        }
        public void TryParseHandler_ParsesHandlerNames_ValidData(string methodName, string expectedHttpMethod, string expectedHandler)
        {
            // Arrange

            // Act
            var result = DefaultPageApplicationModelProvider.TryParseHandlerMethod(methodName, out var httpMethod, out var handler);

            // Assert
            Assert.True(result);
            Assert.Equal(expectedHttpMethod, httpMethod);
            Assert.Equal(expectedHandler, handler);
        }
Example #13
0
        private static PageApplicationModelProviderContext GetApplicationProviderContext(TypeInfo typeInfo)
        {
            var defaultProvider = new DefaultPageApplicationModelProvider(
                TestModelMetadataProvider.CreateDefaultProvider(),
                Options.Create(new MvcOptions {
                AllowValidatingTopLevelNodes = true
            }),
                Options.Create(new RazorPagesOptions {
                AllowDefaultHandlingForOptionsRequests = true
            }));
            var context = new PageApplicationModelProviderContext(new PageActionDescriptor(), typeInfo);

            defaultProvider.OnProvidersExecuting(context);
            return(context);
        }
        public void PopulateFilters_AddsIFilterMetadataAttributesToModel()
        {
            // Arrange
            var provider  = new DefaultPageApplicationModelProvider();
            var typeInfo  = typeof(FilterModel).GetTypeInfo();
            var pageModel = new PageApplicationModel(new PageActionDescriptor(), typeInfo, typeInfo.GetCustomAttributes(inherit: true));

            // Act
            provider.PopulateFilters(pageModel);

            // Assert
            Assert.Collection(
                pageModel.Filters,
                filter => Assert.IsType <TypeFilterAttribute>(filter));
        }
        public void PopulateHandlerMethods_IgnoreGenericTypeParameters()
        {
            // Arrange
            var provider  = new DefaultPageApplicationModelProvider();
            var typeInfo  = typeof(GenericClassModel).GetTypeInfo();
            var pageModel = new PageApplicationModel(new PageActionDescriptor(), typeInfo, new object[0]);

            // Act
            provider.PopulateHandlerMethods(pageModel);

            // Assert
            var handlerMethods = pageModel.HandlerMethods;

            Assert.Empty(handlerMethods);
        }
        public void PopulateFilters_AddsPageHandlerPageFilter_IfPageImplementsIPageFilter()
        {
            // Arrange
            var provider  = new DefaultPageApplicationModelProvider();
            var typeInfo  = typeof(ModelImplementingPageFilter).GetTypeInfo();
            var pageModel = new PageApplicationModel(new PageActionDescriptor(), typeInfo, typeInfo.GetCustomAttributes(inherit: true));

            // Act
            provider.PopulateFilters(pageModel);

            // Assert
            Assert.Collection(
                pageModel.Filters,
                filter => Assert.IsType <PageHandlerPageFilter>(filter));
        }
        public void OnProvidersExecuting_ThrowsIfModelPropertyIsNotPublic()
        {
            // Arrange
            var provider   = new DefaultPageApplicationModelProvider();
            var typeInfo   = typeof(PageWithNonVisibleModel).GetTypeInfo();
            var descriptor = new PageActionDescriptor();
            var context    = new PageApplicationModelProviderContext(descriptor, typeInfo);

            // Act & Assert
            var ex = Assert.Throws <InvalidOperationException>(() => provider.OnProvidersExecuting(context));

            // Assert
            Assert.Equal(
                $"The type '{typeInfo.FullName}' is not a valid page. A page must define a public, non-static 'Model' property.",
                ex.Message);
        }
        public void PopulateHandlerMethods_IgnoresNonPublicMethods()
        {
            // Arrange
            var provider  = new DefaultPageApplicationModelProvider();
            var typeInfo  = typeof(ProtectedModel).GetTypeInfo();
            var baseType  = typeof(TestSetPageModel);
            var pageModel = new PageApplicationModel(new PageActionDescriptor(), typeInfo, new object[0]);

            // Act
            provider.PopulateHandlerMethods(pageModel);

            // Assert
            var handlerMethods = pageModel.HandlerMethods;

            Assert.Empty(handlerMethods);
        }
        public void OnProvidersExecuting_ThrowsIfPageDoesNotDeriveFromValidBaseType()
        {
            // Arrange
            var provider   = new DefaultPageApplicationModelProvider();
            var typeInfo   = typeof(InvalidPageWithWrongBaseClass).GetTypeInfo();
            var descriptor = new PageActionDescriptor();
            var context    = new PageApplicationModelProviderContext(descriptor, typeInfo);

            // Act & Assert
            var ex = Assert.Throws <InvalidOperationException>(() => provider.OnProvidersExecuting(context));

            // Assert
            Assert.Equal(
                $"The type '{typeInfo.FullName}' is not a valid page. A page must inherit from '{typeof(PageBase).FullName}'.",
                ex.Message);
        }
        public void PopulateHandlerMethods_IgnoresMethodWithNonHandlerAttribute()
        {
            // Arrange
            var provider  = new DefaultPageApplicationModelProvider();
            var typeInfo  = typeof(PageWithNonHandlerMethod).GetTypeInfo();
            var expected  = typeInfo.GetMethod(nameof(PageWithNonHandlerMethod.OnGet), BindingFlags.Public | BindingFlags.Instance);
            var pageModel = new PageApplicationModel(new PageActionDescriptor(), typeInfo, new object[0]);

            // Act
            provider.PopulateHandlerMethods(pageModel);

            // Assert
            var handlerMethods = pageModel.HandlerMethods;

            Assert.Collection(
                handlerMethods,
                handler => Assert.Same(expected, handler.MethodInfo));
        }
        public void OnProvidersExecuting_EmptyPage()
        {
            // Arrange
            var provider = new DefaultPageApplicationModelProvider();
            var typeInfo = typeof(EmptyPage).GetTypeInfo();
            var context  = new PageApplicationModelProviderContext(new PageActionDescriptor(), typeInfo);

            // Act
            provider.OnProvidersExecuting(context);

            // Assert
            var pageModel = context.PageApplicationModel;

            Assert.Empty(pageModel.HandlerProperties.Where(p => p.BindingInfo != null));
            Assert.Empty(pageModel.HandlerMethods);
            Assert.Same(typeof(EmptyPage).GetTypeInfo(), pageModel.HandlerType);
            Assert.Same(typeof(EmptyPage).GetTypeInfo(), pageModel.ModelType);
            Assert.Same(typeof(EmptyPage).GetTypeInfo(), pageModel.PageType);
        }
        public void PopulateHandlerProperties_UsesPropertyHelpers_ToFindProperties()
        {
            // Arrange
            var provider  = new DefaultPageApplicationModelProvider();
            var typeInfo  = typeof(HidesAProperty).GetTypeInfo();
            var pageModel = new PageApplicationModel(new PageActionDescriptor(), typeInfo, new object[0]);

            // Act
            provider.PopulateHandlerProperties(pageModel);

            // Assert
            var properties = pageModel.HandlerProperties;

            Assert.Collection(
                properties,
                p =>
            {
                Assert.Equal(typeof(HidesAProperty).GetTypeInfo(), p.PropertyInfo.DeclaringType.GetTypeInfo());
            });
        }
        public void OnProvidersExecuting_DiscoversHandlersFromPage()
        {
            // Arrange
            var provider   = new DefaultPageApplicationModelProvider();
            var typeInfo   = typeof(PageWithModelWithoutHandlers).GetTypeInfo();
            var descriptor = new PageActionDescriptor();
            var context    = new PageApplicationModelProviderContext(descriptor, typeInfo);

            // Act
            provider.OnProvidersExecuting(context);

            // Assert
            Assert.NotNull(context.PageApplicationModel);
            Assert.Collection(
                context.PageApplicationModel.HandlerMethods.OrderBy(p => p.Name),
                handler =>
            {
                var name = nameof(PageWithModelWithoutHandlers.OnGet);
                Assert.Equal(typeInfo.GetMethod(name), handler.MethodInfo);
                Assert.Equal(name, handler.Name);
                Assert.Equal("Get", handler.HttpMethod);
                Assert.Null(handler.HandlerName);
            },
                handler =>
            {
                var name = nameof(PageWithModelWithoutHandlers.OnPostAsync);
                Assert.Equal(typeInfo.GetMethod(name), handler.MethodInfo);
                Assert.Equal(name, handler.Name);
                Assert.Equal("Post", handler.HttpMethod);
                Assert.Null(handler.HandlerName);
            },
                handler =>
            {
                var name = nameof(PageWithModelWithoutHandlers.OnPostDeleteCustomerAsync);
                Assert.Equal(typeInfo.GetMethod(name), handler.MethodInfo);
                Assert.Equal(name, handler.Name);
                Assert.Equal("Post", handler.HttpMethod);
                Assert.Equal("DeleteCustomer", handler.HandlerName);
            });
        }
        public void CreateHandlerModel_ParsesMethod()
        {
            // Arrange
            var provider  = new DefaultPageApplicationModelProvider();
            var typeInfo  = typeof(PageModelWithHandlerNames).GetTypeInfo();
            var pageModel = new PageApplicationModel(new PageActionDescriptor(), typeInfo, new object[0]);

            // Act
            provider.PopulateHandlerMethods(pageModel);

            // Assert
            var handlerMethods = pageModel.HandlerMethods;

            Assert.Collection(
                handlerMethods.OrderBy(h => h.MethodInfo.Name),
                handler =>
            {
                Assert.Same(typeInfo.GetMethod(nameof(PageModelWithHandlerNames.OnPutDeleteAsync)), handler.MethodInfo);
                Assert.Equal("Put", handler.HttpMethod);
                Assert.Equal("Delete", handler.HandlerName);
            });
        }
        public void OnProvidersExecuting_DiscoversPropertiesFromPage_IfModelTypeDoesNotHaveAttribute()
        {
            // Arrange
            var provider   = new DefaultPageApplicationModelProvider();
            var typeInfo   = typeof(PageWithModelWithoutPageModelAttribute).GetTypeInfo();
            var descriptor = new PageActionDescriptor();
            var context    = new PageApplicationModelProviderContext(descriptor, typeInfo);

            // Act
            provider.OnProvidersExecuting(context);

            // Assert
            Assert.NotNull(context.PageApplicationModel);
            var propertiesOnPage = context.PageApplicationModel.HandlerProperties
                                   .Where(p => p.PropertyInfo.DeclaringType.GetTypeInfo() == typeInfo);

            Assert.Collection(
                propertiesOnPage.OrderBy(p => p.PropertyName),
                property =>
            {
                Assert.Equal(typeInfo.GetProperty(nameof(PageWithModelWithoutPageModelAttribute.Model)), property.PropertyInfo);
                Assert.Equal(nameof(PageWithModelWithoutPageModelAttribute.Model), property.PropertyName);
            },
                property =>
            {
                Assert.Equal(typeInfo.GetProperty(nameof(PageWithModelWithoutPageModelAttribute.Property1)), property.PropertyInfo);
                Assert.Null(property.BindingInfo);
                Assert.Equal(nameof(PageWithModelWithoutPageModelAttribute.Property1), property.PropertyName);
            },
                property =>
            {
                Assert.Equal(typeInfo.GetProperty(nameof(PageWithModelWithoutPageModelAttribute.Property2)), property.PropertyInfo);
                Assert.Equal(nameof(PageWithModelWithoutPageModelAttribute.Property2), property.PropertyName);
                Assert.NotNull(property.BindingInfo);
                Assert.Equal(BindingSource.Path, property.BindingInfo.BindingSource);
            });
        }