public void Then_Any_Unmatched_Query_Params_Are_Removed_From_The_Url()
        {
            var context = new DefaultHttpContext();

            context.Request.QueryString = new QueryString("?ukprn=1001&standardCode=2&Postcode=");
            context.Request.Path        = new PathString("/Provider/Detail");
            context.Request.Host        = new HostString("local");

            var mockHttpContextAccessor = new Mock <IHttpContextAccessor>();

            mockHttpContextAccessor.Setup(_ => _.HttpContext).Returns(context);

            var rewriteContext = new RewriteContext
            {
                HttpContext = mockHttpContextAccessor.Object.HttpContext
            };

            var actual = new PathWithQueryRule("(?i)provider/detail\\b", "/courses/$0/providers/$1?location=$2&DeliveryModes=$3", new List <string> {
                "standardCode", "ukprn", "postcode", "deliverymodes"
            });

            actual.ApplyRule(rewriteContext);

            rewriteContext.HttpContext.Response.StatusCode.Should().Be((int)HttpStatusCode.PermanentRedirect);
            rewriteContext.HttpContext.Response.Headers[HeaderNames.Location].Should().BeEquivalentTo("/courses/2/providers/1001?location=&DeliveryModes=");
        }
        public void Then_If_The_Request_Does_Not_Match_The_Regex_Pattern_No_Action_Is_Taken()
        {
            //Arrange
            var actual = new PathWithQueryRule("courses", "/courses", new List <string>());

            //Act
            actual.ApplyRule(_rewriteContext);

            //Assert
            _rewriteContext.HttpContext.Response.StatusCode.Should().Be((int)HttpStatusCode.OK);
        }
        public void Then_If_The_Request_Matches_The_Regex_Pattern_Then_The_Request_Is_Redirected()
        {
            //Arrange
            var actual = new PathWithQueryRule("(?i)provider/detail\\b", "/courses", new List <string>());

            //Act
            actual.ApplyRule(_rewriteContext);

            //Assert
            _rewriteContext.HttpContext.Response.StatusCode.Should().Be((int)HttpStatusCode.PermanentRedirect);
            _rewriteContext.HttpContext.Response.Headers[HeaderNames.Location].Should().BeEquivalentTo("/courses");
        }
        public void Then_If_There_Are_Query_Params_These_Are_Matched()
        {
            //Arrange
            var actual = new PathWithQueryRule("(?i)provider/detail\\b", "/courses/$0/providers/$1?location=$2", new List <string> {
                "standardCode", "ukprn", "postcode"
            });

            //Act
            actual.ApplyRule(_rewriteContext);

            //Assert
            _rewriteContext.HttpContext.Response.StatusCode.Should().Be((int)HttpStatusCode.PermanentRedirect);
            _rewriteContext.HttpContext.Response.Headers[HeaderNames.Location].Should().BeEquivalentTo("/courses/2/providers/1001?location=coventry");
        }
        public void Then_If_The_Request_Is_The_Same_As_The_Replacement_No_Action_Is_Taken()
        {
            var context = new DefaultHttpContext();

            context.Request.Path = new PathString("/courses");
            context.Request.Host = new HostString("local");

            var mockHttpContextAccessor = new Mock <IHttpContextAccessor>();

            mockHttpContextAccessor.Setup(_ => _.HttpContext).Returns(context);

            var rewriteContext = new RewriteContext
            {
                HttpContext = mockHttpContextAccessor.Object.HttpContext
            };

            var actual = new PathWithQueryRule("courses", "/courses", new List <string>());

            actual.ApplyRule(rewriteContext);

            rewriteContext.HttpContext.Response.StatusCode.Should().Be((int)HttpStatusCode.OK);
        }