summaryrefslogtreecommitdiff
path: root/tests/forms_tests/field_tests/test_datetimefield.py
blob: 50f1d8e5574dcc9b279613e3a9a1a4927627a8fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
from datetime import date, datetime

from django.forms import DateTimeField, ValidationError
from django.test import SimpleTestCase
from django.utils.timezone import get_fixed_timezone, utc


class DateTimeFieldTest(SimpleTestCase):

    def test_datetimefield_clean(self):
        tests = [
            (date(2006, 10, 25), datetime(2006, 10, 25, 0, 0)),
            (datetime(2006, 10, 25, 14, 30), datetime(2006, 10, 25, 14, 30)),
            (datetime(2006, 10, 25, 14, 30, 59), datetime(2006, 10, 25, 14, 30, 59)),
            (
                datetime(2006, 10, 25, 14, 30, 59, 200),
                datetime(2006, 10, 25, 14, 30, 59, 200),
            ),
            ('2006-10-25 14:30:45.000200', datetime(2006, 10, 25, 14, 30, 45, 200)),
            ('2006-10-25 14:30:45.0002', datetime(2006, 10, 25, 14, 30, 45, 200)),
            ('2006-10-25 14:30:45', datetime(2006, 10, 25, 14, 30, 45)),
            ('2006-10-25 14:30:00', datetime(2006, 10, 25, 14, 30)),
            ('2006-10-25 14:30', datetime(2006, 10, 25, 14, 30)),
            ('2006-10-25', datetime(2006, 10, 25, 0, 0)),
            ('10/25/2006 14:30:45.000200', datetime(2006, 10, 25, 14, 30, 45, 200)),
            ('10/25/2006 14:30:45', datetime(2006, 10, 25, 14, 30, 45)),
            ('10/25/2006 14:30:00', datetime(2006, 10, 25, 14, 30)),
            ('10/25/2006 14:30', datetime(2006, 10, 25, 14, 30)),
            ('10/25/2006', datetime(2006, 10, 25, 0, 0)),
            ('10/25/06 14:30:45.000200', datetime(2006, 10, 25, 14, 30, 45, 200)),
            ('10/25/06 14:30:45', datetime(2006, 10, 25, 14, 30, 45)),
            ('10/25/06 14:30:00', datetime(2006, 10, 25, 14, 30)),
            ('10/25/06 14:30', datetime(2006, 10, 25, 14, 30)),
            ('10/25/06', datetime(2006, 10, 25, 0, 0)),
            # ISO 8601 formats.
            (
                '2014-09-23T22:34:41.614804',
                datetime(2014, 9, 23, 22, 34, 41, 614804),
            ),
            ('2014-09-23T22:34:41', datetime(2014, 9, 23, 22, 34, 41)),
            ('2014-09-23T22:34', datetime(2014, 9, 23, 22, 34)),
            ('2014-09-23', datetime(2014, 9, 23, 0, 0)),
            ('2014-09-23T22:34Z', datetime(2014, 9, 23, 22, 34, tzinfo=utc)),
            (
                '2014-09-23T22:34+07:00',
                datetime(2014, 9, 23, 22, 34, tzinfo=get_fixed_timezone(420)),
            ),
            # Whitespace stripping.
            (' 2006-10-25   14:30:45 ', datetime(2006, 10, 25, 14, 30, 45)),
            (' 2006-10-25 ', datetime(2006, 10, 25, 0, 0)),
            (' 10/25/2006 14:30:45 ', datetime(2006, 10, 25, 14, 30, 45)),
            (' 10/25/2006 14:30 ', datetime(2006, 10, 25, 14, 30)),
            (' 10/25/2006 ', datetime(2006, 10, 25, 0, 0)),
            (' 10/25/06 14:30:45 ', datetime(2006, 10, 25, 14, 30, 45)),
            (' 10/25/06 ', datetime(2006, 10, 25, 0, 0)),
            (
                ' 2014-09-23T22:34:41.614804 ',
                datetime(2014, 9, 23, 22, 34, 41, 614804),
            ),
            (' 2014-09-23T22:34Z ', datetime(2014, 9, 23, 22, 34, tzinfo=utc)),
        ]
        f = DateTimeField()
        for value, expected_datetime in tests:
            with self.subTest(value=value):
                self.assertEqual(f.clean(value), expected_datetime)

    def test_datetimefield_clean_invalid(self):
        f = DateTimeField()
        msg = "'Enter a valid date/time.'"
        with self.assertRaisesMessage(ValidationError, msg):
            f.clean('hello')
        with self.assertRaisesMessage(ValidationError, msg):
            f.clean('2006-10-25 4:30 p.m.')
        with self.assertRaisesMessage(ValidationError, msg):
            f.clean('   ')
        with self.assertRaisesMessage(ValidationError, msg):
            f.clean('2014-09-23T28:23')
        f = DateTimeField(input_formats=['%Y %m %d %I:%M %p'])
        with self.assertRaisesMessage(ValidationError, msg):
            f.clean('2006.10.25 14:30:45')

    def test_datetimefield_clean_input_formats(self):
        tests = [
            ('%Y %m %d %I:%M %p', (
                (date(2006, 10, 25), datetime(2006, 10, 25, 0, 0)),
                (datetime(2006, 10, 25, 14, 30), datetime(2006, 10, 25, 14, 30)),
                (
                    datetime(2006, 10, 25, 14, 30, 59),
                    datetime(2006, 10, 25, 14, 30, 59),
                ),
                (
                    datetime(2006, 10, 25, 14, 30, 59, 200),
                    datetime(2006, 10, 25, 14, 30, 59, 200),
                ),
                ('2006 10 25 2:30 PM', datetime(2006, 10, 25, 14, 30)),
                # ISO-like formats are always accepted.
                ('2006-10-25 14:30:45', datetime(2006, 10, 25, 14, 30, 45)),
            )),
            ('%Y.%m.%d %H:%M:%S.%f', (
                (
                    '2006.10.25 14:30:45.0002',
                    datetime(2006, 10, 25, 14, 30, 45, 200),
                ),
            )),
        ]
        f = DateTimeField()
        for input_format, values in tests:
            f = DateTimeField(input_formats=[input_format])
            for value, expected_datetime in values:
                with self.subTest(value=value, input_format=input_format):
                    self.assertEqual(f.clean(value), expected_datetime)

    def test_datetimefield_not_required(self):
        f = DateTimeField(required=False)
        self.assertIsNone(f.clean(None))
        self.assertEqual('None', repr(f.clean(None)))
        self.assertIsNone(f.clean(''))
        self.assertEqual('None', repr(f.clean('')))

    def test_datetimefield_changed(self):
        f = DateTimeField(input_formats=['%Y %m %d %I:%M %p'])
        d = datetime(2006, 9, 17, 14, 30, 0)
        self.assertFalse(f.has_changed(d, '2006 09 17 2:30 PM'))