summaryrefslogtreecommitdiff
path: root/tests/sitemaps_tests
diff options
context:
space:
mode:
authorFlorian Demmer <fdemmer@gmail.com>2020-07-29 10:33:20 +0200
committerCarlton Gibson <carlton@noumenal.es>2020-07-29 11:48:29 +0200
commit16218c20606d8cd89c5393970c83da04598a3e04 (patch)
treec1b968f621c4b948a80917c6fe3fcc93ec1dcad5 /tests/sitemaps_tests
parent50e1ccbbea4c6f8e14a186149dd757483f0f0da5 (diff)
Fixed #27395 -- Added sitemap 'alternates' generation.
Updated the sitemap generator and default template to optionally include link elements with hreflang attribute to alternate language URLs.
Diffstat (limited to 'tests/sitemaps_tests')
-rw-r--r--tests/sitemaps_tests/test_http.py80
-rw-r--r--tests/sitemaps_tests/urls/http.py46
2 files changed, 119 insertions, 7 deletions
diff --git a/tests/sitemaps_tests/test_http.py b/tests/sitemaps_tests/test_http.py
index 3d4e1d84dc..3281774cc5 100644
--- a/tests/sitemaps_tests/test_http.py
+++ b/tests/sitemaps_tests/test_http.py
@@ -253,8 +253,10 @@ class HTTPSitemapTests(SitemapTestsBase):
self.assertEqual(response.status_code, 200)
@override_settings(LANGUAGES=(('en', 'English'), ('pt', 'Portuguese')))
- def test_simple_i18nsitemap_index(self):
- "A simple i18n sitemap index can be rendered"
+ def test_simple_i18n_sitemap_index(self):
+ """
+ A simple i18n sitemap index can be rendered.
+ """
response = self.client.get('/simple/i18n.xml')
expected_content = """<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">
@@ -263,6 +265,80 @@ class HTTPSitemapTests(SitemapTestsBase):
""".format(self.base_url, self.i18n_model.pk)
self.assertXMLEqual(response.content.decode(), expected_content)
+ @override_settings(LANGUAGES=(('en', 'English'), ('pt', 'Portuguese')))
+ def test_alternate_i18n_sitemap_index(self):
+ """
+ A i18n sitemap with alternate/hreflang links can be rendered.
+ """
+ response = self.client.get('/alternates/i18n.xml')
+ url, pk = self.base_url, self.i18n_model.pk
+ expected_urls = f"""
+<url><loc>{url}/en/i18n/testmodel/{pk}/</loc><changefreq>never</changefreq><priority>0.5</priority>
+<xhtml:link rel="alternate" hreflang="en" href="{url}/en/i18n/testmodel/{pk}/"/>
+<xhtml:link rel="alternate" hreflang="pt" href="{url}/pt/i18n/testmodel/{pk}/"/>
+</url>
+<url><loc>{url}/pt/i18n/testmodel/{pk}/</loc><changefreq>never</changefreq><priority>0.5</priority>
+<xhtml:link rel="alternate" hreflang="en" href="{url}/en/i18n/testmodel/{pk}/"/>
+<xhtml:link rel="alternate" hreflang="pt" href="{url}/pt/i18n/testmodel/{pk}/"/>
+</url>
+""".replace('\n', '')
+ expected_content = f"""<?xml version="1.0" encoding="UTF-8"?>
+<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">
+{expected_urls}
+</urlset>
+"""
+ self.assertXMLEqual(response.content.decode(), expected_content)
+
+ @override_settings(LANGUAGES=(('en', 'English'), ('pt', 'Portuguese'), ('es', 'Spanish')))
+ def test_alternate_i18n_sitemap_limited(self):
+ """
+ A i18n sitemap index with limited languages can be rendered.
+ """
+ response = self.client.get('/limited/i18n.xml')
+ url, pk = self.base_url, self.i18n_model.pk
+ expected_urls = f"""
+<url><loc>{url}/en/i18n/testmodel/{pk}/</loc><changefreq>never</changefreq><priority>0.5</priority>
+<xhtml:link rel="alternate" hreflang="en" href="{url}/en/i18n/testmodel/{pk}/"/>
+<xhtml:link rel="alternate" hreflang="es" href="{url}/es/i18n/testmodel/{pk}/"/>
+</url>
+<url><loc>{url}/es/i18n/testmodel/{pk}/</loc><changefreq>never</changefreq><priority>0.5</priority>
+<xhtml:link rel="alternate" hreflang="en" href="{url}/en/i18n/testmodel/{pk}/"/>
+<xhtml:link rel="alternate" hreflang="es" href="{url}/es/i18n/testmodel/{pk}/"/>
+</url>
+""".replace('\n', '')
+ expected_content = f"""<?xml version="1.0" encoding="UTF-8"?>
+<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">
+{expected_urls}
+</urlset>
+"""
+ self.assertXMLEqual(response.content.decode(), expected_content)
+
+ @override_settings(LANGUAGES=(('en', 'English'), ('pt', 'Portuguese')))
+ def test_alternate_i18n_sitemap_xdefault(self):
+ """
+ A i18n sitemap index with x-default can be rendered.
+ """
+ response = self.client.get('/x-default/i18n.xml')
+ url, pk = self.base_url, self.i18n_model.pk
+ expected_urls = f"""
+<url><loc>{url}/en/i18n/testmodel/{pk}/</loc><changefreq>never</changefreq><priority>0.5</priority>
+<xhtml:link rel="alternate" hreflang="en" href="{url}/en/i18n/testmodel/{pk}/"/>
+<xhtml:link rel="alternate" hreflang="pt" href="{url}/pt/i18n/testmodel/{pk}/"/>
+<xhtml:link rel="alternate" hreflang="x-default" href="{url}/i18n/testmodel/{pk}/"/>
+</url>
+<url><loc>{url}/pt/i18n/testmodel/{pk}/</loc><changefreq>never</changefreq><priority>0.5</priority>
+<xhtml:link rel="alternate" hreflang="en" href="{url}/en/i18n/testmodel/{pk}/"/>
+<xhtml:link rel="alternate" hreflang="pt" href="{url}/pt/i18n/testmodel/{pk}/"/>
+<xhtml:link rel="alternate" hreflang="x-default" href="{url}/i18n/testmodel/{pk}/"/>
+</url>
+""".replace('\n', '')
+ expected_content = f"""<?xml version="1.0" encoding="UTF-8"?>
+<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml">
+{expected_urls}
+</urlset>
+"""
+ self.assertXMLEqual(response.content.decode(), expected_content)
+
def test_sitemap_without_entries(self):
response = self.client.get('/sitemap-without-entries/sitemap.xml')
expected_content = """<?xml version="1.0" encoding="UTF-8"?>
diff --git a/tests/sitemaps_tests/urls/http.py b/tests/sitemaps_tests/urls/http.py
index 495f60fb1a..e4cba4c42f 100644
--- a/tests/sitemaps_tests/urls/http.py
+++ b/tests/sitemaps_tests/urls/http.py
@@ -34,6 +34,18 @@ class SimpleI18nSitemap(Sitemap):
return I18nTestModel.objects.order_by('pk').all()
+class AlternatesI18nSitemap(SimpleI18nSitemap):
+ alternates = True
+
+
+class LimitedI18nSitemap(AlternatesI18nSitemap):
+ languages = ['en', 'es']
+
+
+class XDefaultI18nSitemap(AlternatesI18nSitemap):
+ x_default = True
+
+
class EmptySitemap(Sitemap):
changefreq = "never"
priority = 0.5
@@ -77,8 +89,20 @@ simple_sitemaps = {
'simple': SimpleSitemap,
}
-simple_i18nsitemaps = {
- 'simple': SimpleI18nSitemap,
+simple_i18n_sitemaps = {
+ 'i18n': SimpleI18nSitemap,
+}
+
+alternates_i18n_sitemaps = {
+ 'i18n-alternates': AlternatesI18nSitemap,
+}
+
+limited_i18n_sitemaps = {
+ 'i18n-limited': LimitedI18nSitemap,
+}
+
+xdefault_i18n_sitemaps = {
+ 'i18n-xdefault': XDefaultI18nSitemap,
}
simple_sitemaps_not_callable = {
@@ -97,7 +121,7 @@ fixed_lastmod_sitemaps = {
'fixed-lastmod': FixedLastmodSitemap,
}
-fixed_lastmod__mixed_sitemaps = {
+fixed_lastmod_mixed_sitemaps = {
'fixed-lastmod-mixed': FixedLastmodMixedSitemap,
}
@@ -151,7 +175,19 @@ urlpatterns = [
name='django.contrib.sitemaps.views.sitemap'),
path(
'simple/i18n.xml', views.sitemap,
- {'sitemaps': simple_i18nsitemaps},
+ {'sitemaps': simple_i18n_sitemaps},
+ name='django.contrib.sitemaps.views.sitemap'),
+ path(
+ 'alternates/i18n.xml', views.sitemap,
+ {'sitemaps': alternates_i18n_sitemaps},
+ name='django.contrib.sitemaps.views.sitemap'),
+ path(
+ 'limited/i18n.xml', views.sitemap,
+ {'sitemaps': limited_i18n_sitemaps},
+ name='django.contrib.sitemaps.views.sitemap'),
+ path(
+ 'x-default/i18n.xml', views.sitemap,
+ {'sitemaps': xdefault_i18n_sitemaps},
name='django.contrib.sitemaps.views.sitemap'),
path(
'simple/custom-sitemap.xml', views.sitemap,
@@ -167,7 +203,7 @@ urlpatterns = [
name='django.contrib.sitemaps.views.sitemap'),
path(
'lastmod-mixed/sitemap.xml', views.sitemap,
- {'sitemaps': fixed_lastmod__mixed_sitemaps},
+ {'sitemaps': fixed_lastmod_mixed_sitemaps},
name='django.contrib.sitemaps.views.sitemap'),
path(
'lastmod/date-sitemap.xml', views.sitemap,