public void BuildWebConfigReplaceRedirectTypeWithHost()
        {
            var configuration     = TestData.TestData.DefaultConfiguration;
            var urlParser         = new UrlParser();
            var webConfigExporter = new WebConfigExporter(
                configuration,
                urlParser,
                new UrlFormatter());

            var redirects = new[]
            {
                new Redirect
                {
                    OldUrl         = "http://www.test.local/url1",
                    NewUrl         = "http://www.test.local/url2",
                    OldUrlHasHost  = true,
                    NewUrlHasHost  = true,
                    ParsedOldUrl   = "http://www.test.local/url1",
                    ParsedNewUrl   = "http://www.test.local/url2",
                    OriginalOldUrl = "http://www.test.local/url1",
                    OriginalNewUrl = "http://www.test.local/url2",
                    RedirectType   = RedirectType.Replace
                }
            };

            var webConfig = webConfigExporter.Build(
                redirects);

            // verify web config rewrite rules
            Assert.IsNotNull(webConfig);
            var webConfigLines = webConfig
                                 .Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries)
                                 .Select(x => x.Trim())
                                 .ToList();

            Assert.AreNotEqual(
                0,
                webConfigLines.Count);
            Assert.AreEqual(
                1,
                webConfigLines.Count(x => x.Contains("<rule name=")));
            Assert.AreEqual(
                1,
                webConfigLines.Count(x => x.Contains("<match url=\"^url1(.+)?/?$\" />")));
            Assert.AreEqual(
                1,
                webConfigLines.Count(x => x.Contains("<action type=\"Redirect\" url=\"http://www.test.local/url2{R:1}\" redirectType=\"Permanent\" appendQueryString=\"False\" />")));
            Assert.AreEqual(
                1,
                webConfigLines.Count(x => x.Contains("<conditions>")));
            Assert.AreEqual(
                1,
                webConfigLines.Count(x => x.Contains("<add input=\"{HTTP_HOST}\" pattern=\"^www.test.local$\" />")));

            // verify web config doesn't have rewrite maps
            Assert.AreEqual(
                0,
                webConfigLines.Count(x => x.Contains("<rewriteMap name=")));
        }
        public void BuildWebConfigReplaceRedirectTypeWithMultipleQueryStringsInRewriteMap()
        {
            var configuration     = TestData.TestData.DefaultConfiguration;
            var urlParser         = new UrlParser();
            var webConfigExporter = new WebConfigExporter(
                configuration,
                urlParser,
                new UrlFormatter());

            var redirects = new[]
            {
                new Redirect
                {
                    OldUrl         = "http://www.test.local/old1/old2",
                    NewUrl         = "http://www.test.local/",
                    OldUrlHasHost  = false,
                    NewUrlHasHost  = false,
                    ParsedOldUrl   = "http://www.test.local/old1/old2",
                    ParsedNewUrl   = "http://www.test.local/",
                    OriginalOldUrl = "/old1/old2",
                    OriginalNewUrl = "/",
                    RedirectType   = RedirectType.Replace
                },
                new Redirect
                {
                    OldUrl         = "http://www.test.local/old1/old2?query=first",
                    NewUrl         = "http://www.test.local/new1",
                    OldUrlHasHost  = false,
                    NewUrlHasHost  = false,
                    ParsedOldUrl   = "http://www.test.local/old1/old2?query=first",
                    ParsedNewUrl   = "http://www.test.local/new1",
                    OriginalOldUrl = "/old1/old2?query=first",
                    OriginalNewUrl = "/new1",
                    RedirectType   = RedirectType.Replace
                },
                new Redirect
                {
                    OldUrl         = "http://www.test.local/old1/old2?query=second",
                    NewUrl         = "http://www.test.local/new2",
                    OldUrlHasHost  = false,
                    NewUrlHasHost  = false,
                    ParsedOldUrl   = "http://www.test.local/old1/old2?query=second",
                    ParsedNewUrl   = "http://www.test.local/new2",
                    OriginalOldUrl = "/old1/old2?query=second",
                    OriginalNewUrl = "/new2",
                    RedirectType   = RedirectType.Replace
                }
            };

            var webConfig = webConfigExporter.Build(
                redirects);

            // verify web config rewrite rules
            Assert.IsNotNull(webConfig);
            var webConfigLines = webConfig
                                 .Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries)
                                 .Select(x => x.Trim())
                                 .ToList();

            Assert.AreNotEqual(
                0,
                webConfigLines.Count);
            Assert.AreEqual(
                2,
                webConfigLines.Count(x => x.Contains("<rule name=")));
            Assert.AreEqual(
                1,
                webConfigLines.Count(x => x.Contains("<match url=\"^old1/old2/?$\" />")));
            Assert.AreEqual(
                1,
                webConfigLines.Count(x => x.Contains("<match url=\"^old1/old2(.+)?/?$\" />")));
            Assert.AreEqual(
                1,
                webConfigLines.Count(x => x.Contains("<action type=\"Redirect\" url=\"{C:1}\" redirectType=\"Permanent\" appendQueryString=\"False\" />")));
            Assert.AreEqual(
                1,
                webConfigLines.Count(x => x.Contains("<action type=\"Redirect\" url=\"/{R:1}\" redirectType=\"Permanent\" appendQueryString=\"False\" />")));
            Assert.AreEqual(
                1,
                webConfigLines.Count(x => Regex.IsMatch(x, "<add input=\"{[^{}:]+:{QUERY_STRING}}\" pattern=\"\\(.+\\)\" />", RegexOptions.IgnoreCase)));
            Assert.AreEqual(
                0,
                webConfigLines.Count(x => x.Contains("<add input=\"{HTTP_HOST}\" pattern=\"^www.test.local$\" />")));

            // verify web config rewrite maps
            Assert.AreEqual(
                1,
                webConfigLines.Count(x => x.Contains("<rewriteMap name=")));
            Assert.AreEqual(
                1,
                webConfigLines.Count(x => x.Contains("<add key=\"query=first\" value=\"/new1\" />")));
            Assert.AreEqual(
                1,
                webConfigLines.Count(x => x.Contains("<add key=\"query=second\" value=\"/new2\" />")));
        }
        public void BuildWebConfigReplaceRedirectTypeWith2SegmentsAndRewriteMaps()
        {
            var configuration     = TestData.TestData.DefaultConfiguration;
            var urlParser         = new UrlParser();
            var webConfigExporter = new WebConfigExporter(
                configuration,
                urlParser,
                new UrlFormatter());

            var redirects = new[]
            {
                new Redirect
                {
                    OldUrl         = "http://www.test.local/old1/old2",
                    NewUrl         = "http://www.test.local/new1/new2",
                    OldUrlHasHost  = false,
                    NewUrlHasHost  = false,
                    ParsedOldUrl   = "http://www.test.local/old1/old2",
                    ParsedNewUrl   = "http://www.test.local/new1/new2",
                    OriginalOldUrl = "http://www.test.local/old1/old2",
                    OriginalNewUrl = "http://www.test.local/new1/new2",
                    RedirectType   = RedirectType.Replace
                },
                new Redirect
                {
                    OldUrl         = "http://www.test.local/one1/one2",
                    NewUrl         = "http://www.test.local/two1/two2",
                    OldUrlHasHost  = false,
                    NewUrlHasHost  = false,
                    ParsedOldUrl   = "http://www.test.local/one1/one2",
                    ParsedNewUrl   = "http://www.test.local/two1/two2",
                    OriginalOldUrl = "/one1/one2",
                    OriginalNewUrl = "/two1/two2",
                    RedirectType   = RedirectType.Replace
                }
            };

            var webConfig = webConfigExporter.Build(
                redirects);

            // verify web config rewrite rules
            Assert.IsNotNull(webConfig);
            var webConfigLines = webConfig
                                 .Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries)
                                 .Select(x => x.Trim())
                                 .ToList();

            Assert.AreNotEqual(
                0,
                webConfigLines.Count);
            Assert.AreEqual(
                1,
                webConfigLines.Count(x => x.Contains("<rule name=")));
            Assert.AreEqual(
                1,
                webConfigLines.Count(x => x.Contains("<match url=\"^([^/]+/[^/]+)(.+)?/?$\" />")));
            Assert.AreEqual(
                1,
                webConfigLines.Count(x => x.Contains("<action type=\"Redirect\" url=\"{C:1}{R:2}\" redirectType=\"Permanent\" appendQueryString=\"False\" />")));
            Assert.AreEqual(
                0,
                webConfigLines.Count(x => x.Contains("<add input=\"{HTTP_HOST}\" pattern=\"^www.test.local$\" />")));

            // verify web config rewrite maps
            Assert.AreEqual(
                1,
                webConfigLines.Count(x => x.Contains("<rewriteMap name=")));
            Assert.AreEqual(
                1,
                webConfigLines.Count(x => x.Contains("<add key=\"old1/old2\" value=\"/new1/new2\" />")));
            Assert.AreEqual(
                1,
                webConfigLines.Count(x => x.Contains("<add key=\"one1/one2\" value=\"/two1/two2\" />")));
        }