date_based.py 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. # coding: utf-8
  2. import warnings
  3. from django.test import TestCase
  4. from datetime import datetime, date
  5. from datetime import timedelta
  6. from regressiontests.views.models import Article, Author, DateArticle
  7. class ObjectDetailTest(TestCase):
  8. fixtures = ['testdata.json']
  9. urls = 'regressiontests.views.generic_urls'
  10. def setUp(self):
  11. self.save_warnings_state()
  12. warnings.filterwarnings('ignore', category=DeprecationWarning,
  13. module='django.views.generic.date_based')
  14. # Correct the date for the current article
  15. current_article = Article.objects.get(title="Current Article")
  16. current_article.date_created = datetime.now()
  17. current_article.save()
  18. def tearDown(self):
  19. self.restore_warnings_state()
  20. def test_finds_past(self):
  21. "date_based.object_detail can view a page in the past"
  22. response = self.client.get('/date_based/object_detail/2001/01/01/old_article/')
  23. self.assertEqual(response.status_code, 200)
  24. self.assertEqual(response.context['object'].title, "Old Article")
  25. def test_object_detail_finds_today(self):
  26. "date_based.object_detail can view a page from today"
  27. today_url = datetime.now().strftime('%Y/%m/%d')
  28. response = self.client.get('/date_based/object_detail/%s/current_article/' % today_url)
  29. self.assertEqual(response.status_code, 200)
  30. self.assertEqual(response.context['object'].title, "Current Article")
  31. def test_object_detail_ignores_future(self):
  32. "date_based.object_detail can view a page from the future, but only if allowed."
  33. response = self.client.get('/date_based/object_detail/3000/01/01/future_article/')
  34. self.assertEqual(response.status_code, 404)
  35. def test_object_detail_allowed_future_if_enabled(self):
  36. "date_based.object_detail can view a page from the future if explicitly allowed."
  37. response = self.client.get('/date_based/object_detail/3000/01/01/future_article/allow_future/')
  38. self.assertEqual(response.status_code, 200)
  39. self.assertEqual(response.context['object'].title, "Future Article")
  40. class MonthArchiveTest(TestCase):
  41. urls = 'regressiontests.views.generic_urls'
  42. def setUp(self):
  43. self.save_warnings_state()
  44. warnings.filterwarnings('ignore', category=DeprecationWarning,
  45. module='django.views.generic.date_based')
  46. def tearDown(self):
  47. self.restore_warnings_state()
  48. def test_archive_month_includes_only_month(self):
  49. "Regression for #3031: Archives around Feburary include only one month"
  50. author = Author(name="John Smith")
  51. author.save()
  52. # 2004 was a leap year, so it should be weird enough to not cheat
  53. first_second_of_feb = datetime(2004, 2, 1, 0, 0, 1)
  54. first_second_of_mar = datetime(2004, 3, 1, 0, 0, 1)
  55. two_seconds = timedelta(0, 2, 0)
  56. article = Article(title="example", author=author)
  57. article.date_created = first_second_of_feb
  58. article.save()
  59. response = self.client.get('/date_based/archive_month/2004/02/')
  60. self.assertEqual(response.status_code, 200)
  61. self.assertEqual(response.context['next_month'], date(2004, 3, 1))
  62. self.assertEqual(response.context['previous_month'], date(2004, 1, 1))
  63. article.date_created = first_second_of_feb-two_seconds
  64. article.save()
  65. response = self.client.get('/date_based/archive_month/2004/02/')
  66. self.assertEqual(response.status_code, 404)
  67. article.date_created = first_second_of_mar-two_seconds
  68. article.save()
  69. response = self.client.get('/date_based/archive_month/2004/02/')
  70. self.assertEqual(response.status_code, 200)
  71. self.assertEqual(response.context['next_month'], date(2004, 3, 1))
  72. self.assertEqual(response.context['previous_month'], date(2004, 1, 1))
  73. article.date_created = first_second_of_mar
  74. article.save()
  75. response = self.client.get('/date_based/archive_month/2004/02/')
  76. self.assertEqual(response.status_code, 404)
  77. article2 = DateArticle(title="example", author=author)
  78. article2.date_created = first_second_of_feb.date()
  79. article2.save()
  80. response = self.client.get('/date_based/datefield/archive_month/2004/02/')
  81. self.assertEqual(response.status_code, 200)
  82. self.assertEqual(response.context['next_month'], date(2004, 3, 1))
  83. self.assertEqual(response.context['previous_month'], date(2004, 1, 1))
  84. article2.date_created = (first_second_of_feb-two_seconds).date()
  85. article2.save()
  86. response = self.client.get('/date_based/datefield/archive_month/2004/02/')
  87. self.assertEqual(response.status_code, 404)
  88. article2.date_created = (first_second_of_mar-two_seconds).date()
  89. article2.save()
  90. response = self.client.get('/date_based/datefield/archive_month/2004/02/')
  91. self.assertEqual(response.status_code, 200)
  92. self.assertEqual(response.context['next_month'], date(2004, 3, 1))
  93. self.assertEqual(response.context['previous_month'], date(2004, 1, 1))
  94. article2.date_created = first_second_of_mar.date()
  95. article2.save()
  96. response = self.client.get('/date_based/datefield/archive_month/2004/02/')
  97. self.assertEqual(response.status_code, 404)
  98. now = datetime.now()
  99. prev_month = now.date().replace(day=1)
  100. if prev_month.month == 1:
  101. prev_month = prev_month.replace(year=prev_month.year-1, month=12)
  102. else:
  103. prev_month = prev_month.replace(month=prev_month.month-1)
  104. article2.date_created = now
  105. article2.save()
  106. response = self.client.get('/date_based/datefield/archive_month/%s/' % now.strftime('%Y/%m'))
  107. self.assertEqual(response.status_code, 200)
  108. self.assertEqual(response.context['next_month'], None)
  109. self.assertEqual(response.context['previous_month'], prev_month)
  110. def test_archive_month_date_list(self):
  111. author = Author(name="John Smith")
  112. author.save()
  113. date1 = datetime(2010, 1, 1, 0, 0, 0)
  114. date2 = datetime(2010, 1, 2, 0, 0, 0)
  115. Article.objects.create(title='example1', author=author, date_created=date1)
  116. Article.objects.create(title='example2', author=author, date_created=date2)
  117. response = self.client.get('/date_based/archive_month/2010/1/')
  118. self.assertEqual(response.status_code, 200)
  119. self.assertEqual(len(response.context['date_list']), 2)
  120. self.assertEqual(response.context['date_list'][0], date1)
  121. # Checks that the same date is not included more than once in the list
  122. Article.objects.create(title='example2', author=author, date_created=date2)
  123. response = self.client.get('/date_based/archive_month/2010/1/')
  124. self.assertEqual(len(response.context['date_list']), 2)
  125. class DayArchiveTests(TestCase):
  126. urls = 'regressiontests.views.generic_urls'
  127. def setUp(self):
  128. self.save_warnings_state()
  129. warnings.filterwarnings('ignore', category=DeprecationWarning,
  130. module='django.views.generic.date_based')
  131. warnings.filterwarnings('ignore', category=DeprecationWarning,
  132. module='django.views.generic.create_update')
  133. def tearDown(self):
  134. self.restore_warnings_state()
  135. def test_year_month_day_format(self):
  136. """
  137. Make sure day views don't get confused with numeric month formats (#7944)
  138. """
  139. author = Author.objects.create(name="John Smith")
  140. article = Article.objects.create(title="example", author=author, date_created=datetime(2004, 1, 21, 0, 0, 1))
  141. response = self.client.get('/date_based/archive_day/2004/1/21/')
  142. self.assertEqual(response.status_code, 200)
  143. self.assertEqual(response.context['object_list'][0], article)