tests.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. import datetime
  2. from django.test import TestCase, override_settings
  3. from django.utils import timezone
  4. from .models import Article, Category, Comment
  5. class DateTimesTests(TestCase):
  6. def test_related_model_traverse(self):
  7. a1 = Article.objects.create(
  8. title="First one",
  9. pub_date=datetime.datetime(2005, 7, 28, 9, 0, 0),
  10. )
  11. a2 = Article.objects.create(
  12. title="Another one",
  13. pub_date=datetime.datetime(2010, 7, 28, 10, 0, 0),
  14. )
  15. a3 = Article.objects.create(
  16. title="Third one, in the first day",
  17. pub_date=datetime.datetime(2005, 7, 28, 17, 0, 0),
  18. )
  19. a1.comments.create(
  20. text="Im the HULK!",
  21. pub_date=datetime.datetime(2005, 7, 28, 9, 30, 0),
  22. )
  23. a1.comments.create(
  24. text="HULK SMASH!",
  25. pub_date=datetime.datetime(2005, 7, 29, 1, 30, 0),
  26. )
  27. a2.comments.create(
  28. text="LMAO",
  29. pub_date=datetime.datetime(2010, 7, 28, 10, 10, 10),
  30. )
  31. a3.comments.create(
  32. text="+1",
  33. pub_date=datetime.datetime(2005, 8, 29, 10, 10, 10),
  34. )
  35. c = Category.objects.create(name="serious-news")
  36. c.articles.add(a1, a3)
  37. self.assertSequenceEqual(
  38. Comment.objects.datetimes("article__pub_date", "year"),
  39. [
  40. datetime.datetime(2005, 1, 1),
  41. datetime.datetime(2010, 1, 1),
  42. ],
  43. )
  44. self.assertSequenceEqual(
  45. Comment.objects.datetimes("article__pub_date", "month"),
  46. [
  47. datetime.datetime(2005, 7, 1),
  48. datetime.datetime(2010, 7, 1),
  49. ],
  50. )
  51. self.assertSequenceEqual(
  52. Comment.objects.datetimes("article__pub_date", "week"),
  53. [
  54. datetime.datetime(2005, 7, 25),
  55. datetime.datetime(2010, 7, 26),
  56. ],
  57. )
  58. self.assertSequenceEqual(
  59. Comment.objects.datetimes("article__pub_date", "day"),
  60. [
  61. datetime.datetime(2005, 7, 28),
  62. datetime.datetime(2010, 7, 28),
  63. ],
  64. )
  65. self.assertSequenceEqual(
  66. Article.objects.datetimes("comments__pub_date", "day"),
  67. [
  68. datetime.datetime(2005, 7, 28),
  69. datetime.datetime(2005, 7, 29),
  70. datetime.datetime(2005, 8, 29),
  71. datetime.datetime(2010, 7, 28),
  72. ],
  73. )
  74. self.assertSequenceEqual(
  75. Article.objects.datetimes("comments__approval_date", "day"), []
  76. )
  77. self.assertSequenceEqual(
  78. Category.objects.datetimes("articles__pub_date", "day"),
  79. [
  80. datetime.datetime(2005, 7, 28),
  81. ],
  82. )
  83. @override_settings(USE_TZ=True)
  84. def test_21432(self):
  85. now = timezone.localtime(timezone.now().replace(microsecond=0))
  86. Article.objects.create(title="First one", pub_date=now)
  87. qs = Article.objects.datetimes("pub_date", "second")
  88. self.assertEqual(qs[0], now)
  89. def test_datetimes_returns_available_dates_for_given_scope_and_given_field(self):
  90. pub_dates = [
  91. datetime.datetime(2005, 7, 28, 12, 15),
  92. datetime.datetime(2005, 7, 29, 2, 15),
  93. datetime.datetime(2005, 7, 30, 5, 15),
  94. datetime.datetime(2005, 7, 31, 19, 15),
  95. ]
  96. for i, pub_date in enumerate(pub_dates):
  97. Article(pub_date=pub_date, title="title #{}".format(i)).save()
  98. self.assertSequenceEqual(
  99. Article.objects.datetimes("pub_date", "year"),
  100. [datetime.datetime(2005, 1, 1, 0, 0)],
  101. )
  102. self.assertSequenceEqual(
  103. Article.objects.datetimes("pub_date", "month"),
  104. [datetime.datetime(2005, 7, 1, 0, 0)],
  105. )
  106. self.assertSequenceEqual(
  107. Article.objects.datetimes("pub_date", "week"),
  108. [datetime.datetime(2005, 7, 25, 0, 0)],
  109. )
  110. self.assertSequenceEqual(
  111. Article.objects.datetimes("pub_date", "day"),
  112. [
  113. datetime.datetime(2005, 7, 28, 0, 0),
  114. datetime.datetime(2005, 7, 29, 0, 0),
  115. datetime.datetime(2005, 7, 30, 0, 0),
  116. datetime.datetime(2005, 7, 31, 0, 0),
  117. ],
  118. )
  119. self.assertSequenceEqual(
  120. Article.objects.datetimes("pub_date", "day", order="ASC"),
  121. [
  122. datetime.datetime(2005, 7, 28, 0, 0),
  123. datetime.datetime(2005, 7, 29, 0, 0),
  124. datetime.datetime(2005, 7, 30, 0, 0),
  125. datetime.datetime(2005, 7, 31, 0, 0),
  126. ],
  127. )
  128. self.assertSequenceEqual(
  129. Article.objects.datetimes("pub_date", "day", order="DESC"),
  130. [
  131. datetime.datetime(2005, 7, 31, 0, 0),
  132. datetime.datetime(2005, 7, 30, 0, 0),
  133. datetime.datetime(2005, 7, 29, 0, 0),
  134. datetime.datetime(2005, 7, 28, 0, 0),
  135. ],
  136. )
  137. def test_datetimes_has_lazy_iterator(self):
  138. pub_dates = [
  139. datetime.datetime(2005, 7, 28, 12, 15),
  140. datetime.datetime(2005, 7, 29, 2, 15),
  141. datetime.datetime(2005, 7, 30, 5, 15),
  142. datetime.datetime(2005, 7, 31, 19, 15),
  143. ]
  144. for i, pub_date in enumerate(pub_dates):
  145. Article(pub_date=pub_date, title="title #{}".format(i)).save()
  146. # Use iterator() with datetimes() to return a generator that lazily
  147. # requests each result one at a time, to save memory.
  148. dates = []
  149. with self.assertNumQueries(0):
  150. article_datetimes_iterator = Article.objects.datetimes(
  151. "pub_date", "day", order="DESC"
  152. ).iterator()
  153. with self.assertNumQueries(1):
  154. for article in article_datetimes_iterator:
  155. dates.append(article)
  156. self.assertEqual(
  157. dates,
  158. [
  159. datetime.datetime(2005, 7, 31, 0, 0),
  160. datetime.datetime(2005, 7, 30, 0, 0),
  161. datetime.datetime(2005, 7, 29, 0, 0),
  162. datetime.datetime(2005, 7, 28, 0, 0),
  163. ],
  164. )
  165. def test_datetimes_disallows_date_fields(self):
  166. dt = datetime.datetime(2005, 7, 28, 12, 15)
  167. Article.objects.create(
  168. pub_date=dt,
  169. published_on=dt.date(),
  170. title="Don't put dates into datetime functions!",
  171. )
  172. with self.assertRaisesMessage(
  173. ValueError, "Cannot truncate DateField 'published_on' to DateTimeField"
  174. ):
  175. list(Article.objects.datetimes("published_on", "second"))
  176. def test_datetimes_fails_when_given_invalid_kind_argument(self):
  177. msg = (
  178. "'kind' must be one of 'year', 'month', 'week', 'day', 'hour', "
  179. "'minute', or 'second'."
  180. )
  181. with self.assertRaisesMessage(ValueError, msg):
  182. Article.objects.datetimes("pub_date", "bad_kind")
  183. def test_datetimes_fails_when_given_invalid_order_argument(self):
  184. msg = "'order' must be either 'ASC' or 'DESC'."
  185. with self.assertRaisesMessage(ValueError, msg):
  186. Article.objects.datetimes("pub_date", "year", order="bad order")