import pytest import datetime import calendar from email.utils import formatdate 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' def test_parse_date(): """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 """ ret = datetime_utils.parse_date(None) assert ret is None, ("We passed a None value to parse_date. We should get" " None but instead we got %s" % ret) ret = datetime_utils.parse_date('Hi There') assert ret is None, ("We passed an invalid value to parse_date. We should" " get None but instead we got %s" % ret) ret = datetime_utils.parse_date(1) assert ret is None, ("We passed an invalid value to parse_date. We should" " get None but instead we got %s" % ret) ret = datetime_utils.parse_date('\xc3') assert ret is None, ("We passed an invalid value to parse_date. We should" " get None but instead we got %s" % ret) ret = datetime_utils.parse_date('Mon, 20 Nov 1995 19:12:08 -0500') assert ret == datetime.datetime( 1995, 11, 21, 0, 12, 8, tzinfo=datetime_utils.UTC) ret = datetime_utils.parse_date('Mon, 20 Nov 1995 19:12:08') assert ret == datetime.datetime( 1995, 11, 20, 19, 12, 8, tzinfo=datetime_utils.UTC) ret = datetime_utils.parse_date(Uncooperative()) assert ret is None class Uncooperative(object): def __str__(self): raise NotImplementedError 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.compat 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(object): 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