1import datetime
2
3from django.core.exceptions import ValidationError
4from django.forms import DurationField
5from django.test import SimpleTestCase
6from django.utils import translation
7from django.utils.duration import duration_string
8
9from . import FormFieldAssertionsMixin
10
11
12class DurationFieldTest(FormFieldAssertionsMixin, SimpleTestCase):
13 def test_durationfield_clean(self):
14 f = DurationField()
15 self.assertEqual(datetime.timedelta(seconds=30), f.clean("30"))
16 self.assertEqual(datetime.timedelta(minutes=15, seconds=30), f.clean("15:30"))
17 self.assertEqual(
18 datetime.timedelta(hours=1, minutes=15, seconds=30), f.clean("1:15:30")
19 )
20 self.assertEqual(
21 datetime.timedelta(
22 days=1, hours=1, minutes=15, seconds=30, milliseconds=300
23 ),
24 f.clean("1 1:15:30.3"),
25 )
26
27 def test_overflow(self):
28 msg = "The number of days must be between {min_days} and {max_days}.".format(
29 min_days=datetime.timedelta.min.days,
30 max_days=datetime.timedelta.max.days,
31 )
32 f = DurationField()
33 with self.assertRaisesMessage(ValidationError, msg):
34 f.clean("1000000000 00:00:00")
35 with self.assertRaisesMessage(ValidationError, msg):
36 f.clean("-1000000000 00:00:00")
37
38 def test_overflow_translation(self):
39 msg = "Le nombre de jours doit être entre {min_days} et {max_days}.".format(
40 min_days=datetime.timedelta.min.days,
41 max_days=datetime.timedelta.max.days,
42 )
43 with translation.override("fr"):
44 with self.assertRaisesMessage(ValidationError, msg):
45 DurationField().clean("1000000000 00:00:00")
46
47 def test_durationfield_render(self):
48 self.assertWidgetRendersTo(
49 DurationField(initial=datetime.timedelta(hours=1)),
50 '<input id="id_f" type="text" name="f" value="01:00:00" required>',
51 )
52
53 def test_durationfield_integer_value(self):
54 f = DurationField()
55 self.assertEqual(datetime.timedelta(0, 10800), f.clean(10800))
56
57 def test_durationfield_prepare_value(self):
58 field = DurationField()
59 td = datetime.timedelta(minutes=15, seconds=30)
60 self.assertEqual(field.prepare_value(td), duration_string(td))
61 self.assertEqual(field.prepare_value("arbitrary"), "arbitrary")
62 self.assertIsNone(field.prepare_value(None))