test_durationfield.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import datetime
  2. from django.core.exceptions import ValidationError
  3. from django.forms import DurationField
  4. from django.test import SimpleTestCase
  5. from django.utils.duration import duration_string
  6. from . import FormFieldAssertionsMixin
  7. class DurationFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
  8. def test_durationfield_clean(self):
  9. f = DurationField()
  10. self.assertEqual(datetime.timedelta(seconds=30), f.clean('30'))
  11. self.assertEqual(datetime.timedelta(minutes=15, seconds=30), f.clean('15:30'))
  12. self.assertEqual(datetime.timedelta(hours=1, minutes=15, seconds=30), f.clean('1:15:30'))
  13. self.assertEqual(
  14. datetime.timedelta(days=1, hours=1, minutes=15, seconds=30, milliseconds=300),
  15. f.clean('1 1:15:30.3')
  16. )
  17. def test_overflow(self):
  18. msg = "The number of days must be between {min_days} and {max_days}.".format(
  19. min_days=datetime.timedelta.min.days,
  20. max_days=datetime.timedelta.max.days,
  21. )
  22. f = DurationField()
  23. with self.assertRaisesMessage(ValidationError, msg):
  24. f.clean('1000000000 00:00:00')
  25. with self.assertRaisesMessage(ValidationError, msg):
  26. f.clean('-1000000000 00:00:00')
  27. def test_durationfield_render(self):
  28. self.assertWidgetRendersTo(
  29. DurationField(initial=datetime.timedelta(hours=1)),
  30. '<input id="id_f" type="text" name="f" value="01:00:00" required>',
  31. )
  32. def test_durationfield_integer_value(self):
  33. f = DurationField()
  34. self.assertEqual(datetime.timedelta(0, 10800), f.clean(10800))
  35. def test_durationfield_prepare_value(self):
  36. field = DurationField()
  37. td = datetime.timedelta(minutes=15, seconds=30)
  38. self.assertEqual(field.prepare_value(td), duration_string(td))
  39. self.assertEqual(field.prepare_value('arbitrary'), 'arbitrary')
  40. self.assertIsNone(field.prepare_value(None))