public void CreateActionModel_RouteOnController_CreatesOneActionInforPerRouteTemplateOnAction(Type controller)
        {
            // Arrange
            var builder  = new TestApplicationModelProvider();
            var typeInfo = controller.GetTypeInfo();

            // Act
            var action = builder.CreateActionModel(typeInfo, typeInfo.AsType().GetMethod("Index"));

            // Assert
            Assert.NotNull(action.Attributes);
            Assert.Equal(2, action.Attributes.Count);
            Assert.Equal(2, action.Selectors.Count);
            Assert.Equal("Index", action.ActionName);

            foreach (var selectorModel in action.Selectors)
            {
                var methodConstraint = Assert.Single(selectorModel.ActionConstraints.OfType <HttpMethodActionConstraint>());
                var httpMethod       = Assert.Single(methodConstraint.HttpMethods);
                Assert.Equal("GET", httpMethod);

                Assert.NotNull(selectorModel.AttributeRouteModel.Template);
            }

            Assert.Single(action.Selectors, ai => ai.AttributeRouteModel.Template.Equals("List"));
            Assert.Single(action.Selectors, ai => ai.AttributeRouteModel.Template.Equals("All"));
        }
        public void CreateActionModel_MixedHttpVerbsAndRoutes_MultipleEmptyAndNonEmptyVerbsWithMultipleRoutes()
        {
            // Arrange
            var builder    = new TestApplicationModelProvider();
            var typeInfo   = typeof(MixedHttpVerbsAndRouteAttributeController).GetTypeInfo();
            var actionName = nameof(MixedHttpVerbsAndRouteAttributeController.MultipleVerbsWithAnyWithoutTemplateAndRoutes);

            // Act
            var action = builder.CreateActionModel(typeInfo, typeInfo.AsType().GetMethod(actionName));

            // Assert
            Assert.Equal(3, action.Selectors.Count);

            var selectorModel    = Assert.Single(action.Selectors, s => s.AttributeRouteModel.Template == "Products");
            var methodConstraint = Assert.Single(selectorModel.ActionConstraints.OfType <HttpMethodActionConstraint>());

            Assert.Equal <string>(new string[] { "GET" }, methodConstraint.HttpMethods);

            selectorModel    = Assert.Single(action.Selectors, s => s.AttributeRouteModel.Template == "v2/Products");
            methodConstraint = Assert.Single(selectorModel.ActionConstraints.OfType <HttpMethodActionConstraint>());
            Assert.Equal <string>(new string[] { "GET" }, methodConstraint.HttpMethods);

            selectorModel    = Assert.Single(action.Selectors, s => s.AttributeRouteModel.Template == "Products/Buy");
            methodConstraint = Assert.Single(selectorModel.ActionConstraints.OfType <HttpMethodActionConstraint>());
            Assert.Equal <string>(new string[] { "POST" }, methodConstraint.HttpMethods);
        }
        public void CreateActionModel_AttributeRouteOnAction_AcceptVerbsAttributeWithTemplate()
        {
            // Arrange
            var builder    = new TestApplicationModelProvider();
            var typeInfo   = typeof(NoRouteAttributeOnControllerController).GetTypeInfo();
            var actionName = nameof(NoRouteAttributeOnControllerController.List);

            // Act
            var action = builder.CreateActionModel(typeInfo, typeInfo.AsType().GetMethod(actionName));

            // Assert
            Assert.NotNull(action);
            Assert.Single(action.Selectors);
            var methodConstraint = Assert.Single(
                action.Selectors[0].ActionConstraints.OfType <HttpMethodActionConstraint>());

            Assert.Equal(actionName, action.ActionName);

            Assert.Equal(
                new[] { "GET", "HEAD" },
                methodConstraint.HttpMethods.OrderBy(m => m, StringComparer.Ordinal));

            var attributeRoute = Assert.Single(GetAttributeRoutes(action.Selectors));

            Assert.Equal("ListAll", attributeRoute.Template);

            Assert.IsType <AcceptVerbsAttribute>(Assert.Single(action.Attributes));
        }
        public void CreateActionModel_AttributeRouteOnAction()
        {
            // Arrange
            var builder    = new TestApplicationModelProvider();
            var typeInfo   = typeof(NoRouteAttributeOnControllerController).GetTypeInfo();
            var actionName = nameof(NoRouteAttributeOnControllerController.Edit);

            // Act
            var action = builder.CreateActionModel(typeInfo, typeInfo.AsType().GetMethod(actionName));

            // Assert
            Assert.NotNull(action);
            Assert.Single(action.Selectors);
            var methodConstraint = Assert.Single(
                action.Selectors[0].ActionConstraints.OfType <HttpMethodActionConstraint>());

            Assert.Equal(actionName, action.ActionName);

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

            Assert.Equal("HEAD", httpMethod);

            var attributeRoute = Assert.Single(GetAttributeRoutes(action.Selectors));

            Assert.Equal("Change", attributeRoute.Template);

            Assert.IsType <HttpHeadAttribute>(Assert.Single(action.Attributes));
        }
        public void CreateActionModel_ConventionallyRoutedAction_WithoutHttpConstraints()
        {
            // Arrange
            var builder    = new TestApplicationModelProvider();
            var typeInfo   = typeof(ConventionallyRoutedController).GetTypeInfo();
            var actionName = nameof(ConventionallyRoutedController.Edit);

            // Act
            var action = builder.CreateActionModel(typeInfo, typeInfo.AsType().GetMethod(actionName));

            // Assert
            Assert.NotNull(action);
            Assert.Equal(actionName, action.ActionName);
            Assert.Empty(action.Attributes);
            Assert.Single(action.Selectors);
            Assert.Empty(action.Selectors[0].ActionConstraints.OfType <HttpMethodActionConstraint>());
            Assert.Empty(GetAttributeRoutes(action.Selectors));
        }
        public void CreateActionModel_RouteAttributeOnController_CreatesAttributeRoute_ForNonAttributedActions(Type controller)
        {
            // Arrange
            var builder  = new TestApplicationModelProvider();
            var typeInfo = controller.GetTypeInfo();

            // Act
            var action = builder.CreateActionModel(typeInfo, typeInfo.AsType().GetMethod("Delete"));

            // Assert
            Assert.NotNull(action);

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

            Assert.Single(action.Selectors);
            Assert.Empty(action.Selectors[0].ActionConstraints);
            Assert.Empty(GetAttributeRoutes(action.Selectors));
            Assert.Empty(action.Attributes);
        }
        public void CreateActionModel_NoRouteOnController_AllowsConventionallyRoutedActions_OnTheSameController()
        {
            // Arrange
            var builder    = new TestApplicationModelProvider();
            var typeInfo   = typeof(NoRouteAttributeOnControllerController).GetTypeInfo();
            var actionName = nameof(NoRouteAttributeOnControllerController.Remove);

            // Act
            var action = builder.CreateActionModel(typeInfo, typeInfo.AsType().GetMethod(actionName));

            // Assert
            Assert.NotNull(action);

            Assert.Equal(actionName, action.ActionName);
            Assert.Empty(action.Attributes);
            Assert.Single(action.Selectors);
            Assert.Empty(action.Selectors[0].ActionConstraints);
            Assert.Null(action.Selectors[0].AttributeRouteModel);
        }
        public void CreateActionModel_InheritedAttributeRoutesOverridden()
        {
            // Arrange
            var builder    = new TestApplicationModelProvider();
            var typeInfo   = typeof(DerivedClassOverridesAttributeRoutesController).GetTypeInfo();
            var actionName = nameof(DerivedClassOverridesAttributeRoutesController.Edit);

            // Act
            var action = builder.CreateActionModel(typeInfo, typeInfo.AsType().GetMethod(actionName));

            // Assert
            Assert.Equal(4, action.Attributes.Count);
            Assert.Equal(2, action.Selectors.Count);

            var selectorModel = Assert.Single(action.Selectors, a => a.AttributeRouteModel?.Template == "C");

            Assert.Contains(selectorModel.AttributeRouteModel.Attribute, action.Attributes);

            selectorModel = Assert.Single(action.Selectors, a => a.AttributeRouteModel?.Template == "D");
            Assert.Contains(selectorModel.AttributeRouteModel.Attribute, action.Attributes);
        }
        public void CreateActionModel_MixedHttpVerbsAndRoutes_EmptyVerbWithRoute()
        {
            // Arrange
            var builder    = new TestApplicationModelProvider();
            var typeInfo   = typeof(MixedHttpVerbsAndRouteAttributeController).GetTypeInfo();
            var actionName = nameof(MixedHttpVerbsAndRouteAttributeController.VerbAndRoute);

            // Act
            var action = builder.CreateActionModel(typeInfo, typeInfo.AsType().GetMethod(actionName));

            // Assert
            Assert.NotNull(action);
            Assert.Single(action.Selectors);
            var methodConstraint = Assert.Single(
                action.Selectors[0].ActionConstraints.OfType <HttpMethodActionConstraint>());

            Assert.Equal <string>(new string[] { "GET" }, methodConstraint.HttpMethods);
            var attributeRoute = Assert.Single(GetAttributeRoutes(action.Selectors));

            Assert.Equal("Products", attributeRoute.Template);
        }
Example #10
0
        public void CreateActionModel_MixedHttpVerbsAndRoutes_WithRouteOnController()
        {
            // Arrange
            var builder    = new TestApplicationModelProvider();
            var typeInfo   = typeof(RouteAttributeOnController).GetTypeInfo();
            var actionName = nameof(RouteAttributeOnController.Get);

            // Act
            var action = builder.CreateActionModel(typeInfo, typeInfo.AsType().GetMethod(actionName));

            // Assert
            Assert.Equal(2, action.Selectors.Count);

            var selectorModel    = Assert.Single(action.Selectors, s => s.AttributeRouteModel == null);
            var methodConstraint = Assert.Single(selectorModel.ActionConstraints.OfType <HttpMethodActionConstraint>());

            Assert.Equal(new string[] { "GET" }, methodConstraint.HttpMethods);

            selectorModel    = Assert.Single(action.Selectors, s => s.AttributeRouteModel?.Template == "id/{id?}");
            methodConstraint = Assert.Single(selectorModel.ActionConstraints.OfType <HttpMethodActionConstraint>());
            Assert.Equal(new string[] { "GET" }, methodConstraint.HttpMethods);
        }
        public void CreateActionModel_MixedHttpVerbsAndRoutes_MultipleEmptyVerbsWithMultipleRoutes()
        {
            // Arrange
            var builder    = new TestApplicationModelProvider();
            var typeInfo   = typeof(MixedHttpVerbsAndRouteAttributeController).GetTypeInfo();
            var actionName = nameof(MixedHttpVerbsAndRouteAttributeController.MultipleVerbsAndRoutes);

            // Act
            var actions = builder.CreateActionModel(typeInfo, typeInfo.AsType().GetMethod(actionName));

            // Assert
            Assert.Equal(2, actions.Selectors.Count);

            // OrderBy is used because the order of the results may very depending on the platform / client.
            var selectorModel    = Assert.Single(actions.Selectors, a => a.AttributeRouteModel.Template == "Products");
            var methodConstraint = Assert.Single(selectorModel.ActionConstraints.OfType <HttpMethodActionConstraint>());

            Assert.Equal(new[] { "GET", "POST" }, methodConstraint.HttpMethods.OrderBy(key => key, StringComparer.Ordinal));

            selectorModel    = Assert.Single(actions.Selectors, a => a.AttributeRouteModel.Template == "v2/Products");
            methodConstraint = Assert.Single(selectorModel.ActionConstraints.OfType <HttpMethodActionConstraint>());
            Assert.Equal(new[] { "GET", "POST" }, methodConstraint.HttpMethods.OrderBy(key => key, StringComparer.Ordinal));
        }
        public void CreateActionModel_AttributeRouteOnAction_RouteAttribute()
        {
            // Arrange
            var builder    = new TestApplicationModelProvider();
            var typeInfo   = typeof(NoRouteAttributeOnControllerController).GetTypeInfo();
            var actionName = nameof(NoRouteAttributeOnControllerController.Update);

            // Act
            var action = builder.CreateActionModel(typeInfo, typeInfo.AsType().GetMethod(actionName));

            // Assert
            Assert.NotNull(action);
            Assert.Single(action.Selectors);
            Assert.Empty(action.Selectors[0].ActionConstraints);

            Assert.Equal(actionName, action.ActionName);

            var attributeRoute = Assert.Single(GetAttributeRoutes(action.Selectors));

            Assert.Equal("Update", attributeRoute.Template);

            Assert.IsType <RouteAttribute>(Assert.Single(action.Attributes));
        }
        public void CreateActionModel_AttributeRouteOnAction_CreatesOneActionInforPerRouteTemplate()
        {
            // Arrange
            var builder    = new TestApplicationModelProvider();
            var typeInfo   = typeof(NoRouteAttributeOnControllerController).GetTypeInfo();
            var actionName = nameof(NoRouteAttributeOnControllerController.Index);

            // Act
            var action = builder.CreateActionModel(typeInfo, typeInfo.AsType().GetMethod(actionName));

            // Assert
            Assert.NotNull(action);
            Assert.Equal(actionName, action.ActionName);
            Assert.NotNull(action.Attributes);
            Assert.Equal(2, action.Attributes.Count);
            Assert.Single(action.Attributes.OfType <HttpGetAttribute>());
            Assert.Single(action.Attributes.OfType <HttpPostAttribute>());
            Assert.Equal(2, action.Selectors.Count);

            foreach (var actionSelectorModel in action.Selectors)
            {
                Assert.NotNull(actionSelectorModel.AttributeRouteModel);
            }

            var selectorModel    = Assert.Single(action.Selectors, ai => ai.AttributeRouteModel?.Template == "List");
            var methodConstraint = Assert.Single(selectorModel.ActionConstraints.OfType <HttpMethodActionConstraint>());
            var listMethod       = Assert.Single(methodConstraint.HttpMethods);

            Assert.Equal("POST", listMethod);

            var all = Assert.Single(action.Selectors, ai => ai.AttributeRouteModel?.Template == "All");

            methodConstraint = Assert.Single(all.ActionConstraints.OfType <HttpMethodActionConstraint>());
            var allMethod = Assert.Single(methodConstraint.HttpMethods);

            Assert.Equal("GET", allMethod);
        }
        public void CreateActionModel_ConventionallyRoutedActionWithHttpConstraints_AndInvalidRouteTemplateProvider()
        {
            // Arrange
            var builder    = new TestApplicationModelProvider();
            var typeInfo   = typeof(ConventionallyRoutedController).GetTypeInfo();
            var actionName = nameof(ConventionallyRoutedController.Delete);

            // Act
            var action = builder.CreateActionModel(typeInfo, typeInfo.AsType().GetMethod(actionName));

            // Assert
            Assert.NotNull(action);
            Assert.Single(action.Selectors);
            var methodConstraint = Assert.Single(
                action.Selectors[0].ActionConstraints.OfType <HttpMethodActionConstraint>());

            Assert.Contains("DELETE", methodConstraint.HttpMethods);
            Assert.Contains("HEAD", methodConstraint.HttpMethods);

            Assert.Equal(actionName, action.ActionName);
            Assert.Empty(GetAttributeRoutes(action.Selectors));
            Assert.Single(action.Attributes.OfType <HttpDeleteAttribute>());
            Assert.Single(action.Attributes.OfType <HttpHeadAttribute>());
        }