/tests/regressiontests/generic_views/dates.py

https://code.google.com/p/mango-py/ · Python · 415 lines · 313 code · 78 blank · 24 comment · 3 complexity · daa469d1e2e8b8f3783892e41a6dcfbb MD5 · raw file

  1. import datetime
  2. import random
  3. from django.core.exceptions import ImproperlyConfigured
  4. from django.test import TestCase
  5. from regressiontests.generic_views.models import Book
  6. class ArchiveIndexViewTests(TestCase):
  7. fixtures = ['generic-views-test-data.json']
  8. urls = 'regressiontests.generic_views.urls'
  9. def _make_books(self, n, base_date):
  10. for i in range(n):
  11. b = Book.objects.create(
  12. name='Book %d' % i,
  13. slug='book-%d' % i,
  14. pages=100+i,
  15. pubdate=base_date - datetime.timedelta(days=1))
  16. def test_archive_view(self):
  17. res = self.client.get('/dates/books/')
  18. self.assertEqual(res.status_code, 200)
  19. self.assertEqual(res.context['date_list'], Book.objects.dates('pubdate', 'year')[::-1])
  20. self.assertEqual(list(res.context['latest']), list(Book.objects.all()))
  21. self.assertTemplateUsed(res, 'generic_views/book_archive.html')
  22. def test_archive_view_context_object_name(self):
  23. res = self.client.get('/dates/books/context_object_name/')
  24. self.assertEqual(res.status_code, 200)
  25. self.assertEqual(res.context['date_list'], Book.objects.dates('pubdate', 'year')[::-1])
  26. self.assertEqual(list(res.context['thingies']), list(Book.objects.all()))
  27. self.assertFalse('latest' in res.context)
  28. self.assertTemplateUsed(res, 'generic_views/book_archive.html')
  29. def test_empty_archive_view(self):
  30. Book.objects.all().delete()
  31. res = self.client.get('/dates/books/')
  32. self.assertEqual(res.status_code, 404)
  33. def test_allow_empty_archive_view(self):
  34. Book.objects.all().delete()
  35. res = self.client.get('/dates/books/allow_empty/')
  36. self.assertEqual(res.status_code, 200)
  37. self.assertEqual(list(res.context['date_list']), [])
  38. self.assertEqual(list(res.context['date_list']), [])
  39. self.assertTemplateUsed(res, 'generic_views/book_archive.html')
  40. def test_archive_view_template(self):
  41. res = self.client.get('/dates/books/template_name/')
  42. self.assertEqual(res.status_code, 200)
  43. self.assertEqual(res.context['date_list'], Book.objects.dates('pubdate', 'year')[::-1])
  44. self.assertEqual(list(res.context['latest']), list(Book.objects.all()))
  45. self.assertTemplateUsed(res, 'generic_views/list.html')
  46. def test_archive_view_template_suffix(self):
  47. res = self.client.get('/dates/books/template_name_suffix/')
  48. self.assertEqual(res.status_code, 200)
  49. self.assertEqual(res.context['date_list'], Book.objects.dates('pubdate', 'year')[::-1])
  50. self.assertEqual(list(res.context['latest']), list(Book.objects.all()))
  51. self.assertTemplateUsed(res, 'generic_views/book_detail.html')
  52. def test_archive_view_invalid(self):
  53. self.assertRaises(ImproperlyConfigured, self.client.get, '/dates/books/invalid/')
  54. def test_paginated_archive_view(self):
  55. self._make_books(20, base_date=datetime.date.today())
  56. res = self.client.get('/dates/books/paginated/')
  57. self.assertEqual(res.status_code, 200)
  58. self.assertEqual(res.context['date_list'], Book.objects.dates('pubdate', 'year')[::-1])
  59. self.assertEqual(list(res.context['latest']), list(Book.objects.all()[0:10]))
  60. self.assertTemplateUsed(res, 'generic_views/book_archive.html')
  61. res = self.client.get('/dates/books/paginated/?page=2')
  62. self.assertEqual(res.status_code, 200)
  63. self.assertEqual(res.context['page_obj'].number, 2)
  64. self.assertEqual(list(res.context['latest']), list(Book.objects.all()[10:20]))
  65. class YearArchiveViewTests(TestCase):
  66. fixtures = ['generic-views-test-data.json']
  67. urls = 'regressiontests.generic_views.urls'
  68. def test_year_view(self):
  69. res = self.client.get('/dates/books/2008/')
  70. self.assertEqual(res.status_code, 200)
  71. self.assertEqual(list(res.context['date_list']), [datetime.datetime(2008, 10, 1)])
  72. self.assertEqual(res.context['year'], '2008')
  73. self.assertTemplateUsed(res, 'generic_views/book_archive_year.html')
  74. def test_year_view_make_object_list(self):
  75. res = self.client.get('/dates/books/2006/make_object_list/')
  76. self.assertEqual(res.status_code, 200)
  77. self.assertEqual(list(res.context['date_list']), [datetime.datetime(2006, 5, 1)])
  78. self.assertEqual(list(res.context['book_list']), list(Book.objects.filter(pubdate__year=2006)))
  79. self.assertEqual(list(res.context['object_list']), list(Book.objects.filter(pubdate__year=2006)))
  80. self.assertTemplateUsed(res, 'generic_views/book_archive_year.html')
  81. def test_year_view_empty(self):
  82. res = self.client.get('/dates/books/1999/')
  83. self.assertEqual(res.status_code, 404)
  84. res = self.client.get('/dates/books/1999/allow_empty/')
  85. self.assertEqual(res.status_code, 200)
  86. self.assertEqual(list(res.context['date_list']), [])
  87. self.assertEqual(list(res.context['book_list']), [])
  88. def test_year_view_allow_future(self):
  89. # Create a new book in the future
  90. year = datetime.date.today().year + 1
  91. b = Book.objects.create(name="The New New Testement", pages=600, pubdate=datetime.date(year, 1, 1))
  92. res = self.client.get('/dates/books/%s/' % year)
  93. self.assertEqual(res.status_code, 404)
  94. res = self.client.get('/dates/books/%s/allow_empty/' % year)
  95. self.assertEqual(res.status_code, 200)
  96. self.assertEqual(list(res.context['book_list']), [])
  97. res = self.client.get('/dates/books/%s/allow_future/' % year)
  98. self.assertEqual(res.status_code, 200)
  99. self.assertEqual(list(res.context['date_list']), [datetime.datetime(year, 1, 1)])
  100. def test_year_view_paginated(self):
  101. res = self.client.get('/dates/books/2006/paginated/')
  102. self.assertEqual(res.status_code, 200)
  103. self.assertEqual(list(res.context['book_list']), list(Book.objects.filter(pubdate__year=2006)))
  104. self.assertEqual(list(res.context['object_list']), list(Book.objects.filter(pubdate__year=2006)))
  105. self.assertTemplateUsed(res, 'generic_views/book_archive_year.html')
  106. def test_year_view_invalid_pattern(self):
  107. res = self.client.get('/dates/books/no_year/')
  108. self.assertEqual(res.status_code, 404)
  109. class MonthArchiveViewTests(TestCase):
  110. fixtures = ['generic-views-test-data.json']
  111. urls = 'regressiontests.generic_views.urls'
  112. def test_month_view(self):
  113. res = self.client.get('/dates/books/2008/oct/')
  114. self.assertEqual(res.status_code, 200)
  115. self.assertTemplateUsed(res, 'generic_views/book_archive_month.html')
  116. self.assertEqual(list(res.context['date_list']), [datetime.datetime(2008, 10, 1)])
  117. self.assertEqual(list(res.context['book_list']),
  118. list(Book.objects.filter(pubdate=datetime.date(2008, 10, 1))))
  119. self.assertEqual(res.context['month'], datetime.date(2008, 10, 1))
  120. # Since allow_empty=False, next/prev months must be valid (#7164)
  121. self.assertEqual(res.context['next_month'], None)
  122. self.assertEqual(res.context['previous_month'], datetime.date(2006, 5, 1))
  123. def test_month_view_allow_empty(self):
  124. # allow_empty = False, empty month
  125. res = self.client.get('/dates/books/2000/jan/')
  126. self.assertEqual(res.status_code, 404)
  127. # allow_empty = True, empty month
  128. res = self.client.get('/dates/books/2000/jan/allow_empty/')
  129. self.assertEqual(res.status_code, 200)
  130. self.assertEqual(list(res.context['date_list']), [])
  131. self.assertEqual(list(res.context['book_list']), [])
  132. self.assertEqual(res.context['month'], datetime.date(2000, 1, 1))
  133. # Since it's allow empty, next/prev are allowed to be empty months (#7164)
  134. self.assertEqual(res.context['next_month'], datetime.date(2000, 2, 1))
  135. self.assertEqual(res.context['previous_month'], datetime.date(1999, 12, 1))
  136. # allow_empty but not allow_future: next_month should be empty (#7164)
  137. url = datetime.date.today().strftime('/dates/books/%Y/%b/allow_empty/').lower()
  138. res = self.client.get(url)
  139. self.assertEqual(res.status_code, 200)
  140. self.assertEqual(res.context['next_month'], None)
  141. def test_month_view_allow_future(self):
  142. future = (datetime.date.today() + datetime.timedelta(days=60)).replace(day=1)
  143. urlbit = future.strftime('%Y/%b').lower()
  144. b = Book.objects.create(name="The New New Testement", pages=600, pubdate=future)
  145. # allow_future = False, future month
  146. res = self.client.get('/dates/books/%s/' % urlbit)
  147. self.assertEqual(res.status_code, 404)
  148. # allow_future = True, valid future month
  149. res = self.client.get('/dates/books/%s/allow_future/' % urlbit)
  150. self.assertEqual(res.status_code, 200)
  151. self.assertEqual(res.context['date_list'][0].date(), b.pubdate)
  152. self.assertEqual(list(res.context['book_list']), [b])
  153. self.assertEqual(res.context['month'], future)
  154. # Since it's allow_future but not allow_empty, next/prev are not
  155. # allowed to be empty months (#7164)
  156. self.assertEqual(res.context['next_month'], None)
  157. self.assertEqual(res.context['previous_month'], datetime.date(2008, 10, 1))
  158. # allow_future, but not allow_empty, with a current month. So next
  159. # should be in the future (yup, #7164, again)
  160. res = self.client.get('/dates/books/2008/oct/allow_future/')
  161. self.assertEqual(res.status_code, 200)
  162. self.assertEqual(res.context['next_month'], future)
  163. self.assertEqual(res.context['previous_month'], datetime.date(2006, 5, 1))
  164. def test_month_view_paginated(self):
  165. res = self.client.get('/dates/books/2008/oct/paginated/')
  166. self.assertEqual(res.status_code, 200)
  167. self.assertEqual(list(res.context['book_list']), list(Book.objects.filter(pubdate__year=2008, pubdate__month=10)))
  168. self.assertEqual(list(res.context['object_list']), list(Book.objects.filter(pubdate__year=2008, pubdate__month=10)))
  169. self.assertTemplateUsed(res, 'generic_views/book_archive_month.html')
  170. def test_custom_month_format(self):
  171. res = self.client.get('/dates/books/2008/10/')
  172. self.assertEqual(res.status_code, 200)
  173. def test_month_view_invalid_pattern(self):
  174. res = self.client.get('/dates/books/2007/no_month/')
  175. self.assertEqual(res.status_code, 404)
  176. def test_previous_month_without_content(self):
  177. "Content can exist on any day of the previous month. Refs #14711"
  178. self.pubdate_list = [
  179. datetime.date(2010, month, day)
  180. for month,day in ((9,1), (10,2), (11,3))
  181. ]
  182. for pubdate in self.pubdate_list:
  183. name = str(pubdate)
  184. Book.objects.create(name=name, slug=name, pages=100, pubdate=pubdate)
  185. res = self.client.get('/dates/books/2010/nov/allow_empty/')
  186. self.assertEqual(res.status_code, 200)
  187. self.assertEqual(res.context['previous_month'], datetime.date(2010,10,1))
  188. # The following test demonstrates the bug
  189. res = self.client.get('/dates/books/2010/nov/')
  190. self.assertEqual(res.status_code, 200)
  191. self.assertEqual(res.context['previous_month'], datetime.date(2010,10,1))
  192. # The bug does not occur here because a Book with pubdate of Sep 1 exists
  193. res = self.client.get('/dates/books/2010/oct/')
  194. self.assertEqual(res.status_code, 200)
  195. self.assertEqual(res.context['previous_month'], datetime.date(2010,9,1))
  196. class WeekArchiveViewTests(TestCase):
  197. fixtures = ['generic-views-test-data.json']
  198. urls = 'regressiontests.generic_views.urls'
  199. def test_week_view(self):
  200. res = self.client.get('/dates/books/2008/week/39/')
  201. self.assertEqual(res.status_code, 200)
  202. self.assertTemplateUsed(res, 'generic_views/book_archive_week.html')
  203. self.assertEqual(res.context['book_list'][0], Book.objects.get(pubdate=datetime.date(2008, 10, 1)))
  204. self.assertEqual(res.context['week'], datetime.date(2008, 9, 28))
  205. def test_week_view_allow_empty(self):
  206. res = self.client.get('/dates/books/2008/week/12/')
  207. self.assertEqual(res.status_code, 404)
  208. res = self.client.get('/dates/books/2008/week/12/allow_empty/')
  209. self.assertEqual(res.status_code, 200)
  210. self.assertEqual(list(res.context['book_list']), [])
  211. def test_week_view_allow_future(self):
  212. future = datetime.date(datetime.date.today().year + 1, 1, 1)
  213. b = Book.objects.create(name="The New New Testement", pages=600, pubdate=future)
  214. res = self.client.get('/dates/books/%s/week/1/' % future.year)
  215. self.assertEqual(res.status_code, 404)
  216. res = self.client.get('/dates/books/%s/week/1/allow_future/' % future.year)
  217. self.assertEqual(res.status_code, 200)
  218. self.assertEqual(list(res.context['book_list']), [b])
  219. def test_week_view_paginated(self):
  220. week_start = datetime.date(2008, 9, 28)
  221. week_end = week_start + datetime.timedelta(days=7)
  222. res = self.client.get('/dates/books/2008/week/39/')
  223. self.assertEqual(res.status_code, 200)
  224. self.assertEqual(list(res.context['book_list']), list(Book.objects.filter(pubdate__gte=week_start, pubdate__lt=week_end)))
  225. self.assertEqual(list(res.context['object_list']), list(Book.objects.filter(pubdate__gte=week_start, pubdate__lt=week_end)))
  226. self.assertTemplateUsed(res, 'generic_views/book_archive_week.html')
  227. def test_week_view_invalid_pattern(self):
  228. res = self.client.get('/dates/books/2007/week/no_week/')
  229. self.assertEqual(res.status_code, 404)
  230. def test_week_start_Monday(self):
  231. # Regression for #14752
  232. res = self.client.get('/dates/books/2008/week/39/')
  233. self.assertEqual(res.status_code, 200)
  234. self.assertEqual(res.context['week'], datetime.date(2008, 9, 28))
  235. res = self.client.get('/dates/books/2008/week/39/monday/')
  236. self.assertEqual(res.status_code, 200)
  237. self.assertEqual(res.context['week'], datetime.date(2008, 9, 29))
  238. class DayArchiveViewTests(TestCase):
  239. fixtures = ['generic-views-test-data.json']
  240. urls = 'regressiontests.generic_views.urls'
  241. def test_day_view(self):
  242. res = self.client.get('/dates/books/2008/oct/01/')
  243. self.assertEqual(res.status_code, 200)
  244. self.assertTemplateUsed(res, 'generic_views/book_archive_day.html')
  245. self.assertEqual(list(res.context['book_list']),
  246. list(Book.objects.filter(pubdate=datetime.date(2008, 10, 1))))
  247. self.assertEqual(res.context['day'], datetime.date(2008, 10, 1))
  248. # Since allow_empty=False, next/prev days must be valid.
  249. self.assertEqual(res.context['next_day'], None)
  250. self.assertEqual(res.context['previous_day'], datetime.date(2006, 5, 1))
  251. def test_day_view_allow_empty(self):
  252. # allow_empty = False, empty month
  253. res = self.client.get('/dates/books/2000/jan/1/')
  254. self.assertEqual(res.status_code, 404)
  255. # allow_empty = True, empty month
  256. res = self.client.get('/dates/books/2000/jan/1/allow_empty/')
  257. self.assertEqual(res.status_code, 200)
  258. self.assertEqual(list(res.context['book_list']), [])
  259. self.assertEqual(res.context['day'], datetime.date(2000, 1, 1))
  260. # Since it's allow empty, next/prev are allowed to be empty months (#7164)
  261. self.assertEqual(res.context['next_day'], datetime.date(2000, 1, 2))
  262. self.assertEqual(res.context['previous_day'], datetime.date(1999, 12, 31))
  263. # allow_empty but not allow_future: next_month should be empty (#7164)
  264. url = datetime.date.today().strftime('/dates/books/%Y/%b/%d/allow_empty/').lower()
  265. res = self.client.get(url)
  266. self.assertEqual(res.status_code, 200)
  267. self.assertEqual(res.context['next_day'], None)
  268. def test_day_view_allow_future(self):
  269. future = (datetime.date.today() + datetime.timedelta(days=60))
  270. urlbit = future.strftime('%Y/%b/%d').lower()
  271. b = Book.objects.create(name="The New New Testement", pages=600, pubdate=future)
  272. # allow_future = False, future month
  273. res = self.client.get('/dates/books/%s/' % urlbit)
  274. self.assertEqual(res.status_code, 404)
  275. # allow_future = True, valid future month
  276. res = self.client.get('/dates/books/%s/allow_future/' % urlbit)
  277. self.assertEqual(res.status_code, 200)
  278. self.assertEqual(list(res.context['book_list']), [b])
  279. self.assertEqual(res.context['day'], future)
  280. # allow_future but not allow_empty, next/prev amust be valid
  281. self.assertEqual(res.context['next_day'], None)
  282. self.assertEqual(res.context['previous_day'], datetime.date(2008, 10, 1))
  283. # allow_future, but not allow_empty, with a current month.
  284. res = self.client.get('/dates/books/2008/oct/01/allow_future/')
  285. self.assertEqual(res.status_code, 200)
  286. self.assertEqual(res.context['next_day'], future)
  287. self.assertEqual(res.context['previous_day'], datetime.date(2006, 5, 1))
  288. def test_day_view_paginated(self):
  289. res = self.client.get('/dates/books/2008/oct/1/')
  290. self.assertEqual(res.status_code, 200)
  291. self.assertEqual(list(res.context['book_list']), list(Book.objects.filter(pubdate__year=2008, pubdate__month=10, pubdate__day=1)))
  292. self.assertEqual(list(res.context['object_list']), list(Book.objects.filter(pubdate__year=2008, pubdate__month=10, pubdate__day=1)))
  293. self.assertTemplateUsed(res, 'generic_views/book_archive_day.html')
  294. def test_next_prev_context(self):
  295. res = self.client.get('/dates/books/2008/oct/01/')
  296. self.assertEqual(res.content, "Archive for Oct. 1, 2008. Previous day is May 1, 2006")
  297. def test_custom_month_format(self):
  298. res = self.client.get('/dates/books/2008/10/01/')
  299. self.assertEqual(res.status_code, 200)
  300. def test_day_view_invalid_pattern(self):
  301. res = self.client.get('/dates/books/2007/oct/no_day/')
  302. self.assertEqual(res.status_code, 404)
  303. def test_today_view(self):
  304. res = self.client.get('/dates/books/today/')
  305. self.assertEqual(res.status_code, 404)
  306. res = self.client.get('/dates/books/today/allow_empty/')
  307. self.assertEqual(res.status_code, 200)
  308. self.assertEqual(res.context['day'], datetime.date.today())
  309. class DateDetailViewTests(TestCase):
  310. fixtures = ['generic-views-test-data.json']
  311. urls = 'regressiontests.generic_views.urls'
  312. def test_date_detail_by_pk(self):
  313. res = self.client.get('/dates/books/2008/oct/01/1/')
  314. self.assertEqual(res.status_code, 200)
  315. self.assertEqual(res.context['object'], Book.objects.get(pk=1))
  316. self.assertEqual(res.context['book'], Book.objects.get(pk=1))
  317. self.assertTemplateUsed(res, 'generic_views/book_detail.html')
  318. def test_date_detail_by_slug(self):
  319. res = self.client.get('/dates/books/2006/may/01/byslug/dreaming-in-code/')
  320. self.assertEqual(res.status_code, 200)
  321. self.assertEqual(res.context['book'], Book.objects.get(slug='dreaming-in-code'))
  322. def test_date_detail_custom_month_format(self):
  323. res = self.client.get('/dates/books/2008/10/01/1/')
  324. self.assertEqual(res.status_code, 200)
  325. self.assertEqual(res.context['book'], Book.objects.get(pk=1))
  326. def test_date_detail_allow_future(self):
  327. future = (datetime.date.today() + datetime.timedelta(days=60))
  328. urlbit = future.strftime('%Y/%b/%d').lower()
  329. b = Book.objects.create(name="The New New Testement", slug="new-new", pages=600, pubdate=future)
  330. res = self.client.get('/dates/books/%s/new-new/' % urlbit)
  331. self.assertEqual(res.status_code, 404)
  332. res = self.client.get('/dates/books/%s/%s/allow_future/' % (urlbit, b.id))
  333. self.assertEqual(res.status_code, 200)
  334. self.assertEqual(res.context['book'], b)
  335. self.assertTemplateUsed(res, 'generic_views/book_detail.html')
  336. def test_invalid_url(self):
  337. self.assertRaises(AttributeError, self.client.get, "/dates/books/2008/oct/01/nopk/")