summaryrefslogtreecommitdiff
path: root/tests/utils_tests/test_dateparse.py
blob: 0f48ff4ff9820ca6500143c8b29eff7cdf11a169 (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
import unittest
from datetime import date, datetime, time, timedelta

from django.utils.dateparse import (
    parse_date, parse_datetime, parse_duration, parse_time,
)
from django.utils.timezone import get_fixed_timezone


class DateParseTests(unittest.TestCase):

    def test_parse_date(self):
        # Valid inputs
        self.assertEqual(parse_date('2012-04-23'), date(2012, 4, 23))
        self.assertEqual(parse_date('2012-4-9'), date(2012, 4, 9))
        # Invalid inputs
        self.assertIsNone(parse_date('20120423'))
        with self.assertRaises(ValueError):
            parse_date('2012-04-56')

    def test_parse_time(self):
        # Valid inputs
        self.assertEqual(parse_time('09:15:00'), time(9, 15))
        self.assertEqual(parse_time('10:10'), time(10, 10))
        self.assertEqual(parse_time('10:20:30.400'), time(10, 20, 30, 400000))
        self.assertEqual(parse_time('4:8:16'), time(4, 8, 16))
        # Invalid inputs
        self.assertIsNone(parse_time('091500'))
        with self.assertRaises(ValueError):
            parse_time('09:15:90')

    def test_parse_datetime(self):
        # Valid inputs
        self.assertEqual(
            parse_datetime('2012-04-23T09:15:00'),
            datetime(2012, 4, 23, 9, 15)
        )
        self.assertEqual(
            parse_datetime('2012-4-9 4:8:16'),
            datetime(2012, 4, 9, 4, 8, 16)
        )
        self.assertEqual(
            parse_datetime('2012-04-23T09:15:00Z'),
            datetime(2012, 4, 23, 9, 15, 0, 0, get_fixed_timezone(0))
        )
        self.assertEqual(
            parse_datetime('2012-4-9 4:8:16-0320'),
            datetime(2012, 4, 9, 4, 8, 16, 0, get_fixed_timezone(-200))
        )
        self.assertEqual(
            parse_datetime('2012-04-23T10:20:30.400+02:30'),
            datetime(2012, 4, 23, 10, 20, 30, 400000, get_fixed_timezone(150))
        )
        self.assertEqual(
            parse_datetime('2012-04-23T10:20:30.400+02'),
            datetime(2012, 4, 23, 10, 20, 30, 400000, get_fixed_timezone(120))
        )
        self.assertEqual(
            parse_datetime('2012-04-23T10:20:30.400-02'),
            datetime(2012, 4, 23, 10, 20, 30, 400000, get_fixed_timezone(-120))
        )
        # Invalid inputs
        self.assertIsNone(parse_datetime('20120423091500'))
        with self.assertRaises(ValueError):
            parse_datetime('2012-04-56T09:15:90')


class DurationParseTests(unittest.TestCase):

    def test_parse_python_format(self):
        timedeltas = [
            timedelta(days=4, minutes=15, seconds=30, milliseconds=100),  # fractions of seconds
            timedelta(hours=10, minutes=15, seconds=30),  # hours, minutes, seconds
            timedelta(days=4, minutes=15, seconds=30),  # multiple days
            timedelta(days=1, minutes=00, seconds=00),  # single day
            timedelta(days=-4, minutes=15, seconds=30),  # negative durations
            timedelta(minutes=15, seconds=30),  # minute & seconds
            timedelta(seconds=30),  # seconds
        ]
        for delta in timedeltas:
            self.assertEqual(parse_duration(format(delta)), delta)

    def test_seconds(self):
        self.assertEqual(parse_duration('30'), timedelta(seconds=30))

    def test_minutes_seconds(self):
        self.assertEqual(parse_duration('15:30'), timedelta(minutes=15, seconds=30))
        self.assertEqual(parse_duration('5:30'), timedelta(minutes=5, seconds=30))

    def test_hours_minutes_seconds(self):
        self.assertEqual(parse_duration('10:15:30'), timedelta(hours=10, minutes=15, seconds=30))
        self.assertEqual(parse_duration('1:15:30'), timedelta(hours=1, minutes=15, seconds=30))
        self.assertEqual(parse_duration('100:200:300'), timedelta(hours=100, minutes=200, seconds=300))

    def test_days(self):
        self.assertEqual(parse_duration('4 15:30'), timedelta(days=4, minutes=15, seconds=30))
        self.assertEqual(parse_duration('4 10:15:30'), timedelta(days=4, hours=10, minutes=15, seconds=30))

    def test_fractions_of_seconds(self):
        self.assertEqual(parse_duration('15:30.1'), timedelta(minutes=15, seconds=30, milliseconds=100))
        self.assertEqual(parse_duration('15:30.01'), timedelta(minutes=15, seconds=30, milliseconds=10))
        self.assertEqual(parse_duration('15:30.001'), timedelta(minutes=15, seconds=30, milliseconds=1))
        self.assertEqual(parse_duration('15:30.0001'), timedelta(minutes=15, seconds=30, microseconds=100))
        self.assertEqual(parse_duration('15:30.00001'), timedelta(minutes=15, seconds=30, microseconds=10))
        self.assertEqual(parse_duration('15:30.000001'), timedelta(minutes=15, seconds=30, microseconds=1))

    def test_negative(self):
        self.assertEqual(parse_duration('-4 15:30'), timedelta(days=-4, minutes=15, seconds=30))
        self.assertEqual(parse_duration('-172800'), timedelta(days=-2))
        self.assertEqual(parse_duration('-15:30'), timedelta(minutes=-15, seconds=30))
        self.assertEqual(parse_duration('-1:15:30'), timedelta(hours=-1, minutes=15, seconds=30))
        self.assertEqual(parse_duration('-30.1'), timedelta(seconds=-30, milliseconds=-100))

    def test_iso_8601(self):
        self.assertIsNone(parse_duration('P4Y'))
        self.assertIsNone(parse_duration('P4M'))
        self.assertIsNone(parse_duration('P4W'))
        self.assertEqual(parse_duration('P4D'), timedelta(days=4))
        self.assertEqual(parse_duration('P0.5D'), timedelta(hours=12))
        self.assertEqual(parse_duration('PT5H'), timedelta(hours=5))
        self.assertEqual(parse_duration('PT5M'), timedelta(minutes=5))
        self.assertEqual(parse_duration('PT5S'), timedelta(seconds=5))
        self.assertEqual(parse_duration('PT0.000005S'), timedelta(microseconds=5))