##// END OF EJS Templates
Test case for setting only lower or upper, no sensible default so should be an error
Test case for setting only lower or upper, no sensible default so should be an error

File last commit:

r17148:99cdf189 merge
r17704:400433c5
Show More
test_jsonutil.py
151 lines | 4.8 KiB | text/x-python | PythonLexer
MinRK
allow unicode keys in dicts in json_clean
r17133 # coding: utf-8
"""Test suite for our JSON utilities."""
# Copyright (c) IPython Development Team.
# Distributed under the terms of the Modified BSD License.
MinRK
test jsonutil handling of dates
r11151 import datetime
Fernando Perez
Created JSON-safety utilities....
r2947 import json
MinRK
move _encode_binary to jsonutil.encode_images...
r7737 from base64 import decodestring
Fernando Perez
Created JSON-safety utilities....
r2947
import nose.tools as nt
MinRK
test jsonutil handling of dates
r11151 from IPython.utils import jsonutil, tz
MinRK
move _encode_binary to jsonutil.encode_images...
r7737 from ..jsonutil import json_clean, encode_images
Thomas Kluyver
Fix references to dict.iteritems and dict.itervalues
r13361 from ..py3compat import unicode_to_str, str_to_bytes, iteritems
Fernando Perez
Created JSON-safety utilities....
r2947
MinRK
allow unicode keys in dicts in json_clean
r17133
MinRK
test json_clean on integer subclasses
r13704 class Int(int):
def __str__(self):
return 'Int(%i)' % self
Fernando Perez
Created JSON-safety utilities....
r2947
def test():
# list of input/expected output. Use None for the expected output if it
# can be the same as the input.
pairs = [(1, None), # start with scalars
(1.0, None),
('a', None),
(True, None),
(False, None),
(None, None),
# complex numbers for now just go to strings, as otherwise they
# are unserializable
(1j, '1j'),
# Containers
([1, 2], None),
((1, 2), [1, 2]),
(set([1, 2]), [1, 2]),
(dict(x=1), None),
({'x': 1, 'y':[1,2,3], '1':'int'}, None),
# More exotic objects
((x for x in range(3)), [0, 1, 2]),
(iter([1, 2]), [1, 2]),
MinRK
test json_clean on integer subclasses
r13704 (Int(5), 5),
Fernando Perez
Created JSON-safety utilities....
r2947 ]
for val, jval in pairs:
if jval is None:
jval = val
out = json_clean(val)
# validate our cleanup
nt.assert_equal(out, jval)
# and ensure that what we return, indeed encodes cleanly
json.loads(json.dumps(out))
MinRK
test rekey modify-in-place
r17140 def test_rekey():
# This could fail due to modifying the dict keys in-place on Python 3
d = { i:i for i in map(str, range(128)) }
d = jsonutil.rekey(d)
for key in d:
nt.assert_is_instance(key, int)
MinRK
move _encode_binary to jsonutil.encode_images...
r7737
def test_encode_images():
# invalid data, but the header and footer are from real files
pngdata = b'\x89PNG\r\n\x1a\nblahblahnotactuallyvalidIEND\xaeB`\x82'
jpegdata = b'\xff\xd8\xff\xe0\x00\x10JFIFblahblahjpeg(\xa0\x0f\xff\xd9'
Brian E. Granger
Adding PDFFormatter and kernel side handling of PDF display data.
r15121 pdfdata = b'%PDF-1.\ntrailer<</Root<</Pages<</Kids[<</MediaBox[0 0 3 3]>>]>>>>>>'
MinRK
move _encode_binary to jsonutil.encode_images...
r7737
fmt = {
'image/png' : pngdata,
'image/jpeg' : jpegdata,
Brian E. Granger
Adding PDFFormatter and kernel side handling of PDF display data.
r15121 'application/pdf' : pdfdata
MinRK
move _encode_binary to jsonutil.encode_images...
r7737 }
encoded = encode_images(fmt)
Thomas Kluyver
Fix references to dict.iteritems and dict.itervalues
r13361 for key, value in iteritems(fmt):
MinRK
move _encode_binary to jsonutil.encode_images...
r7737 # encoded has unicode, want bytes
decoded = decodestring(encoded[key].encode('ascii'))
Thomas Kluyver
Remove uses of @parametric decorator
r12374 nt.assert_equal(decoded, value)
MinRK
move _encode_binary to jsonutil.encode_images...
r7737 encoded2 = encode_images(encoded)
Thomas Kluyver
Remove uses of @parametric decorator
r12374 nt.assert_equal(encoded, encoded2)
MinRK
move _encode_binary to jsonutil.encode_images...
r7737
b64_str = {}
Thomas Kluyver
Fix references to dict.iteritems and dict.itervalues
r13361 for key, encoded in iteritems(encoded):
MinRK
move _encode_binary to jsonutil.encode_images...
r7737 b64_str[key] = unicode_to_str(encoded)
encoded3 = encode_images(b64_str)
Thomas Kluyver
Remove uses of @parametric decorator
r12374 nt.assert_equal(encoded3, b64_str)
Thomas Kluyver
Fix references to dict.iteritems and dict.itervalues
r13361 for key, value in iteritems(fmt):
MinRK
move _encode_binary to jsonutil.encode_images...
r7737 # encoded3 has str, want bytes
decoded = decodestring(str_to_bytes(encoded3[key]))
Thomas Kluyver
Remove uses of @parametric decorator
r12374 nt.assert_equal(decoded, value)
MinRK
move _encode_binary to jsonutil.encode_images...
r7737
Fernando Perez
Created JSON-safety utilities....
r2947 def test_lambda():
jc = json_clean(lambda : 1)
MinRK
update test_jsonutil...
r15309 nt.assert_is_instance(jc, str)
nt.assert_in('<lambda>', jc)
Fernando Perez
Created JSON-safety utilities....
r2947 json.dumps(jc)
MinRK
test jsonutil handling of dates
r11151 def test_extract_dates():
timestamps = [
'2013-07-03T16:34:52.249482',
'2013-07-03T16:34:52.249482Z',
'2013-07-03T16:34:52.249482Z-0800',
'2013-07-03T16:34:52.249482Z+0800',
'2013-07-03T16:34:52.249482Z+08:00',
'2013-07-03T16:34:52.249482Z-08:00',
'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)
ref = extracted[0]
for dt in extracted:
nt.assert_true(isinstance(dt, datetime.datetime))
nt.assert_equal(dt, ref)
MinRK
test that we don't choke on sub-millisecond precision timestamps...
r13521 def test_parse_ms_precision():
MinRK
update test_jsonutil...
r15309 base = '2013-07-03T16:34:52'
MinRK
test that we don't choke on sub-millisecond precision timestamps...
r13521 digits = '1234567890'
MinRK
update test_jsonutil...
r15309 parsed = jsonutil.parse_date(base)
nt.assert_is_instance(parsed, datetime.datetime)
MinRK
test that we don't choke on sub-millisecond precision timestamps...
r13521 for i in range(len(digits)):
MinRK
update test_jsonutil...
r15309 ts = base + '.' + digits[:i]
MinRK
test that we don't choke on sub-millisecond precision timestamps...
r13521 parsed = jsonutil.parse_date(ts)
if i >= 1 and i <= 6:
MinRK
update test_jsonutil...
r15309 nt.assert_is_instance(parsed, datetime.datetime)
MinRK
test that we don't choke on sub-millisecond precision timestamps...
r13521 else:
MinRK
update test_jsonutil...
r15309 nt.assert_is_instance(parsed, str)
MinRK
test that we don't choke on sub-millisecond precision timestamps...
r13521
MinRK
test jsonutil handling of dates
r11151 def test_date_default():
data = dict(today=datetime.datetime.now(), utcnow=tz.utcnow())
jsondata = json.dumps(data, default=jsonutil.date_default)
nt.assert_in("+00", jsondata)
nt.assert_equal(jsondata.count("+00"), 1)
extracted = jsonutil.extract_dates(json.loads(jsondata))
for dt in extracted.values():
MinRK
update test_jsonutil...
r15309 nt.assert_is_instance(dt, datetime.datetime)
Fernando Perez
Created JSON-safety utilities....
r2947
def test_exception():
bad_dicts = [{1:'number', '1':'string'},
{True:'bool', 'True':'string'},
]
for d in bad_dicts:
nt.assert_raises(ValueError, json_clean, d)
MinRK
allow unicode keys in dicts in json_clean
r17133
def test_unicode_dict():
data = {u'üniço∂e': u'üniço∂e'}
clean = jsonutil.json_clean(data)
nt.assert_equal(data, clean)