diff options
| author | Florian Demmer <fdemmer@gmail.com> | 2020-07-29 10:33:20 +0200 |
|---|---|---|
| committer | Carlton Gibson <carlton@noumenal.es> | 2020-07-29 11:48:29 +0200 |
| commit | 16218c20606d8cd89c5393970c83da04598a3e04 (patch) | |
| tree | c1b968f621c4b948a80917c6fe3fcc93ec1dcad5 /tests/sitemaps_tests | |
| parent | 50e1ccbbea4c6f8e14a186149dd757483f0f0da5 (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.py | 80 | ||||
| -rw-r--r-- | tests/sitemaps_tests/urls/http.py | 46 |
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, |
