##// END OF EJS Templates
#7548: Added a rule for help lines (starting with a "?").
#7548: Added a rule for help lines (starting with a "?").

File last commit:

r17148:99cdf189 merge
r20147:5bf694c9
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)