tests.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import datetime
  2. from django.test import TestCase, skipIfDBFeature
  3. from .models import Donut, RumBaba
  4. class DataTypesTestCase(TestCase):
  5. def test_boolean_type(self):
  6. d = Donut(name="Apple Fritter")
  7. self.assertFalse(d.is_frosted)
  8. self.assertIsNone(d.has_sprinkles)
  9. d.has_sprinkles = True
  10. self.assertTrue(d.has_sprinkles)
  11. d.save()
  12. d2 = Donut.objects.get(name="Apple Fritter")
  13. self.assertFalse(d2.is_frosted)
  14. self.assertTrue(d2.has_sprinkles)
  15. def test_date_type(self):
  16. d = Donut(name="Apple Fritter")
  17. d.baked_date = datetime.date(year=1938, month=6, day=4)
  18. d.baked_time = datetime.time(hour=5, minute=30)
  19. d.consumed_at = datetime.datetime(
  20. year=2007, month=4, day=20, hour=16, minute=19, second=59
  21. )
  22. d.save()
  23. d2 = Donut.objects.get(name="Apple Fritter")
  24. self.assertEqual(d2.baked_date, datetime.date(1938, 6, 4))
  25. self.assertEqual(d2.baked_time, datetime.time(5, 30))
  26. self.assertEqual(d2.consumed_at, datetime.datetime(2007, 4, 20, 16, 19, 59))
  27. def test_time_field(self):
  28. # Test for ticket #12059: TimeField wrongly handling datetime.datetime object.
  29. d = Donut(name="Apple Fritter")
  30. d.baked_time = datetime.datetime(
  31. year=2007, month=4, day=20, hour=16, minute=19, second=59
  32. )
  33. d.save()
  34. d2 = Donut.objects.get(name="Apple Fritter")
  35. self.assertEqual(d2.baked_time, datetime.time(16, 19, 59))
  36. def test_year_boundaries(self):
  37. """Year boundary tests (ticket #3689)"""
  38. Donut.objects.create(
  39. name="Date Test 2007",
  40. baked_date=datetime.datetime(year=2007, month=12, day=31),
  41. consumed_at=datetime.datetime(
  42. year=2007, month=12, day=31, hour=23, minute=59, second=59
  43. ),
  44. )
  45. Donut.objects.create(
  46. name="Date Test 2006",
  47. baked_date=datetime.datetime(year=2006, month=1, day=1),
  48. consumed_at=datetime.datetime(year=2006, month=1, day=1),
  49. )
  50. self.assertEqual(
  51. "Date Test 2007", Donut.objects.filter(baked_date__year=2007)[0].name
  52. )
  53. self.assertEqual(
  54. "Date Test 2006", Donut.objects.filter(baked_date__year=2006)[0].name
  55. )
  56. Donut.objects.create(
  57. name="Apple Fritter",
  58. consumed_at=datetime.datetime(
  59. year=2007, month=4, day=20, hour=16, minute=19, second=59
  60. ),
  61. )
  62. self.assertEqual(
  63. ["Apple Fritter", "Date Test 2007"],
  64. list(
  65. Donut.objects.filter(consumed_at__year=2007)
  66. .order_by("name")
  67. .values_list("name", flat=True)
  68. ),
  69. )
  70. self.assertEqual(0, Donut.objects.filter(consumed_at__year=2005).count())
  71. self.assertEqual(0, Donut.objects.filter(consumed_at__year=2008).count())
  72. def test_textfields_str(self):
  73. """TextField values returned from the database should be str."""
  74. d = Donut.objects.create(name="Jelly Donut", review="Outstanding")
  75. newd = Donut.objects.get(id=d.id)
  76. self.assertIsInstance(newd.review, str)
  77. @skipIfDBFeature("supports_timezones")
  78. def test_error_on_timezone(self):
  79. """Regression test for #8354: the MySQL and Oracle backends should raise
  80. an error if given a timezone-aware datetime object."""
  81. dt = datetime.datetime(2008, 8, 31, 16, 20, tzinfo=datetime.UTC)
  82. d = Donut(name="Bear claw", consumed_at=dt)
  83. # MySQL backend does not support timezone-aware datetimes.
  84. with self.assertRaises(ValueError):
  85. d.save()
  86. def test_datefield_auto_now_add(self):
  87. """Regression test for #10970, auto_now_add for DateField should store
  88. a Python datetime.date, not a datetime.datetime"""
  89. b = RumBaba.objects.create()
  90. # Verify we didn't break DateTimeField behavior
  91. self.assertIsInstance(b.baked_timestamp, datetime.datetime)
  92. # We need to test this way because datetime.datetime inherits
  93. # from datetime.date:
  94. self.assertIsInstance(b.baked_date, datetime.date)
  95. self.assertNotIsInstance(b.baked_date, datetime.datetime)