1. from datetime import datetime
    
  2. 
    
  3. from django.contrib.sitemaps import GenericSitemap
    
  4. from django.test import ignore_warnings, override_settings
    
  5. from django.utils.deprecation import RemovedInDjango50Warning
    
  6. 
    
  7. from .base import SitemapTestsBase
    
  8. from .models import TestModel
    
  9. 
    
  10. 
    
  11. @override_settings(ABSOLUTE_URL_OVERRIDES={})
    
  12. class GenericViewsSitemapTests(SitemapTestsBase):
    
  13.     def test_generic_sitemap_attributes(self):
    
  14.         datetime_value = datetime.now()
    
  15.         queryset = TestModel.objects.all()
    
  16.         generic_sitemap = GenericSitemap(
    
  17.             info_dict={
    
  18.                 "queryset": queryset,
    
  19.                 "date_field": datetime_value,
    
  20.             },
    
  21.             priority=0.6,
    
  22.             changefreq="monthly",
    
  23.             protocol="https",
    
  24.         )
    
  25.         attr_values = (
    
  26.             ("date_field", datetime_value),
    
  27.             ("priority", 0.6),
    
  28.             ("changefreq", "monthly"),
    
  29.             ("protocol", "https"),
    
  30.         )
    
  31.         for attr_name, expected_value in attr_values:
    
  32.             with self.subTest(attr_name=attr_name):
    
  33.                 self.assertEqual(getattr(generic_sitemap, attr_name), expected_value)
    
  34.         self.assertCountEqual(generic_sitemap.queryset, queryset)
    
  35. 
    
  36.     def test_generic_sitemap(self):
    
  37.         "A minimal generic sitemap can be rendered"
    
  38.         response = self.client.get("/generic/sitemap.xml")
    
  39.         expected = ""
    
  40.         for pk in TestModel.objects.values_list("id", flat=True):
    
  41.             expected += "<url><loc>%s/testmodel/%s/</loc></url>" % (self.base_url, pk)
    
  42.         expected_content = (
    
  43.             '<?xml version="1.0" encoding="UTF-8"?>\n'
    
  44.             '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" '
    
  45.             'xmlns:xhtml="http://www.w3.org/1999/xhtml">\n'
    
  46.             "%s\n"
    
  47.             "</urlset>"
    
  48.         ) % expected
    
  49.         self.assertXMLEqual(response.content.decode(), expected_content)
    
  50. 
    
  51.     def test_generic_sitemap_lastmod(self):
    
  52.         test_model = TestModel.objects.first()
    
  53.         TestModel.objects.update(lastmod=datetime(2013, 3, 13, 10, 0, 0))
    
  54.         response = self.client.get("/generic-lastmod/sitemap.xml")
    
  55.         expected_content = (
    
  56.             '<?xml version="1.0" encoding="UTF-8"?>\n'
    
  57.             '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" '
    
  58.             'xmlns:xhtml="http://www.w3.org/1999/xhtml">\n'
    
  59.             "<url><loc>%s/testmodel/%s/</loc><lastmod>2013-03-13</lastmod></url>\n"
    
  60.             "</urlset>"
    
  61.         ) % (
    
  62.             self.base_url,
    
  63.             test_model.pk,
    
  64.         )
    
  65.         self.assertXMLEqual(response.content.decode(), expected_content)
    
  66.         self.assertEqual(
    
  67.             response.headers["Last-Modified"], "Wed, 13 Mar 2013 10:00:00 GMT"
    
  68.         )
    
  69. 
    
  70.     def test_get_protocol_defined_in_constructor(self):
    
  71.         for protocol in ["http", "https"]:
    
  72.             with self.subTest(protocol=protocol):
    
  73.                 sitemap = GenericSitemap({"queryset": None}, protocol=protocol)
    
  74.                 self.assertEqual(sitemap.get_protocol(), protocol)
    
  75. 
    
  76.     def test_get_protocol_passed_as_argument(self):
    
  77.         sitemap = GenericSitemap({"queryset": None})
    
  78.         for protocol in ["http", "https"]:
    
  79.             with self.subTest(protocol=protocol):
    
  80.                 self.assertEqual(sitemap.get_protocol(protocol), protocol)
    
  81. 
    
  82.     @ignore_warnings(category=RemovedInDjango50Warning)
    
  83.     def test_get_protocol_default(self):
    
  84.         sitemap = GenericSitemap({"queryset": None})
    
  85.         self.assertEqual(sitemap.get_protocol(), "http")
    
  86. 
    
  87.     def test_get_protocol_default_warning(self):
    
  88.         sitemap = GenericSitemap({"queryset": None})
    
  89.         msg = (
    
  90.             "The default sitemap protocol will be changed from 'http' to "
    
  91.             "'https' in Django 5.0. Set Sitemap.protocol to silence this "
    
  92.             "warning."
    
  93.         )
    
  94.         with self.assertWarnsMessage(RemovedInDjango50Warning, msg):
    
  95.             sitemap.get_protocol()
    
  96. 
    
  97.     def test_generic_sitemap_index(self):
    
  98.         TestModel.objects.update(lastmod=datetime(2013, 3, 13, 10, 0, 0))
    
  99.         response = self.client.get("/generic-lastmod/index.xml")
    
  100.         expected_content = """<?xml version="1.0" encoding="UTF-8"?>
    
  101. <sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    
  102. <sitemap><loc>http://example.com/simple/sitemap-generic.xml</loc><lastmod>2013-03-13T10:00:00</lastmod></sitemap>
    
  103. </sitemapindex>"""
    
  104.         self.assertXMLEqual(response.content.decode("utf-8"), expected_content)