test_durationfield.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import datetime
  2. import json
  3. from django.core import exceptions, serializers
  4. from django.db import models
  5. from django.test import TestCase
  6. from .models import DurationModel
  7. class TestSaveLoad(TestCase):
  8. def test_simple_roundtrip(self):
  9. duration = datetime.timedelta(days=123, seconds=123, microseconds=123)
  10. DurationModel.objects.create(field=duration)
  11. loaded = DurationModel.objects.get()
  12. self.assertEqual(loaded.field, duration)
  13. class TestQuerying(TestCase):
  14. @classmethod
  15. def setUpTestData(cls):
  16. cls.objs = [
  17. DurationModel.objects.create(field=datetime.timedelta(days=1)),
  18. DurationModel.objects.create(field=datetime.timedelta(seconds=1)),
  19. DurationModel.objects.create(field=datetime.timedelta(seconds=-1)),
  20. ]
  21. def test_exact(self):
  22. self.assertSequenceEqual(
  23. DurationModel.objects.filter(field=datetime.timedelta(days=1)),
  24. [self.objs[0]]
  25. )
  26. def test_gt(self):
  27. self.assertSequenceEqual(
  28. DurationModel.objects.filter(field__gt=datetime.timedelta(days=0)),
  29. [self.objs[0], self.objs[1]]
  30. )
  31. class TestSerialization(TestCase):
  32. test_data = '[{"fields": {"field": "1 01:00:00"}, "model": "model_fields.durationmodel", "pk": null}]'
  33. def test_dumping(self):
  34. instance = DurationModel(field=datetime.timedelta(days=1, hours=1))
  35. data = serializers.serialize('json', [instance])
  36. self.assertEqual(json.loads(data), json.loads(self.test_data))
  37. def test_loading(self):
  38. instance = list(serializers.deserialize('json', self.test_data))[0].object
  39. self.assertEqual(instance.field, datetime.timedelta(days=1, hours=1))
  40. class TestValidation(TestCase):
  41. def test_invalid_string(self):
  42. field = models.DurationField()
  43. with self.assertRaises(exceptions.ValidationError) as cm:
  44. field.clean('not a datetime', None)
  45. self.assertEqual(cm.exception.code, 'invalid')
  46. self.assertEqual(
  47. cm.exception.message % cm.exception.params,
  48. "'not a datetime' value has an invalid format. "
  49. "It must be in [DD] [HH:[MM:]]ss[.uuuuuu] format."
  50. )