summaryrefslogtreecommitdiff
path: root/tests/model_fields
diff options
context:
space:
mode:
Diffstat (limited to 'tests/model_fields')
-rw-r--r--tests/model_fields/models.py4
-rw-r--r--tests/model_fields/test_durationfield.py67
2 files changed, 71 insertions, 0 deletions
diff --git a/tests/model_fields/models.py b/tests/model_fields/models.py
index bb75208905..e9e287f04f 100644
--- a/tests/model_fields/models.py
+++ b/tests/model_fields/models.py
@@ -121,6 +121,10 @@ class DateTimeModel(models.Model):
t = models.TimeField()
+class DurationModel(models.Model):
+ field = models.DurationField()
+
+
class PrimaryKeyCharModel(models.Model):
string = models.CharField(max_length=10, primary_key=True)
diff --git a/tests/model_fields/test_durationfield.py b/tests/model_fields/test_durationfield.py
new file mode 100644
index 0000000000..fc2c22af61
--- /dev/null
+++ b/tests/model_fields/test_durationfield.py
@@ -0,0 +1,67 @@
+import datetime
+import json
+
+from django.core import exceptions, serializers
+from django.db import models
+from django.test import TestCase
+
+from .models import DurationModel
+
+
+class TestSaveLoad(TestCase):
+
+ def test_simple_roundtrip(self):
+ duration = datetime.timedelta(days=123, seconds=123, microseconds=123)
+ DurationModel.objects.create(field=duration)
+ loaded = DurationModel.objects.get()
+ self.assertEqual(loaded.field, duration)
+
+
+class TestQuerying(TestCase):
+
+ @classmethod
+ def setUpTestData(cls):
+ cls.objs = [
+ DurationModel.objects.create(field=datetime.timedelta(days=1)),
+ DurationModel.objects.create(field=datetime.timedelta(seconds=1)),
+ DurationModel.objects.create(field=datetime.timedelta(seconds=-1)),
+ ]
+
+ def test_exact(self):
+ self.assertSequenceEqual(
+ DurationModel.objects.filter(field=datetime.timedelta(days=1)),
+ [self.objs[0]]
+ )
+
+ def test_gt(self):
+ self.assertSequenceEqual(
+ DurationModel.objects.filter(field__gt=datetime.timedelta(days=0)),
+ [self.objs[0], self.objs[1]]
+ )
+
+
+class TestSerialization(TestCase):
+ test_data = '[{"fields": {"field": "1 01:00:00"}, "model": "model_fields.durationmodel", "pk": null}]'
+
+ def test_dumping(self):
+ instance = DurationModel(field=datetime.timedelta(days=1, hours=1))
+ data = serializers.serialize('json', [instance])
+ self.assertEqual(json.loads(data), json.loads(self.test_data))
+
+ def test_loading(self):
+ instance = list(serializers.deserialize('json', self.test_data))[0].object
+ self.assertEqual(instance.field, datetime.timedelta(days=1, hours=1))
+
+
+class TestValidation(TestCase):
+
+ def test_invalid_string(self):
+ field = models.DurationField()
+ with self.assertRaises(exceptions.ValidationError) as cm:
+ field.clean('not a datetime', None)
+ self.assertEqual(cm.exception.code, 'invalid')
+ self.assertEqual(
+ cm.exception.message % cm.exception.params,
+ "'not a datetime' value has an invalid format. "
+ "It must be in [DD] [HH:[MM:]]ss[.uuuuuu] format."
+ )