diff --git a/src/SimpleSitemap/SitemapNode.cs b/src/SimpleSitemap/SitemapNode.cs index 3519504..707fc16 100644 --- a/src/SimpleSitemap/SitemapNode.cs +++ b/src/SimpleSitemap/SitemapNode.cs @@ -7,18 +7,25 @@ public class SitemapNode public SitemapNode(Uri url, DateTime lastModified, SitemapFrequency? frequency = SitemapFrequency.Daily, - double? priority = 0.5) + double? priority = 0.5, + bool appendPageQueryParam = true) { Url = url; Priority = priority; Frequency = frequency; LastModified = lastModified; + AppendPageQueryParam = appendPageQueryParam; } - public Uri Url { get; set; } - public DateTimeOffset LastModified { get; set; } - public SitemapFrequency? Frequency { get; set; } - public double? Priority { get; set; } + public Uri Url { get; } + + public DateTimeOffset LastModified { get; } + + public SitemapFrequency? Frequency { get; } + + public double? Priority { get; } + + public bool AppendPageQueryParam { get; } public override string ToString() { diff --git a/src/SimpleSitemap/SitemapService.cs b/src/SimpleSitemap/SitemapService.cs index c80c283..b6c3a4f 100644 --- a/src/SimpleSitemap/SitemapService.cs +++ b/src/SimpleSitemap/SitemapService.cs @@ -70,9 +70,10 @@ private static XElement CreateXmlSitemapIndex(ICollection sitemapNo var page = 0; foreach (var sitemapNode in sitemapNodes) { - var loc = new XElement(xmlns + "loc", - Uri.EscapeUriString(string.Format("{0}/?page={1}", sitemapNode.Url, ++page))); - + page++; + + var loc = GenerateLocXElement(sitemapNode, page, sitemapNode.AppendPageQueryParam); + var lastMod = new XElement(xmlns + "lastmod", sitemapNode.LastModified.ToString("yyyy-MM-ddTHH:mm:sszzz", CultureInfo.InvariantCulture)); @@ -81,6 +82,18 @@ private static XElement CreateXmlSitemapIndex(ICollection sitemapNo } return root; + + XElement GenerateLocXElement(SitemapNode sitemapNode, int page, bool appendPageQueryParam) + { + var uriString = sitemapNode.Url.ToString(); + + if (appendPageQueryParam) + { + uriString = $"{uriString}/?page={page}"; + } + + return new XElement(xmlns + "loc", uriString); + } } private static XElement CreateXmlUrlSet(IEnumerable sitemapNodes) diff --git a/tests/SimpleSiteMap.Tests/ConvertToSiteMapTests.cs b/tests/SimpleSiteMap.Tests/ConvertToSiteMapTests.cs index 1faedcb..48206c9 100644 --- a/tests/SimpleSiteMap.Tests/ConvertToSiteMapTests.cs +++ b/tests/SimpleSiteMap.Tests/ConvertToSiteMapTests.cs @@ -9,33 +9,48 @@ namespace SimpleSiteMap.Tests { public class ConvertToSiteMapTests { + private static readonly DateTime StartDate = DateTime.SpecifyKind(new DateTime(2014, 11, 21, 18, 58, 00), DateTimeKind.Utc); + + private static readonly SitemapService SitemapService = new SitemapService(); + [Fact] public void GivenDataWith10Items_ConvertToSiteMap_CreatesASitemapResult() { // Arrange. - var startDate = DateTime.SpecifyKind(new DateTime(2014, 11, 21, 18, 58, 00), DateTimeKind.Utc); - var data = SimpleSiteMapHelpers.CreateFakeSitemapNodes(100, startDate).ToPartition(10); - var siteMapService = new SitemapService(); + var data = SimpleSiteMapHelpers.CreateFakeSitemapNodes(100, StartDate).ToPartition(10); // Act. - var result = siteMapService.ConvertToXmlSitemap(data); + var result = SitemapService.ConvertToXmlSitemap(data); // Assert. var expectedXml = File.ReadAllText("Result Data//SitemapWith10Items.xml"); CompareTwoSitemapDocuments(result, expectedXml); } + + [Fact] + public void GivenDataWith1Item_ConvertToSiteMap_WithAppendPageParamQueryDisabled_CreatesASitemapResult() + { + // Act. + var data = SimpleSiteMapHelpers.CreateFakeSitemapNodes(1, StartDate, pageParamQuery: false).ToPartition(10); + + // Act. + var result = SitemapService.ConvertToXmlSitemap(data); + + // Assert. + var expectedXml = File.ReadAllText("Result Data//SitemapWithNoPageQueryParam.xml"); + + CompareTwoSitemapDocuments(result, expectedXml); + } [Fact] public void GivenNoPartitionedData_ConvertToSitemap_CreatesASitemapResult() { - // Arrange.r - var startDate = DateTime.SpecifyKind(new DateTime(2014, 11, 21, 18, 58, 00), DateTimeKind.Utc); - var partitionedData = SimpleSiteMapHelpers.CreateFakeSitemapNodes(0, startDate); - var siteMapService = new SitemapService(); + // Arrange. + var partitionedData = SimpleSiteMapHelpers.CreateFakeSitemapNodes(0, StartDate); // Act. - var result = siteMapService.ConvertToXmlSitemap(partitionedData); + var result = SitemapService.ConvertToXmlSitemap(partitionedData); // Assert. var expectedXml = File.ReadAllText("Result Data//SitemapWith0Items.xml"); @@ -60,12 +75,12 @@ private static void CompareTwoSitemapDocuments(string actualXml, string expected .Count() .ShouldBe(actualXmlDocument.DescendantNodes().Count()); - var actuaElements = actualXmlDocument.Root.Elements().ToList(); + var actualElements = actualXmlDocument.Root.Elements().ToList(); var expectedElements = expectedXmlDocument.Root.Elements().ToList(); - for (int i = 0; i < actuaElements.Count; i++) + for (int i = 0; i < actualElements.Count; i++) { - var actualChildrenElements = actuaElements[i].Elements().ToList(); + var actualChildrenElements = actualElements[i].Elements().ToList(); var expectedChildrenElements = expectedElements[i].Elements().ToList(); // loc. diff --git a/tests/SimpleSiteMap.Tests/Result Data/SitemapWithNoPageQueryParam.xml b/tests/SimpleSiteMap.Tests/Result Data/SitemapWithNoPageQueryParam.xml new file mode 100644 index 0000000..a9bf70b --- /dev/null +++ b/tests/SimpleSiteMap.Tests/Result Data/SitemapWithNoPageQueryParam.xml @@ -0,0 +1,7 @@ + + + + http://www.foo.com/sitemap/foos + 2014-11-21T18:58:00+00:00 + + \ No newline at end of file diff --git a/tests/SimpleSiteMap.Tests/SimpleSiteMap.Tests.csproj b/tests/SimpleSiteMap.Tests/SimpleSiteMap.Tests.csproj index 1f7ee35..b1f28d8 100644 --- a/tests/SimpleSiteMap.Tests/SimpleSiteMap.Tests.csproj +++ b/tests/SimpleSiteMap.Tests/SimpleSiteMap.Tests.csproj @@ -41,6 +41,9 @@ PreserveNewest + + PreserveNewest + diff --git a/tests/SimpleSiteMap.Tests/SimpleSiteMapHelpers.cs b/tests/SimpleSiteMap.Tests/SimpleSiteMapHelpers.cs index 57e3c23..7ba8036 100644 --- a/tests/SimpleSiteMap.Tests/SimpleSiteMapHelpers.cs +++ b/tests/SimpleSiteMap.Tests/SimpleSiteMapHelpers.cs @@ -8,7 +8,8 @@ internal static class SimpleSiteMapHelpers internal static IList CreateFakeSitemapNodes(int numberOfNodes, DateTime startTime, SitemapFrequency? frequency = SitemapFrequency.Daily, - double? priority = 0.5) + double? priority = 0.5, + bool pageParamQuery = true) { var result = new List(); @@ -16,7 +17,10 @@ internal static IList CreateFakeSitemapNodes(int numberOfNodes, { result.Add(new SitemapNode( new Uri("http://www.foo.com/sitemap/foos"), - startTime.AddSeconds(-i), frequency, priority)); + startTime.AddSeconds(-i), + frequency, + priority, + pageParamQuery)); } return result;