diff options
author | Florian Apolloner <florian@apolloner.eu> | 2013-02-26 09:53:47 +0100 |
---|---|---|
committer | Florian Apolloner <florian@apolloner.eu> | 2013-02-26 14:36:57 +0100 |
commit | 89f40e36246100df6a11316c31a76712ebc6c501 (patch) | |
tree | 6e65639683ddaf2027908d1ecb1739e0e2ff853b /tests/datatypes | |
parent | b3d2ccb5bfbaf6e7fe1f98843baaa48c35a70950 (diff) | |
download | django-89f40e36246100df6a11316c31a76712ebc6c501.tar.gz |
Merged regressiontests and modeltests into the test root.
Diffstat (limited to 'tests/datatypes')
-rw-r--r-- | tests/datatypes/__init__.py | 0 | ||||
-rw-r--r-- | tests/datatypes/models.py | 28 | ||||
-rw-r--r-- | tests/datatypes/tests.py | 96 |
3 files changed, 124 insertions, 0 deletions
diff --git a/tests/datatypes/__init__.py b/tests/datatypes/__init__.py new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/tests/datatypes/__init__.py diff --git a/tests/datatypes/models.py b/tests/datatypes/models.py new file mode 100644 index 0000000000..8e6027dd0f --- /dev/null +++ b/tests/datatypes/models.py @@ -0,0 +1,28 @@ +""" +This is a basic model to test saving and loading boolean and date-related +types, which in the past were problematic for some database backends. +""" + +from django.db import models +from django.utils.encoding import python_2_unicode_compatible + + +@python_2_unicode_compatible +class Donut(models.Model): + name = models.CharField(max_length=100) + is_frosted = models.BooleanField(default=False) + has_sprinkles = models.NullBooleanField() + baked_date = models.DateField(null=True) + baked_time = models.TimeField(null=True) + consumed_at = models.DateTimeField(null=True) + review = models.TextField() + + class Meta: + ordering = ('consumed_at',) + + def __str__(self): + return self.name + +class RumBaba(models.Model): + baked_date = models.DateField(auto_now_add=True) + baked_timestamp = models.DateTimeField(auto_now_add=True) diff --git a/tests/datatypes/tests.py b/tests/datatypes/tests.py new file mode 100644 index 0000000000..f0ec5f3c0a --- /dev/null +++ b/tests/datatypes/tests.py @@ -0,0 +1,96 @@ +from __future__ import absolute_import, unicode_literals + +import datetime + +from django.test import TestCase, skipIfDBFeature +from django.utils import six +from django.utils.timezone import utc + +from .models import Donut, RumBaba + + +class DataTypesTestCase(TestCase): + + def test_boolean_type(self): + d = Donut(name='Apple Fritter') + self.assertFalse(d.is_frosted) + self.assertTrue(d.has_sprinkles is None) + d.has_sprinkles = True + self.assertTrue(d.has_sprinkles) + + d.save() + + d2 = Donut.objects.get(name='Apple Fritter') + self.assertFalse(d2.is_frosted) + self.assertTrue(d2.has_sprinkles) + + def test_date_type(self): + d = Donut(name='Apple Fritter') + d.baked_date = datetime.date(year=1938, month=6, day=4) + d.baked_time = datetime.time(hour=5, minute=30) + d.consumed_at = datetime.datetime(year=2007, month=4, day=20, hour=16, minute=19, second=59) + d.save() + + d2 = Donut.objects.get(name='Apple Fritter') + self.assertEqual(d2.baked_date, datetime.date(1938, 6, 4)) + self.assertEqual(d2.baked_time, datetime.time(5, 30)) + self.assertEqual(d2.consumed_at, datetime.datetime(2007, 4, 20, 16, 19, 59)) + + def test_time_field(self): + #Test for ticket #12059: TimeField wrongly handling datetime.datetime object. + d = Donut(name='Apple Fritter') + d.baked_time = datetime.datetime(year=2007, month=4, day=20, hour=16, minute=19, second=59) + d.save() + + d2 = Donut.objects.get(name='Apple Fritter') + self.assertEqual(d2.baked_time, datetime.time(16, 19, 59)) + + def test_year_boundaries(self): + """Year boundary tests (ticket #3689)""" + d = Donut.objects.create(name='Date Test 2007', + baked_date=datetime.datetime(year=2007, month=12, day=31), + consumed_at=datetime.datetime(year=2007, month=12, day=31, hour=23, minute=59, second=59)) + d1 = Donut.objects.create(name='Date Test 2006', + baked_date=datetime.datetime(year=2006, month=1, day=1), + consumed_at=datetime.datetime(year=2006, month=1, day=1)) + + self.assertEqual("Date Test 2007", + Donut.objects.filter(baked_date__year=2007)[0].name) + + self.assertEqual("Date Test 2006", + Donut.objects.filter(baked_date__year=2006)[0].name) + + d2 = Donut.objects.create(name='Apple Fritter', + consumed_at = datetime.datetime(year=2007, month=4, day=20, hour=16, minute=19, second=59)) + + self.assertEqual(['Apple Fritter', 'Date Test 2007'], + list(Donut.objects.filter(consumed_at__year=2007).order_by('name').values_list('name', flat=True))) + + self.assertEqual(0, Donut.objects.filter(consumed_at__year=2005).count()) + self.assertEqual(0, Donut.objects.filter(consumed_at__year=2008).count()) + + def test_textfields_unicode(self): + """Regression test for #10238: TextField values returned from the + database should be unicode.""" + d = Donut.objects.create(name='Jelly Donut', review='Outstanding') + newd = Donut.objects.get(id=d.id) + self.assertTrue(isinstance(newd.review, six.text_type)) + + @skipIfDBFeature('supports_timezones') + def test_error_on_timezone(self): + """Regression test for #8354: the MySQL and Oracle backends should raise + an error if given a timezone-aware datetime object.""" + dt = datetime.datetime(2008, 8, 31, 16, 20, tzinfo=utc) + d = Donut(name='Bear claw', consumed_at=dt) + self.assertRaises(ValueError, d.save) + # ValueError: MySQL backend does not support timezone-aware datetimes. + + def test_datefield_auto_now_add(self): + """Regression test for #10970, auto_now_add for DateField should store + a Python datetime.date, not a datetime.datetime""" + b = RumBaba.objects.create() + # Verify we didn't break DateTimeField behavior + self.assertTrue(isinstance(b.baked_timestamp, datetime.datetime)) + # We need to test this this way because datetime.datetime inherits + # from datetime.date: + self.assertTrue(isinstance(b.baked_date, datetime.date) and not isinstance(b.baked_date, datetime.datetime)) |