summaryrefslogtreecommitdiff
path: root/tests/test_datetime_utils.py
blob: c6ed36decfe48ca39c6898ccb3529c50c16c2af3 (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
124
125
126
127
128
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