1. import datetime
    
  2. 
    
  3. from django.test import SimpleTestCase
    
  4. from django.utils import feedgenerator
    
  5. from django.utils.timezone import get_fixed_timezone
    
  6. 
    
  7. 
    
  8. class FeedgeneratorTests(SimpleTestCase):
    
  9.     """
    
  10.     Tests for the low-level syndication feed framework.
    
  11.     """
    
  12. 
    
  13.     def test_get_tag_uri(self):
    
  14.         """
    
  15.         get_tag_uri() correctly generates TagURIs.
    
  16.         """
    
  17.         self.assertEqual(
    
  18.             feedgenerator.get_tag_uri(
    
  19.                 "http://example.org/foo/bar#headline", datetime.date(2004, 10, 25)
    
  20.             ),
    
  21.             "tag:example.org,2004-10-25:/foo/bar/headline",
    
  22.         )
    
  23. 
    
  24.     def test_get_tag_uri_with_port(self):
    
  25.         """
    
  26.         get_tag_uri() correctly generates TagURIs from URLs with port numbers.
    
  27.         """
    
  28.         self.assertEqual(
    
  29.             feedgenerator.get_tag_uri(
    
  30.                 "http://www.example.org:8000/2008/11/14/django#headline",
    
  31.                 datetime.datetime(2008, 11, 14, 13, 37, 0),
    
  32.             ),
    
  33.             "tag:www.example.org,2008-11-14:/2008/11/14/django/headline",
    
  34.         )
    
  35. 
    
  36.     def test_rfc2822_date(self):
    
  37.         """
    
  38.         rfc2822_date() correctly formats datetime objects.
    
  39.         """
    
  40.         self.assertEqual(
    
  41.             feedgenerator.rfc2822_date(datetime.datetime(2008, 11, 14, 13, 37, 0)),
    
  42.             "Fri, 14 Nov 2008 13:37:00 -0000",
    
  43.         )
    
  44. 
    
  45.     def test_rfc2822_date_with_timezone(self):
    
  46.         """
    
  47.         rfc2822_date() correctly formats datetime objects with tzinfo.
    
  48.         """
    
  49.         self.assertEqual(
    
  50.             feedgenerator.rfc2822_date(
    
  51.                 datetime.datetime(
    
  52.                     2008, 11, 14, 13, 37, 0, tzinfo=get_fixed_timezone(60)
    
  53.                 )
    
  54.             ),
    
  55.             "Fri, 14 Nov 2008 13:37:00 +0100",
    
  56.         )
    
  57. 
    
  58.     def test_rfc2822_date_without_time(self):
    
  59.         """
    
  60.         rfc2822_date() correctly formats date objects.
    
  61.         """
    
  62.         self.assertEqual(
    
  63.             feedgenerator.rfc2822_date(datetime.date(2008, 11, 14)),
    
  64.             "Fri, 14 Nov 2008 00:00:00 -0000",
    
  65.         )
    
  66. 
    
  67.     def test_rfc3339_date(self):
    
  68.         """
    
  69.         rfc3339_date() correctly formats datetime objects.
    
  70.         """
    
  71.         self.assertEqual(
    
  72.             feedgenerator.rfc3339_date(datetime.datetime(2008, 11, 14, 13, 37, 0)),
    
  73.             "2008-11-14T13:37:00Z",
    
  74.         )
    
  75. 
    
  76.     def test_rfc3339_date_with_timezone(self):
    
  77.         """
    
  78.         rfc3339_date() correctly formats datetime objects with tzinfo.
    
  79.         """
    
  80.         self.assertEqual(
    
  81.             feedgenerator.rfc3339_date(
    
  82.                 datetime.datetime(
    
  83.                     2008, 11, 14, 13, 37, 0, tzinfo=get_fixed_timezone(120)
    
  84.                 )
    
  85.             ),
    
  86.             "2008-11-14T13:37:00+02:00",
    
  87.         )
    
  88. 
    
  89.     def test_rfc3339_date_without_time(self):
    
  90.         """
    
  91.         rfc3339_date() correctly formats date objects.
    
  92.         """
    
  93.         self.assertEqual(
    
  94.             feedgenerator.rfc3339_date(datetime.date(2008, 11, 14)),
    
  95.             "2008-11-14T00:00:00Z",
    
  96.         )
    
  97. 
    
  98.     def test_atom1_mime_type(self):
    
  99.         """
    
  100.         Atom MIME type has UTF8 Charset parameter set
    
  101.         """
    
  102.         atom_feed = feedgenerator.Atom1Feed("title", "link", "description")
    
  103.         self.assertEqual(atom_feed.content_type, "application/atom+xml; charset=utf-8")
    
  104. 
    
  105.     def test_rss_mime_type(self):
    
  106.         """
    
  107.         RSS MIME type has UTF8 Charset parameter set
    
  108.         """
    
  109.         rss_feed = feedgenerator.Rss201rev2Feed("title", "link", "description")
    
  110.         self.assertEqual(rss_feed.content_type, "application/rss+xml; charset=utf-8")
    
  111. 
    
  112.     # Two regression tests for #14202
    
  113. 
    
  114.     def test_feed_without_feed_url_gets_rendered_without_atom_link(self):
    
  115.         feed = feedgenerator.Rss201rev2Feed("title", "/link/", "descr")
    
  116.         self.assertIsNone(feed.feed["feed_url"])
    
  117.         feed_content = feed.writeString("utf-8")
    
  118.         self.assertNotIn("<atom:link", feed_content)
    
  119.         self.assertNotIn('href="/feed/"', feed_content)
    
  120.         self.assertNotIn('rel="self"', feed_content)
    
  121. 
    
  122.     def test_feed_with_feed_url_gets_rendered_with_atom_link(self):
    
  123.         feed = feedgenerator.Rss201rev2Feed(
    
  124.             "title", "/link/", "descr", feed_url="/feed/"
    
  125.         )
    
  126.         self.assertEqual(feed.feed["feed_url"], "/feed/")
    
  127.         feed_content = feed.writeString("utf-8")
    
  128.         self.assertIn("<atom:link", feed_content)
    
  129.         self.assertIn('href="/feed/"', feed_content)
    
  130.         self.assertIn('rel="self"', feed_content)
    
  131. 
    
  132.     def test_atom_add_item(self):
    
  133.         # Not providing any optional arguments to Atom1Feed.add_item()
    
  134.         feed = feedgenerator.Atom1Feed("title", "/link/", "descr")
    
  135.         feed.add_item("item_title", "item_link", "item_description")
    
  136.         feed.writeString("utf-8")
    
  137. 
    
  138.     def test_deterministic_attribute_order(self):
    
  139.         feed = feedgenerator.Atom1Feed("title", "/link/", "desc")
    
  140.         feed_content = feed.writeString("utf-8")
    
  141.         self.assertIn('href="/link/" rel="alternate"', feed_content)
    
  142. 
    
  143.     def test_latest_post_date_returns_utc_time(self):
    
  144.         for use_tz in (True, False):
    
  145.             with self.settings(USE_TZ=use_tz):
    
  146.                 rss_feed = feedgenerator.Rss201rev2Feed("title", "link", "description")
    
  147.                 self.assertEqual(
    
  148.                     rss_feed.latest_post_date().tzinfo,
    
  149.                     datetime.timezone.utc,
    
  150.                 )