summaryrefslogtreecommitdiff
path: root/tests/sitemaps_tests
diff options
context:
space:
mode:
authorRoxane <r.bellot@octopusmind.info>2022-10-21 17:36:44 +0200
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2022-12-19 12:51:52 +0100
commit289e9a75afb52918a3efbdaf5e72f45a54089083 (patch)
treec5e863104836aeff85b67163bb53deff7e71b14a /tests/sitemaps_tests
parentab7a85ac297464df82d8363455609979ca3603db (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.py68
-rw-r--r--tests/sitemaps_tests/urls/http.py36
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},