-
Notifications
You must be signed in to change notification settings - Fork 193
/
Copy pathtest_datetime_utils.py
129 lines (102 loc) · 4.23 KB
/
test_datetime_utils.py
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
124
125
126
127
128
129
import calendar
import datetime
from email.utils import formatdate
import pytest
from webob import datetime_utils
def test_UTC():
"""Test missing function in _UTC"""
x = datetime_utils.UTC
assert x.tzname(datetime.datetime.now()) == "UTC"
assert x.dst(datetime.datetime.now()) == datetime.timedelta(0)
assert x.utcoffset(datetime.datetime.now()) == datetime.timedelta(0)
assert repr(x) == "UTC"
# Testing datetime_utils.parse_date.
# We need to verify the following scenarios:
# * a nil submitted value
# * a submitted value that cannot be parse into a date
# * a valid RFC2822 date with and without timezone
class Uncooperative:
def __str__(self):
raise NotImplementedError
@pytest.mark.parametrize("invalid_date", [None, "Hi there", 1, "\xc3", Uncooperative()])
def test_parse_date_invalid(invalid_date):
assert datetime_utils.parse_date(invalid_date) is None
@pytest.mark.parametrize(
"valid_date, parsed_datetime",
[
(
"Mon, 20 Nov 1995 19:12:08 -0500",
datetime.datetime(1995, 11, 21, 0, 12, 8, tzinfo=datetime_utils.UTC),
),
(
"Mon, 20 Nov 1995 19:12:08",
datetime.datetime(1995, 11, 20, 19, 12, 8, tzinfo=datetime_utils.UTC),
),
],
)
def test_parse_date_valid(valid_date, parsed_datetime):
assert datetime_utils.parse_date(valid_date) == parsed_datetime
def test_serialize_date():
"""Testing datetime_utils.serialize_date
We need to verify the following scenarios:
* on py3, passing an binary date, return the same date but str
* on py2, passing an unicode date, return the same date but str
* passing a timedelta, return now plus the delta
* passing an invalid object, should raise ValueError
"""
from webob.util import text_
ret = datetime_utils.serialize_date("Mon, 20 Nov 1995 19:12:08 GMT")
assert isinstance(ret, str)
assert ret == "Mon, 20 Nov 1995 19:12:08 GMT"
ret = datetime_utils.serialize_date(text_("Mon, 20 Nov 1995 19:12:08 GMT"))
assert isinstance(ret, str)
assert ret == "Mon, 20 Nov 1995 19:12:08 GMT"
dt = formatdate(
calendar.timegm((datetime.datetime.now() + datetime.timedelta(1)).timetuple()),
usegmt=True,
)
assert dt == datetime_utils.serialize_date(datetime.timedelta(1))
with pytest.raises(ValueError):
datetime_utils.serialize_date(None)
def test_parse_date_delta():
"""Testing datetime_utils.parse_date_delta
We need to verify the following scenarios:
* passing a nil value, should return nil
* passing a value that fails the conversion to int, should call
parse_date
"""
assert datetime_utils.parse_date_delta(None) is None, (
"Passing none value," "should return None"
)
ret = datetime_utils.parse_date_delta("Mon, 20 Nov 1995 19:12:08 -0500")
assert ret == datetime.datetime(1995, 11, 21, 0, 12, 8, tzinfo=datetime_utils.UTC)
WHEN = datetime.datetime(2011, 3, 16, 10, 10, 37, tzinfo=datetime_utils.UTC)
with _NowRestorer(WHEN):
ret = datetime_utils.parse_date_delta(1)
assert ret == WHEN + datetime.timedelta(0, 1)
def test_serialize_date_delta():
"""Testing datetime_utils.serialize_date_delta
We need to verify the following scenarios:
* if we pass something that's not an int or float, it should delegate
the task to serialize_date
"""
assert datetime_utils.serialize_date_delta(1) == "1"
assert datetime_utils.serialize_date_delta(1.5) == "1"
ret = datetime_utils.serialize_date_delta("Mon, 20 Nov 1995 19:12:08 GMT")
assert type(ret) is (str)
assert ret == "Mon, 20 Nov 1995 19:12:08 GMT"
def test_timedelta_to_seconds():
val = datetime.timedelta(86400)
result = datetime_utils.timedelta_to_seconds(val)
assert result == 7464960000
class _NowRestorer:
def __init__(self, new_now):
self._new_now = new_now
self._old_now = None
def __enter__(self):
import webob.datetime_utils
self._old_now = webob.datetime_utils._now
webob.datetime_utils._now = lambda: self._new_now
def __exit__(self, exc_type, exc_value, traceback):
import webob.datetime_utils
webob.datetime_utils._now = self._old_now