public void CorrectlyProcessUrlSections(string url, string expectedSection)
        {
            var collector = new UrlSections();

            var logEntry = new Mock <ILogEntry>();

            logEntry.SetupGet(l => l.Request.Uri).Returns(new Uri(url, UriKind.RelativeOrAbsolute));

            Assert.IsTrue(collector.Process(logEntry.Object));

            var urlSections = collector.ToList();

            Assert.AreEqual(1, urlSections.Count);
            Assert.AreEqual(expectedSection, urlSections.First().SectionPath);
        }
        public void CorrectlyCountSectionsAndSortsInDescendingOrder()
        {
            var requestUrls = new string[]
            {
                "/endpoint1/test",
                "/endpoint2/test",
                "/endpoint2/test",
                "/api",
                "/",
                "/",
                "/data",
                "/endpoint2/test",
                "/api",
                "/api/items",
                "/api/",
                "/endpoint2/test",
                "/endpoint2/test",
                "/",
                "/data",
                "/users/test",
                "/endpoint2",
                "/endpoint2/test2",
                "/",
                "/api/posts",
                "/api/items",
                "/api/user/12/posts",
                "/api/user/12/posts",
                "/api",
                "/api/",
                "/endpoint1/test",
                "/api/items",
                "/data",
                "/api",
                "/api/",
                "/api/posts",
                "/api/user/12/posts?q=abc",
                "/data",
                "/api/posts",
                "/endpoint2/test",
                "/",
                "/api/",
                "/api/items",
                "/data",
                "/data",
                "/api/user/12/posts?q=abc",
                "/api/",
                "/data",
                "/api/user/12/posts?q=abc",
                "/endpoint2/test",
                "/",
                "/endpoint1/test",
                "/users/test",
                "/api/",
                "/api/items",
                "/api"
            };

            var expectedResults = new[]
            {
                new { Section = "/api", HitCount = 24 },
                new { Section = "/endpoint2", HitCount = 9 },
                new { Section = "/data", HitCount = 7 },
                new { Section = "/", HitCount = 6 },
                new { Section = "/endpoint1", HitCount = 3 },
                new { Section = "/users", HitCount = 2 }
            };

            var collector = new UrlSections();

            // test
            foreach (var url in requestUrls)
            {
                var logEntry = new Mock <ILogEntry>();
                logEntry.SetupGet(l => l.Request.Uri).Returns(new Uri(url, UriKind.RelativeOrAbsolute));

                collector.Process(logEntry.Object);
            }

            // validate
            var urlSections = collector.ToList();

            Assert.AreEqual(expectedResults.Length, urlSections.Count);

            for (var i = 0; i < urlSections.Count; i++)
            {
                var urlSection     = urlSections[i];
                var expectedResult = expectedResults[i];

                Assert.AreEqual(expectedResult.Section, urlSection.SectionPath);
                Assert.AreEqual(expectedResult.HitCount, urlSection.HitCount);
            }
        }