public void GetActions_RouteOnController_CreatesOneActionInforPerRouteTemplateOnAction(Type controller)
        {
            // Arrange
            var conventions = new DefaultActionDiscoveryConventions();
            var typeInfo    = controller.GetTypeInfo();

            // Act
            var actionInfos = conventions.GetActions(typeInfo.GetMethod("Index"), typeInfo);

            // Assert
            Assert.Equal(2, actionInfos.Count());

            foreach (var action in actionInfos)
            {
                Assert.Equal("Index", action.ActionName);
                Assert.True(action.RequireActionNameMatch);

                var httpMethod = Assert.Single(action.HttpMethods);
                Assert.Equal("GET", httpMethod);

                Assert.NotNull(action.AttributeRoute);

                Assert.IsType <HttpGetAttribute>(Assert.Single(action.Attributes));
            }

            Assert.Single(actionInfos, ai => ai.AttributeRoute.Template.Equals("List"));
            Assert.Single(actionInfos, ai => ai.AttributeRoute.Template.Equals("All"));
        }
        public void GetActions_AttributeRouteOnAction()
        {
            // Arrange
            var conventions = new DefaultActionDiscoveryConventions();
            var typeInfo    = typeof(NoRouteAttributeOnControllerController).GetTypeInfo();
            var actionName  = nameof(NoRouteAttributeOnControllerController.Edit);

            // Act
            var actionInfos = conventions.GetActions(typeInfo.GetMethod(actionName), typeInfo);

            // Assert
            var action = Assert.Single(actionInfos);

            Assert.Equal("Edit", action.ActionName);
            Assert.True(action.RequireActionNameMatch);

            var httpMethod = Assert.Single(action.HttpMethods);

            Assert.Equal("POST", httpMethod);

            Assert.NotNull(action.AttributeRoute);
            Assert.Equal("Change", action.AttributeRoute.Template);

            Assert.IsType <HttpPostAttribute>(Assert.Single(action.Attributes));
        }
        public void GetActions_AttributeRouteOnAction_CreatesOneActionInforPerRouteTemplate()
        {
            // Arrange
            var conventions = new DefaultActionDiscoveryConventions();
            var typeInfo    = typeof(NoRouteAttributeOnControllerController).GetTypeInfo();
            var actionName  = nameof(NoRouteAttributeOnControllerController.Index);

            // Act
            var actionInfos = conventions.GetActions(typeInfo.GetMethod(actionName), typeInfo);

            // Assert
            Assert.Equal(2, actionInfos.Count());

            foreach (var action in actionInfos)
            {
                Assert.Equal("Index", action.ActionName);
                Assert.True(action.RequireActionNameMatch);

                Assert.NotNull(action.AttributeRoute);
            }

            var list       = Assert.Single(actionInfos, ai => ai.AttributeRoute.Template.Equals("List"));
            var listMethod = Assert.Single(list.HttpMethods);

            Assert.Equal("POST", listMethod);
            Assert.IsType <HttpPostAttribute>(Assert.Single(list.Attributes));

            var all       = Assert.Single(actionInfos, ai => ai.AttributeRoute.Template.Equals("All"));
            var allMethod = Assert.Single(all.HttpMethods);

            Assert.Equal("GET", allMethod);
            Assert.IsType <HttpGetAttribute>(Assert.Single(all.Attributes));
        }
        public void GetActions_ConventionallyRoutedAction_WithMultipleOverlappingHttpConstraints()
        {
            // Arrange
            var conventions = new DefaultActionDiscoveryConventions();
            var typeInfo    = typeof(ConventionallyRoutedController).GetTypeInfo();
            var actionName  = nameof(ConventionallyRoutedController.List);

            // Act
            var actionInfos = conventions.GetActions(typeInfo.GetMethod(actionName), typeInfo);

            // Assert
            Assert.Equal(3, actionInfos.Count());
            Assert.Single(actionInfos, a => a.HttpMethods.Contains("GET"));
            Assert.Single(actionInfos, a => a.HttpMethods.Contains("POST"));
            Assert.Single(actionInfos, a => a.HttpMethods.Contains("PUT"));

            foreach (var action in actionInfos)
            {
                Assert.Equal("List", action.ActionName);
                Assert.True(action.RequireActionNameMatch);
                Assert.Null(action.AttributeRoute);

                Assert.Equal(3, action.Attributes.Length);
                Assert.Single(action.Attributes, a => a is HttpPutAttribute);
                Assert.Single(action.Attributes, a => a is HttpGetAttribute);
                Assert.Single(action.Attributes, a => a is AcceptVerbsAttribute);
            }
        }
        public void GetActions_ConventionallyRoutedAction_WithMultipleOverlappingHttpConstraints()
        {
            // Arrange
            var conventions = new DefaultActionDiscoveryConventions();
            var typeInfo    = typeof(ConventionallyRoutedController).GetTypeInfo();
            var actionName  = nameof(ConventionallyRoutedController.List);

            // Act
            var actionInfos = conventions.GetActions(typeInfo.GetMethod(actionName), typeInfo);

            // Assert
            var action = Assert.Single(actionInfos);

            Assert.Equal("List", action.ActionName);
            Assert.True(action.RequireActionNameMatch);
            Assert.Equal(new[] { "GET", "PUT", "POST" }, action.HttpMethods);
            Assert.Null(action.AttributeRoute);
        }
        public void GetActions_ConventionallyRoutedAction_WithoutHttpConstraints()
        {
            // Arrange
            var conventions = new DefaultActionDiscoveryConventions();
            var typeInfo    = typeof(ConventionallyRoutedController).GetTypeInfo();
            var actionName  = nameof(ConventionallyRoutedController.Edit);

            // Act
            var actionInfos = conventions.GetActions(typeInfo.GetMethod(actionName), typeInfo);

            // Assert
            var action = Assert.Single(actionInfos);

            Assert.Equal("Edit", action.ActionName);
            Assert.True(action.RequireActionNameMatch);
            Assert.Null(action.HttpMethods);
            Assert.Null(action.AttributeRoute);
            Assert.Empty(action.Attributes);
        }
        public void GetActions_RouteAttributeOnController_CreatesAttributeRoute_ForNonAttributedActions(Type controller)
        {
            // Arrange
            var conventions = new DefaultActionDiscoveryConventions();
            var typeInfo    = controller.GetTypeInfo();

            // Act
            var actionInfos = conventions.GetActions(typeInfo.GetMethod("Delete"), typeInfo);

            // Assert
            var action = Assert.Single(actionInfos);

            Assert.Equal("Delete", action.ActionName);
            Assert.True(action.RequireActionNameMatch);

            Assert.Null(action.HttpMethods);

            Assert.Null(action.AttributeRoute);
        }
        public void GetActions_NoRouteOnController_AllowsConventionallyRoutedActions_OnTheSameController()
        {
            // Arrange
            var conventions = new DefaultActionDiscoveryConventions();
            var typeInfo    = typeof(NoRouteAttributeOnControllerController).GetTypeInfo();
            var actionName  = nameof(NoRouteAttributeOnControllerController.Remove);

            // Act
            var actionInfos = conventions.GetActions(typeInfo.GetMethod(actionName), typeInfo);

            // Assert
            var action = Assert.Single(actionInfos);

            Assert.Equal("Remove", action.ActionName);
            Assert.True(action.RequireActionNameMatch);

            Assert.Null(action.HttpMethods);

            Assert.Null(action.AttributeRoute);
        }
        public void GetActions_AttributeRouteOnAction_AcceptVerbsAttributeWithTemplate()
        {
            // Arrange
            var conventions = new DefaultActionDiscoveryConventions();
            var typeInfo    = typeof(NoRouteAttributeOnControllerController).GetTypeInfo();
            var actionName  = nameof(NoRouteAttributeOnControllerController.List);

            // Act
            var actionInfos = conventions.GetActions(typeInfo.GetMethod(actionName), typeInfo);

            // Assert
            var action = Assert.Single(actionInfos);

            Assert.Equal("List", action.ActionName);
            Assert.True(action.RequireActionNameMatch);

            Assert.Equal(new[] { "GET", "HEAD" }, action.HttpMethods);

            Assert.NotNull(action.AttributeRoute);
            Assert.Equal("ListAll", action.AttributeRoute.Template);
        }
        public void GetActions_AttributeRouteOnAction_RouteAttribute()
        {
            // Arrange
            var conventions = new DefaultActionDiscoveryConventions();
            var typeInfo    = typeof(NoRouteAttributeOnControllerController).GetTypeInfo();
            var actionName  = nameof(NoRouteAttributeOnControllerController.Update);

            // Act
            var actionInfos = conventions.GetActions(typeInfo.GetMethod(actionName), typeInfo);

            // Assert
            var action = Assert.Single(actionInfos);

            Assert.Equal("Update", action.ActionName);
            Assert.True(action.RequireActionNameMatch);

            Assert.Null(action.HttpMethods);

            Assert.NotNull(action.AttributeRoute);
            Assert.Equal("Update", action.AttributeRoute.Template);
        }
        public void GetActions_ConventionallyRoutedActionWithHttpConstraints_AndInvalidRouteTemplateProvider()
        {
            // Arrange
            var conventions = new DefaultActionDiscoveryConventions();
            var typeInfo    = typeof(ConventionallyRoutedController).GetTypeInfo();
            var actionName  = nameof(ConventionallyRoutedController.Delete);

            // Act
            var actionInfos = conventions.GetActions(typeInfo.GetMethod(actionName), typeInfo);

            // Assert
            var action = Assert.Single(actionInfos);

            Assert.Equal("Delete", action.ActionName);
            Assert.True(action.RequireActionNameMatch);

            var httpMethod = Assert.Single(action.HttpMethods);

            Assert.Equal("DELETE", httpMethod);
            Assert.Null(action.AttributeRoute);
        }
        public void GetActions_ConventionallyRoutedAction_WithHttpConstraints()
        {
            // Arrange
            var conventions = new DefaultActionDiscoveryConventions();
            var typeInfo    = typeof(ConventionallyRoutedController).GetTypeInfo();
            var actionName  = nameof(ConventionallyRoutedController.Update);

            // Act
            var actionInfos = conventions.GetActions(typeInfo.GetMethod(actionName), typeInfo);

            // Assert
            Assert.Equal(2, actionInfos.Count());
            Assert.Single(actionInfos, a => a.HttpMethods.Contains("PUT"));
            Assert.Single(actionInfos, a => a.HttpMethods.Contains("PATCH"));

            foreach (var action in actionInfos)
            {
                Assert.Equal("Update", action.ActionName);
                Assert.True(action.RequireActionNameMatch);
                Assert.Null(action.AttributeRoute);
                Assert.IsType <CustomHttpMethodsAttribute>(Assert.Single(action.Attributes));
            }
        }