コード例 #1
0
        public void GetHttpHandler_WithQueryString_IsPreserved()
        {
            //Arrange
            var httpContext = new Mock <HttpContextBase>();

            httpContext.Setup(c => c.Request.QueryString).Returns(new NameValueCollection
            {
                { "bar", "biz" },
                { "car", "cdr" }
            });

            var requestContext = new RequestContext(httpContext.Object, new RouteData());

            var toMockBase = new Mock <RouteBase>();

            toMockBase
            .Setup(r => r.GetVirtualPath(It.IsAny <RequestContext>(), It.IsAny <RouteValueDictionary>()))
            .Returns(new VirtualPathData(toMockBase.Object, "kittens"));

            var redirectRoute = new RedirectRoute(new Mock <RouteBase>().Object, toMockBase.Object, false);

            // Act
            var handler = redirectRoute.GetHttpHandler(requestContext);

            // Assert
            PAssert.IsTrue(() => ((RedirectHttpHandler)handler).TargetUrl == "~/kittens?bar=biz&car=cdr");
        }
コード例 #2
0
        public void GetHttpHandler_WithTargetRouteAndAdditionalRouteData_GivesRequestRouteDataPrecedence()
        {
            // Arrange
            var httpContext = new Mock <HttpContextBase>();

            httpContext.Setup(c => c.Request.Path).Returns("/qux");
            httpContext.Setup(c => c.Request.AppRelativeCurrentExecutionFilePath).Returns("~/qux");
            httpContext.Setup(c => c.Request.ApplicationPath).Returns("/");
            httpContext.Setup(c => c.Response.ApplyAppPathModifier(It.IsAny <string>())).Returns <string>(s => s);
            var routeData = new RouteData();

            routeData.Values.Add("baz", "the-value-of-baz");
            var requestContext        = new RequestContext(httpContext.Object, routeData);
            var targetRoute           = new Route("foo/{bar}/{baz}", null);
            var additionalRouteValues = new RouteValueDictionary();

            additionalRouteValues.Add("bar", "bar");
            additionalRouteValues.Add("baz", "bizaz");
            var redirectRouteHandler = new RedirectRoute(null, targetRoute, false, additionalRouteValues);

            // Act
            var httpHandler = redirectRouteHandler.GetHttpHandler(requestContext) as RedirectHttpHandler;

            // Assert
            PAssert.IsTrue(() => httpHandler.TargetUrl == "~/foo/bar/the-value-of-baz");
        }
コード例 #3
0
        public void GetHttpHandler_TargetUrl_Does_Not_Contain_QueryString_When_Flag_Is_False()
        {
            // Arrange
            var httpContext = new Mock <HttpContextBase>();

            httpContext.Setup(c => c.Request.Path).Returns("/foo");
            httpContext.Setup(c => c.Request.AppRelativeCurrentExecutionFilePath).Returns("~/foo");
            httpContext.Setup(c => c.Request.ApplicationPath).Returns("/");
            var query = "?bar=baz";

            httpContext.Setup(c => c.Request.QueryString).Returns(HttpUtility.ParseQueryString(query));
            var requestContext = new RequestContext(httpContext.Object, new RouteData());

            var sourceRouteMock = new Mock <RouteBase>();

            sourceRouteMock.Setup(r => r.GetVirtualPath(It.IsAny <RequestContext>(), It.IsAny <RouteValueDictionary>())).Returns(new VirtualPathData(sourceRouteMock.Object, "/foo"));
            var targetRoute = new Mock <RouteBase>();

            targetRoute.Setup(r => r.GetVirtualPath(It.IsAny <RequestContext>(), It.IsAny <RouteValueDictionary>())).Returns(new VirtualPathData(sourceRouteMock.Object, "/bar"));
            var redirectRoute = new RedirectRoute(sourceRouteMock.Object, targetRoute.Object, permanent: true);

            redirectRoute.IncludeQueryStringInRedirect = false;

            // Act
            var handler = redirectRoute.GetHttpHandler(requestContext);

            // Assert
            Assert.IsType(typeof(RedirectHttpHandler), handler);
            PAssert.IsTrue(() => !((RedirectHttpHandler)handler).TargetUrl.EndsWith(query));
        }
コード例 #4
0
        public void To_WithNullTargetRoute_ThrowsException()
        {
            // Arrange
            var redirectRoute = new RedirectRoute(new Mock <RouteBase>().Object, null, false);

            // Act, Assert
            Assert.Throws <ArgumentNullException>(() => redirectRoute.To(null));
        }
コード例 #5
0
        public void To_WhenAdditionalRouteValuesAlreadySet_ThrowsException()
        {
            // Arrange
            var redirectRoute = new RedirectRoute(new Mock <RouteBase>().Object, null, false, new RouteValueDictionary());

            // Act, Assert
            Assert.Throws <InvalidOperationException>(() => redirectRoute.To(new Mock <RouteBase>().Object));
        }
コード例 #6
0
        public void To_WhenTargetRouteIsAlreadySet_ThrowsException()
        {
            // Arrange
            var redirectRoute = new RedirectRoute(new Mock <RouteBase>().Object, new Mock <RouteBase>().Object, false);

            // Act, Assert
            Assert.Throws <InvalidOperationException>(() => redirectRoute.To(new Mock <RouteBase>().Object));
        }
コード例 #7
0
        public void To_WithTargetRoute_SetsTargetRoute()
        {
            // Arrange
            var sourceRoute   = new Mock <RouteBase>().Object;
            var targetRoute   = new Mock <RouteBase>().Object;
            var redirectRoute = new RedirectRoute(sourceRoute, null, false);

            // Act
            redirectRoute.To(targetRoute);

            // Assert
            PAssert.IsTrue(() => redirectRoute.TargetRoute == targetRoute);
        }
コード例 #8
0
        public static string BuildLocation(RedirectRoute redirect, RouteData routeData)
        {
            Guard.Null(nameof(redirect), redirect);
            Guard.Null(nameof(routeData), routeData);

            var location = redirect.Location;

            foreach (var kvp in routeData.Values)
            {
                var key   = kvp.Key;
                var value = kvp.Value;

                location = location.Replace($"{{{key}}}", value !.ToString());
            }

            return(location);
        }
コード例 #9
0
        public void GetRouteData_WithNonMatchingSourceRoute_ReturnsNull()
        {
            // Arrange
            var sourceRouteMock = new Mock <RouteBase>();
            var targetRoute     = new Mock <RouteBase>().Object;

            sourceRouteMock.Setup(r => r.GetRouteData(It.IsAny <HttpContextBase>())).Returns((RouteData)null);
            var redirectRoute = new RedirectRoute(sourceRouteMock.Object, targetRoute, permanent: true);

            // Act
            var routeData = redirectRoute.GetRouteData(new Mock <HttpContextBase>().Object);

            // Assert
            PAssert.IsTrue(() => routeData == null);
            // These next few asserts are "laziness" asserts.
            PAssert.IsTrue(() => redirectRoute.Permanent == true);
            PAssert.IsTrue(() => redirectRoute.SourceRoute == sourceRouteMock.Object);
            PAssert.IsTrue(() => redirectRoute.TargetRoute == targetRoute);
        }
コード例 #10
0
        // We always want to map the RedirectRoute *BEFORE* the legacy route that we're going to redirect.
        // Otherwise the redirect route will never match because the legacy route will supersede it.
        // Hence the Func<RouteCollection, RouteBase>.
        public static RedirectRoute Redirect(this RouteCollection routes, Func <RouteCollection, RouteBase> routeMapping, bool permanent = false)
        {
            if (routes == null)
            {
                throw new ArgumentNullException("routes");
            }
            if (routeMapping == null)
            {
                throw new ArgumentNullException("routeMapping");
            }

            var routeCollection = new RouteCollection();
            var legacyRoute     = routeMapping(routeCollection);

            var redirectRoute = new RedirectRoute(legacyRoute, null, permanent, null);

            routes.Add(new NormalizeRoute(redirectRoute));
            return(redirectRoute);
        }
コード例 #11
0
        public void GetHttpHandler_WithTargetRoute_ButRequestDoesNotMatchTargetRouteReturnsDelegateHttpHandler()
        {
            // Arrange
            var httpContext = new Mock <HttpContextBase>();

            httpContext.Setup(c => c.Request.Path).Returns("/qux");
            httpContext.Setup(c => c.Request.AppRelativeCurrentExecutionFilePath).Returns("~/qux");
            httpContext.Setup(c => c.Request.ApplicationPath).Returns("/");
            httpContext.Setup(c => c.Response.ApplyAppPathModifier(It.IsAny <string>())).Returns <string>(s => s);
            var routeData            = new RouteData();
            var requestContext       = new RequestContext(httpContext.Object, new RouteData());
            var targetRoute          = new Route("foo/{bar}", null);
            var redirectRouteHandler = new RedirectRoute(null, targetRoute, permanent: false, additionalRouteValues: null);

            // Act
            var httpHandler = redirectRouteHandler.GetHttpHandler(requestContext) as DelegateHttpHandler;

            // Assert
            PAssert.IsTrue(() => httpHandler != null);
        }
コード例 #12
0
        public void GetRouteData_WithMatchingSourceRoute_SwapsRouteHandler()
        {
            // Arrange
            var routeData    = new RouteData();
            var routeHandler = new Mock <IRouteHandler>().Object;

            routeData.RouteHandler = routeHandler;
            var sourceRouteMock = new Mock <RouteBase>();

            sourceRouteMock.Setup(r => r.GetRouteData(It.IsAny <HttpContextBase>())).Returns(routeData);
            var redirectRoute = new RedirectRoute(sourceRouteMock.Object, new Mock <RouteBase>().Object, permanent: false);

            // Act
            var redirectRouteData = redirectRoute.GetRouteData(new Mock <HttpContextBase>().Object);

            // Assert
            PAssert.IsTrue(() => redirectRouteData.RouteHandler != routeHandler);
            PAssert.IsTrue(() => redirectRouteData.RouteHandler is RedirectRoute);
            PAssert.IsTrue(() => redirectRouteData == routeData);
            PAssert.IsTrue(() => redirectRoute.Permanent == false);
        }
コード例 #13
0
        public void GetHttpHandler_OnRedirectionActionIsCalled()
        {
            // Arrange
            var onRedirectCalled = false;
            Action <RequestContext, RedirectRoute> onRedirection = (context, route) => onRedirectCalled = true;

            var httpContext = new Mock <HttpContextBase>();

            httpContext.Setup(c => c.Request.Path).Returns("/foo");
            httpContext.Setup(c => c.Request.AppRelativeCurrentExecutionFilePath).Returns("~/foo");
            httpContext.Setup(c => c.Request.ApplicationPath).Returns("/");
            var requestContext = new RequestContext(httpContext.Object, new RouteData());

            var redirectRoute = new RedirectRoute(new Mock <RouteBase>().Object, new Mock <RouteBase>().Object, false, null, onRedirection);

            // Act
            redirectRoute.GetHttpHandler(requestContext);

            // Assert
            PAssert.IsTrue(() => onRedirectCalled);
        }
コード例 #14
0
        public void GetVirtualPath_WithMatchingRequest_AlwaysReturnsNull()
        {
            // Arrange
            var httpContext = new Mock <HttpContextBase>();

            httpContext.Setup(c => c.Request.Path).Returns("/foo");
            httpContext.Setup(c => c.Request.AppRelativeCurrentExecutionFilePath).Returns("~/foo");
            httpContext.Setup(c => c.Request.ApplicationPath).Returns("/");
            var requestContext = new RequestContext(httpContext.Object, new RouteData());

            var sourceRouteMock = new Mock <RouteBase>();

            sourceRouteMock.Setup(r => r.GetVirtualPath(It.IsAny <RequestContext>(), It.IsAny <RouteValueDictionary>())).Returns(new VirtualPathData(sourceRouteMock.Object, "/foo"));
            var targetRoute   = new Mock <RouteBase>().Object;
            var redirectRoute = new RedirectRoute(sourceRouteMock.Object, targetRoute, permanent: true);

            // Act
            var virtualPath = redirectRoute.GetVirtualPath(requestContext, new RouteValueDictionary());

            // Assert
            PAssert.IsTrue(() => virtualPath == null);
        }
コード例 #15
0
        public void GetHttpHandler_WithTargetRoute_ReturnsHandlerFromTargetRoute()
        {
            // Arrange
            var httpContext = new Mock <HttpContextBase>();

            httpContext.Setup(c => c.Request.Path).Returns("/qux");
            httpContext.Setup(c => c.Request.AppRelativeCurrentExecutionFilePath).Returns("~/qux");
            httpContext.Setup(c => c.Request.ApplicationPath).Returns("/");
            httpContext.Setup(c => c.Response.ApplyAppPathModifier(It.IsAny <string>())).Returns <string>(s => s);
            var routeData = new RouteData();

            routeData.Values.Add("bar", "the-value-of-bar");
            var requestContext       = new RequestContext(httpContext.Object, routeData);
            var targetRoute          = new Route("foo/{bar}", null);
            var redirectRouteHandler = new RedirectRoute(null, targetRoute, permanent: false, additionalRouteValues: null);

            // Act
            var httpHandler = redirectRouteHandler.GetHttpHandler(requestContext) as RedirectHttpHandler;

            // Assert
            PAssert.IsTrue(() => httpHandler.IsReusable == false);
            PAssert.IsTrue(() => httpHandler.TargetUrl == "~/foo/the-value-of-bar");
            PAssert.IsTrue(() => httpHandler.Permanent == false);
        }
コード例 #16
0
        public ActionResult NewRoute()
        {
            var vm = new RedirectRoute();

            return(PartialView(vm));
        }