86 lines
2.7 KiB
Python
86 lines
2.7 KiB
Python
|
"""Test suite for our JSON utilities."""
|
||
|
|
||
|
# Copyright (c) Jupyter Development Team.
|
||
|
# Distributed under the terms of the Modified BSD License.
|
||
|
|
||
|
import json
|
||
|
import pytest
|
||
|
import datetime
|
||
|
|
||
|
from datetime import timedelta
|
||
|
from unittest import mock
|
||
|
from dateutil.tz import tzlocal, tzoffset
|
||
|
from jupyter_client import jsonutil
|
||
|
from jupyter_client.session import utcnow
|
||
|
|
||
|
|
||
|
REFERENCE_DATETIME = datetime.datetime(
|
||
|
2013, 7, 3, 16, 34, 52, 249482, tzlocal()
|
||
|
)
|
||
|
|
||
|
|
||
|
def test_extract_date_from_naive():
|
||
|
ref = REFERENCE_DATETIME
|
||
|
timestamp = '2013-07-03T16:34:52.249482'
|
||
|
|
||
|
with pytest.deprecated_call(match='Interpreting naive datetime as local'):
|
||
|
extracted = jsonutil.extract_dates(timestamp)
|
||
|
|
||
|
assert isinstance(extracted, datetime.datetime)
|
||
|
assert extracted.tzinfo is not None
|
||
|
assert extracted.tzinfo.utcoffset(ref) == tzlocal().utcoffset(ref)
|
||
|
assert extracted == ref
|
||
|
|
||
|
|
||
|
def test_extract_dates():
|
||
|
ref = REFERENCE_DATETIME
|
||
|
timestamps = [
|
||
|
'2013-07-03T16:34:52.249482Z',
|
||
|
'2013-07-03T16:34:52.249482-0800',
|
||
|
'2013-07-03T16:34:52.249482+0800',
|
||
|
'2013-07-03T16:34:52.249482-08:00',
|
||
|
'2013-07-03T16:34:52.249482+08:00',
|
||
|
]
|
||
|
extracted = jsonutil.extract_dates(timestamps)
|
||
|
for dt in extracted:
|
||
|
assert isinstance(dt, datetime.datetime)
|
||
|
assert dt.tzinfo is not None
|
||
|
|
||
|
assert extracted[0].tzinfo.utcoffset(ref) == timedelta(0)
|
||
|
assert extracted[1].tzinfo.utcoffset(ref) == timedelta(hours=-8)
|
||
|
assert extracted[2].tzinfo.utcoffset(ref) == timedelta(hours=8)
|
||
|
assert extracted[3].tzinfo.utcoffset(ref) == timedelta(hours=-8)
|
||
|
assert extracted[4].tzinfo.utcoffset(ref) == timedelta(hours=8)
|
||
|
|
||
|
|
||
|
def test_parse_ms_precision():
|
||
|
base = '2013-07-03T16:34:52'
|
||
|
digits = '1234567890'
|
||
|
|
||
|
parsed = jsonutil.parse_date(base+'Z')
|
||
|
assert isinstance(parsed, datetime.datetime)
|
||
|
for i in range(len(digits)):
|
||
|
ts = base + '.' + digits[:i]
|
||
|
parsed = jsonutil.parse_date(ts+'Z')
|
||
|
if i >= 1 and i <= 6:
|
||
|
assert isinstance(parsed, datetime.datetime)
|
||
|
else:
|
||
|
assert isinstance(parsed, str)
|
||
|
|
||
|
|
||
|
def test_date_default():
|
||
|
naive = datetime.datetime.now()
|
||
|
local = tzoffset('Local', -8 * 3600)
|
||
|
other = tzoffset('Other', 2 * 3600)
|
||
|
data = dict(naive=naive, utc=utcnow(), withtz=naive.replace(tzinfo=other))
|
||
|
with mock.patch.object(jsonutil, 'tzlocal', lambda : local):
|
||
|
with pytest.deprecated_call(match='Please add timezone info'):
|
||
|
jsondata = json.dumps(data, default=jsonutil.date_default)
|
||
|
assert "Z" in jsondata
|
||
|
assert jsondata.count("Z") == 1
|
||
|
extracted = jsonutil.extract_dates(json.loads(jsondata))
|
||
|
for dt in extracted.values():
|
||
|
assert isinstance(dt, datetime.datetime)
|
||
|
assert dt.tzinfo != None
|
||
|
|