public void ResolveShouldWorkWithBindingAttributes()
        {
            var config  = TestObjectFactory.GetHttpConfigurationWithRoutes();
            var request = new HttpRequestMessage(HttpMethod.Post, "api/Route/PostMethodWithModelAndAttribute")
            {
                Content =
                    new StringContent(
                        "{\"NonRequiredString\": \"AnotherTest\", \"NotValidateInteger\": 2}")
            };

            request.Content.Headers.ContentType = new MediaTypeHeaderValue(MediaType.ApplicationJson);

            var routeInfo = InternalRouteResolver.Resolve(config, request);

            Assert.IsTrue(routeInfo.IsResolved);
            Assert.IsFalse(routeInfo.IsIgnored);
            Assert.IsFalse(routeInfo.MethodIsNotAllowed);
            Assert.IsNullOrEmpty(routeInfo.UnresolvedError);
            Assert.AreEqual(typeof(RouteController), routeInfo.Controller);
            Assert.AreEqual("PostMethodWithModelAndAttribute", routeInfo.Action);
            Assert.AreEqual(1, routeInfo.ActionArguments.Count);
            Assert.IsNotNull(routeInfo.ActionArguments["someModel"]);
            Assert.IsAssignableFrom <RequestModel>(routeInfo.ActionArguments["someModel"].Value);
            Assert.AreEqual(0, ((RequestModel)routeInfo.ActionArguments["someModel"].Value).Integer);
            Assert.IsNullOrEmpty(((RequestModel)routeInfo.ActionArguments["someModel"].Value).RequiredString);
            Assert.IsNullOrEmpty(((RequestModel)routeInfo.ActionArguments["someModel"].Value).NonRequiredString);
            Assert.AreEqual(0, ((RequestModel)routeInfo.ActionArguments["someModel"].Value).NotValidateInteger);
            Assert.IsNull(routeInfo.HttpMessageHandler);
            Assert.IsFalse(routeInfo.ModelState.IsValid);
        }
예제 #2
0
        public void ResolveShouldResolveCorrectlyWithJsonContentBodyAndQueryString()
        {
            var routeInfo = InternalRouteResolver.Resolve(
                TestApplication.RouteServices,
                TestApplication.Router,
                this.GetRouteContext("/Normal/ActionWithMultipleParameters/5", "POST", body: @"{""Integer"":5,""String"":""Test""}", queryString: "?text=test", contentType: ContentType.ApplicationJson));

            Assert.True(routeInfo.IsResolved);
            Assert.Null(routeInfo.UnresolvedError);
            Assert.Equal(typeof(NormalController).GetTypeInfo(), routeInfo.ControllerType);
            Assert.Equal("Normal", routeInfo.ControllerName);
            Assert.Equal("ActionWithMultipleParameters", routeInfo.Action);
            Assert.Equal(3, routeInfo.ActionArguments.Count);
            Assert.Equal(5, routeInfo.ActionArguments["id"].Value);
            Assert.Equal("test", routeInfo.ActionArguments["text"].Value);
            Assert.True(routeInfo.ActionArguments.ContainsKey("model"));

            var model = routeInfo.ActionArguments["model"].Value as RequestModel;

            Assert.NotNull(model);
            Assert.Equal(5, model.Integer);
            Assert.Equal("Test", model.String);

            Assert.True(routeInfo.ModelState.IsValid);
        }
        public void ResolveShouldResolveCorrectlyWithPartialJsonContentBody()
        {
            var routeInfo = InternalRouteResolver.Resolve(
                TestApplication.RouteServices,
                TestApplication.Router,
                this.GetRouteContext("/Normal/ActionWithModel/5", "POST", body: @"{""Integer"":5}",
                                     contentType: ContentType.ApplicationJson));

            Assert.True(routeInfo.IsResolved);
            Assert.Null(routeInfo.UnresolvedError);
            Assert.Equal(typeof(NormalController).GetTypeInfo(), routeInfo.ControllerType);
            Assert.Equal("Normal", routeInfo.ControllerName);
            Assert.Equal("ActionWithModel", routeInfo.Action);
            Assert.Equal(2, routeInfo.ActionArguments.Count);
            Assert.Equal(5, routeInfo.ActionArguments["id"].Value);
            Assert.True(routeInfo.ActionArguments.ContainsKey("model"));

            var model = routeInfo.ActionArguments["model"].Value as RequestModel;

            Assert.NotNull(model);
            Assert.Equal(5, model.Integer);
            Assert.Equal(null, model.String);

            Assert.False(routeInfo.ModelState.IsValid);
        }
        public void ResolveShouldNotCallTheActualActionCode()
        {
            var routeInfo = InternalRouteResolver.Resolve(
                TestApplication.RouteServices,
                TestApplication.Router,
                this.GetRouteContext("/Home/FailingAction"));

            Assert.True(routeInfo.IsResolved);
        }
예제 #5
0
        public void ResolveShouldResolveCorrectlyWithMissingQueryString()
        {
            var routeInfo = InternalRouteResolver.Resolve(
                TestApplication.RouteServices,
                TestApplication.Router,
                this.GetRouteContext("/Normal/QueryString", "POST"));

            Assert.True(routeInfo.IsResolved);
            Assert.Null(routeInfo.UnresolvedError);
            Assert.Equal(typeof(NormalController).GetTypeInfo(), routeInfo.ControllerType);
            Assert.Equal("Normal", routeInfo.ControllerName);
            Assert.Equal("QueryString", routeInfo.Action);
            Assert.Equal(0, routeInfo.ActionArguments.Count);
            Assert.True(routeInfo.ModelState.IsValid);
        }
예제 #6
0
        public void ResolveShouldResolveCorrectlyWithWrongSpecificMethod()
        {
            var routeInfo = InternalRouteResolver.Resolve(
                TestApplication.RouteServices,
                TestApplication.Router,
                this.GetRouteContext("/Normal/GetMethod", "POST"));

            Assert.False(routeInfo.IsResolved);
            Assert.Equal("action could not be matched", routeInfo.UnresolvedError);
            Assert.Null(routeInfo.ControllerType);
            Assert.Null(routeInfo.ControllerName);
            Assert.Null(routeInfo.Action);
            Assert.Null(routeInfo.ActionArguments);
            Assert.Null(routeInfo.ModelState);
        }
예제 #7
0
        public void ResolveShouldResolveCorrectlyWithNonMatchingParameterOfDifferentType()
        {
            var routeInfo = InternalRouteResolver.Resolve(
                TestApplication.RouteServices,
                TestApplication.Router,
                this.GetRouteContext("/Normal/ActionWithParameters/Test"));

            Assert.True(routeInfo.IsResolved);
            Assert.Null(routeInfo.UnresolvedError);
            Assert.Equal(typeof(NormalController).GetTypeInfo(), routeInfo.ControllerType);
            Assert.Equal("Normal", routeInfo.ControllerName);
            Assert.Equal("ActionWithParameters", routeInfo.Action);
            Assert.Equal(0, routeInfo.ActionArguments.Count);
            Assert.False(routeInfo.ModelState.IsValid);
        }
예제 #8
0
        public void ResolveShouldResolveCorrectControllerAndActionWithActionNameAttribute()
        {
            var routeInfo = InternalRouteResolver.Resolve(
                TestApplication.RouteServices,
                TestApplication.Router,
                this.GetRouteContext("/Normal/AnotherName"));

            Assert.True(routeInfo.IsResolved);
            Assert.Null(routeInfo.UnresolvedError);
            Assert.Equal(typeof(NormalController).GetTypeInfo(), routeInfo.ControllerType);
            Assert.Equal("Normal", routeInfo.ControllerName);
            Assert.Equal("AnotherName", routeInfo.Action);
            Assert.Equal(0, routeInfo.ActionArguments.Count);
            Assert.True(routeInfo.ModelState.IsValid);
        }
예제 #9
0
        public void ResolveShouldResolveCorrectlyWithRouteAttribute()
        {
            var routeInfo = InternalRouteResolver.Resolve(
                TestApplication.RouteServices,
                TestApplication.Router,
                this.GetRouteContext("/AttributeController/AttributeAction"));

            Assert.True(routeInfo.IsResolved);
            Assert.Null(routeInfo.UnresolvedError);
            Assert.Equal(typeof(RouteController).GetTypeInfo(), routeInfo.ControllerType);
            Assert.Equal("Route", routeInfo.ControllerName);
            Assert.Equal("Index", routeInfo.Action);
            Assert.Equal(0, routeInfo.ActionArguments.Count);
            Assert.True(routeInfo.ModelState.IsValid);
        }
예제 #10
0
        public void ResolveShouldResolveCorrectlyWithRoutePrefixAndRouteAttribute()
        {
            var config  = TestObjectFactory.GetHttpConfigurationWithRoutes();
            var request = new HttpRequestMessage(HttpMethod.Post, "api/Routes/Test");

            var routeInfo = InternalRouteResolver.Resolve(config, request);

            Assert.IsTrue(routeInfo.IsResolved);
            Assert.IsFalse(routeInfo.IsIgnored);
            Assert.IsFalse(routeInfo.MethodIsNotAllowed);
            Assert.IsNullOrEmpty(routeInfo.UnresolvedError);
            Assert.AreEqual(typeof(RouteController), routeInfo.Controller);
            Assert.AreEqual("WithRouteAttribute", routeInfo.Action);
            Assert.AreEqual(0, routeInfo.ActionArguments.Count);
            Assert.IsNull(routeInfo.HttpMessageHandler);
            Assert.IsTrue(routeInfo.ModelState.IsValid);
        }
예제 #11
0
        public void ResolveShouldIgnoreRoutesWithStopRountingHandler()
        {
            var config  = TestObjectFactory.GetHttpConfigurationWithRoutes();
            var request = new HttpRequestMessage(HttpMethod.Get, "api/IgnoredRoute");

            var routeInfo = InternalRouteResolver.Resolve(config, request);

            Assert.IsTrue(routeInfo.IsResolved);
            Assert.IsTrue(routeInfo.IsIgnored);
            Assert.IsFalse(routeInfo.MethodIsNotAllowed);
            Assert.IsNullOrEmpty(routeInfo.UnresolvedError);
            Assert.AreEqual(typeof(RouteController), routeInfo.Controller);
            Assert.AreEqual("GetMethod", routeInfo.Action);
            Assert.AreEqual(0, routeInfo.ActionArguments.Count);
            Assert.IsAssignableFrom <StopRoutingHandler>(routeInfo.HttpMessageHandler);
            Assert.IsTrue(routeInfo.ModelState.IsValid);
        }
예제 #12
0
        public void ResolveShouldReturnProperErrorWhenTwoActionsAreMatched()
        {
            var config  = TestObjectFactory.GetHttpConfigurationWithRoutes();
            var request = new HttpRequestMessage(HttpMethod.Post, "api/Route/SameAction");

            var routeInfo = InternalRouteResolver.Resolve(config, request);

            Assert.IsFalse(routeInfo.IsResolved);
            Assert.IsFalse(routeInfo.IsIgnored);
            Assert.IsFalse(routeInfo.MethodIsNotAllowed);
            Assert.AreEqual("it could not be resolved: 'Multiple actions were found that match the request'", routeInfo.UnresolvedError);
            Assert.IsNull(routeInfo.Controller);
            Assert.IsNull(routeInfo.Action);
            Assert.IsNull(routeInfo.ActionArguments);
            Assert.IsNull(routeInfo.HttpMessageHandler);
            Assert.IsNull(routeInfo.ModelState);
        }
예제 #13
0
        public void ResolveShouldResolveCorrectControllerAndAction()
        {
            var config  = TestObjectFactory.GetHttpConfigurationWithRoutes();
            var request = new HttpRequestMessage(HttpMethod.Post, "api/NoParameterlessConstructor/OkAction");

            var routeInfo = InternalRouteResolver.Resolve(config, request);

            Assert.IsTrue(routeInfo.IsResolved);
            Assert.IsFalse(routeInfo.IsIgnored);
            Assert.IsFalse(routeInfo.MethodIsNotAllowed);
            Assert.IsNullOrEmpty(routeInfo.UnresolvedError);
            Assert.AreEqual(typeof(NoParameterlessConstructorController), routeInfo.Controller);
            Assert.AreEqual("OkAction", routeInfo.Action);
            Assert.AreEqual(0, routeInfo.ActionArguments.Count);
            Assert.IsNull(routeInfo.HttpMessageHandler);
            Assert.IsTrue(routeInfo.ModelState.IsValid);
        }
예제 #14
0
        public void ResolveShouldNotResolveCorrectlyWithMissingQueryString()
        {
            var config  = TestObjectFactory.GetHttpConfigurationWithRoutes();
            var request = new HttpRequestMessage(HttpMethod.Post, "api/Route/QueryString");

            var routeInfo = InternalRouteResolver.Resolve(config, request);

            Assert.IsFalse(routeInfo.IsResolved);
            Assert.IsFalse(routeInfo.IsIgnored);
            Assert.IsFalse(routeInfo.MethodIsNotAllowed);
            Assert.AreEqual("it could not be resolved: 'Not Found'", routeInfo.UnresolvedError);
            Assert.IsNull(routeInfo.Controller);
            Assert.IsNull(routeInfo.Action);
            Assert.IsNull(routeInfo.ActionArguments);
            Assert.IsNull(routeInfo.HttpMessageHandler);
            Assert.IsNull(routeInfo.ModelState);
        }
예제 #15
0
        public void ResolveShouldReturnProperErrorWhenTwoActionsAreMatched()
        {
            var routeInfo = InternalRouteResolver.Resolve(
                TestApplication.RouteServices,
                TestApplication.Router,
                this.GetRouteContext("/Normal/ActionWithOverloads"));

            Assert.False(routeInfo.IsResolved);
            Assert.Equal(
                "exception was thrown when trying to select an action: 'Multiple actions matched. The following actions matched route data and had all constraints satisfied:\r\n\r\nMyTested.AspNetCore.Mvc.Test.Setups.Routes.NormalController.ActionWithOverloads (MyTested.AspNetCore.Mvc.Test)\r\nMyTested.AspNetCore.Mvc.Test.Setups.Routes.NormalController.ActionWithOverloads (MyTested.AspNetCore.Mvc.Test)'",
                routeInfo.UnresolvedError);
            Assert.Null(routeInfo.ControllerType);
            Assert.Null(routeInfo.ControllerName);
            Assert.Null(routeInfo.Action);
            Assert.Null(routeInfo.ActionArguments);
            Assert.Null(routeInfo.ModelState);
        }
예제 #16
0
        public void ResolveShouldResolveCorrectlyWithParameterAndQueryString()
        {
            var config  = TestObjectFactory.GetHttpConfigurationWithRoutes();
            var request = new HttpRequestMessage(HttpMethod.Post, "api/Route/WithParameterAndQueryString/5?value=test");

            var routeInfo = InternalRouteResolver.Resolve(config, request);

            Assert.IsTrue(routeInfo.IsResolved);
            Assert.IsFalse(routeInfo.IsIgnored);
            Assert.IsFalse(routeInfo.MethodIsNotAllowed);
            Assert.IsNullOrEmpty(routeInfo.UnresolvedError);
            Assert.AreEqual(typeof(RouteController), routeInfo.Controller);
            Assert.AreEqual("WithParameterAndQueryString", routeInfo.Action);
            Assert.AreEqual(5, routeInfo.ActionArguments["id"].Value);
            Assert.AreEqual("test", routeInfo.ActionArguments["value"].Value);
            Assert.IsNull(routeInfo.HttpMessageHandler);
            Assert.IsTrue(routeInfo.ModelState.IsValid);
        }
예제 #17
0
        public void ResolveShouldResolveCorrectlyWithParameterAndQueryString()
        {
            var routeInfo = InternalRouteResolver.Resolve(
                TestApplication.RouteServices,
                TestApplication.Router,
                this.GetRouteContext("/Normal/ActionWithMultipleParameters/5", queryString: "?text=test", contentType: ContentType.ApplicationJson));

            Assert.True(routeInfo.IsResolved);
            Assert.Null(routeInfo.UnresolvedError);
            Assert.Equal(typeof(NormalController).GetTypeInfo(), routeInfo.ControllerType);
            Assert.Equal("Normal", routeInfo.ControllerName);
            Assert.Equal("ActionWithMultipleParameters", routeInfo.Action);
            Assert.Equal(3, routeInfo.ActionArguments.Count);
            Assert.Equal(5, routeInfo.ActionArguments["id"].Value);
            Assert.Equal("test", routeInfo.ActionArguments["text"].Value);
            Assert.True(routeInfo.ActionArguments.ContainsKey("model"));
            Assert.True(routeInfo.ModelState.IsValid);
        }
예제 #18
0
 public ResolvedRouteContext GetActualRouteInfo()
 {
     return(this.actualRouteInfo ??
            (this.actualRouteInfo = InternalRouteResolver.Resolve(this.Services, this.Router, this.RouteContext)));
 }
예제 #19
0
 private ResolvedRouteInfo GetActualRouteInfo()
 {
     return(this.actualRouteInfo ??
            (this.actualRouteInfo = InternalRouteResolver.Resolve(this.HttpConfiguration, this.requestMessage)));
 }