diff options
| author | Roxane <r.bellot@octopusmind.info> | 2022-10-21 17:36:44 +0200 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2022-12-19 12:51:52 +0100 |
| commit | 289e9a75afb52918a3efbdaf5e72f45a54089083 (patch) | |
| tree | c5e863104836aeff85b67163bb53deff7e71b14a /tests/sitemaps_tests | |
| parent | ab7a85ac297464df82d8363455609979ca3603db (diff) | |
Fixed #33662 -- Allowed Sitemap to customize languages for each item.
Diffstat (limited to 'tests/sitemaps_tests')
| -rw-r--r-- | tests/sitemaps_tests/test_http.py | 68 | ||||
| -rw-r--r-- | tests/sitemaps_tests/urls/http.py | 36 |
2 files changed, 103 insertions, 1 deletions
diff --git a/tests/sitemaps_tests/test_http.py b/tests/sitemaps_tests/test_http.py index 8c16f66896..12e387757b 100644 --- a/tests/sitemaps_tests/test_http.py +++ b/tests/sitemaps_tests/test_http.py @@ -10,7 +10,7 @@ from django.utils.deprecation import RemovedInDjango50Warning from django.utils.formats import localize from .base import SitemapTestsBase -from .models import TestModel +from .models import I18nTestModel, TestModel class HTTPSitemapTests(SitemapTestsBase): @@ -440,6 +440,72 @@ class HTTPSitemapTests(SitemapTestsBase): ) self.assertXMLEqual(response.content.decode(), expected_content) + @override_settings(LANGUAGES=(("en", "English"), ("pt", "Portuguese"))) + def test_language_for_item_i18n_sitemap(self): + """ + A i18n sitemap index in which item can be chosen to be displayed for a + lang or not. + """ + only_pt = I18nTestModel.objects.create(name="Only for PT") + response = self.client.get("/item-by-lang/i18n.xml") + url, pk, only_pt_pk = self.base_url, self.i18n_model.pk, only_pt.pk + expected_urls = ( + f"<url><loc>{url}/en/i18n/testmodel/{pk}/</loc>" + f"<changefreq>never</changefreq><priority>0.5</priority></url>" + f"<url><loc>{url}/pt/i18n/testmodel/{pk}/</loc>" + f"<changefreq>never</changefreq><priority>0.5</priority></url>" + f"<url><loc>{url}/pt/i18n/testmodel/{only_pt_pk}/</loc>" + f"<changefreq>never</changefreq><priority>0.5</priority></url>" + ) + expected_content = ( + f'<?xml version="1.0" encoding="UTF-8"?>\n' + f'<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" ' + f'xmlns:xhtml="http://www.w3.org/1999/xhtml">\n' + f"{expected_urls}\n" + f"</urlset>" + ) + self.assertXMLEqual(response.content.decode(), expected_content) + + @override_settings(LANGUAGES=(("en", "English"), ("pt", "Portuguese"))) + def test_alternate_language_for_item_i18n_sitemap(self): + """ + A i18n sitemap index in which item can be chosen to be displayed for a + lang or not. + """ + only_pt = I18nTestModel.objects.create(name="Only for PT") + response = self.client.get("/item-by-lang-alternates/i18n.xml") + url, pk, only_pt_pk = self.base_url, self.i18n_model.pk, only_pt.pk + expected_urls = ( + f"<url><loc>{url}/en/i18n/testmodel/{pk}/</loc>" + f"<changefreq>never</changefreq><priority>0.5</priority>" + f'<xhtml:link rel="alternate" ' + f'hreflang="en" href="{url}/en/i18n/testmodel/{pk}/"/>' + f'<xhtml:link rel="alternate" ' + f'hreflang="pt" href="{url}/pt/i18n/testmodel/{pk}/"/>' + f'<xhtml:link rel="alternate" ' + f'hreflang="x-default" href="{url}/i18n/testmodel/{pk}/"/></url>' + f"<url><loc>{url}/pt/i18n/testmodel/{pk}/</loc>" + f"<changefreq>never</changefreq><priority>0.5</priority>" + f'<xhtml:link rel="alternate" ' + f'hreflang="en" href="{url}/en/i18n/testmodel/{pk}/"/>' + f'<xhtml:link rel="alternate" ' + f'hreflang="pt" href="{url}/pt/i18n/testmodel/{pk}/"/>' + f'<xhtml:link rel="alternate" ' + f'hreflang="x-default" href="{url}/i18n/testmodel/{pk}/"/></url>' + f"<url><loc>{url}/pt/i18n/testmodel/{only_pt_pk}/</loc>" + f"<changefreq>never</changefreq><priority>0.5</priority>" + f'<xhtml:link rel="alternate" ' + f'hreflang="pt" href="{url}/pt/i18n/testmodel/{only_pt_pk}/"/></url>' + ) + expected_content = ( + f'<?xml version="1.0" encoding="UTF-8"?>\n' + f'<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" ' + f'xmlns:xhtml="http://www.w3.org/1999/xhtml">\n' + f"{expected_urls}\n" + f"</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 = ( diff --git a/tests/sitemaps_tests/urls/http.py b/tests/sitemaps_tests/urls/http.py index 75dd4834c0..2b512cfd69 100644 --- a/tests/sitemaps_tests/urls/http.py +++ b/tests/sitemaps_tests/urls/http.py @@ -48,6 +48,22 @@ class XDefaultI18nSitemap(AlternatesI18nSitemap): x_default = True +class ItemByLangSitemap(SimpleI18nSitemap): + def get_languages_for_item(self, item): + if item.name == "Only for PT": + return ["pt"] + return super().get_languages_for_item(item) + + +class ItemByLangAlternatesSitemap(AlternatesI18nSitemap): + x_default = True + + def get_languages_for_item(self, item): + if item.name == "Only for PT": + return ["pt"] + return super().get_languages_for_item(item) + + class EmptySitemap(Sitemap): changefreq = "never" priority = 0.5 @@ -168,6 +184,14 @@ xdefault_i18n_sitemaps = { "i18n-xdefault": XDefaultI18nSitemap, } +item_by_lang_i18n_sitemaps = { + "i18n-item-by-lang": ItemByLangSitemap, +} + +item_by_lang_alternates_i18n_sitemaps = { + "i18n-item-by-lang-alternates": ItemByLangAlternatesSitemap, +} + simple_sitemaps_not_callable = { "simple": SimpleSitemap(), } @@ -359,6 +383,18 @@ urlpatterns = [ name="django.contrib.sitemaps.views.sitemap", ), path( + "item-by-lang/i18n.xml", + views.sitemap, + {"sitemaps": item_by_lang_i18n_sitemaps}, + name="django.contrib.sitemaps.views.sitemap", + ), + path( + "item-by-lang-alternates/i18n.xml", + views.sitemap, + {"sitemaps": item_by_lang_alternates_i18n_sitemaps}, + name="django.contrib.sitemaps.views.sitemap", + ), + path( "lastmod-sitemaps/descending.xml", views.sitemap, {"sitemaps": sitemaps_lastmod_descending}, |
