Skip to content

Commit 4dc8234

Browse files
committed
Catching a broad exception to ensure the return of the default, added tests, fixed a bug where obj.contains(obj) returned false, added test case
1 parent 490c7a2 commit 4dc8234

File tree

2 files changed

+54
-7
lines changed

2 files changed

+54
-7
lines changed

jsonpointer.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,8 @@ def resolve(self, doc, default=_nothing):
166166

167167
try:
168168
doc = self.walk(doc, part)
169-
except JsonPointerException:
169+
# Catching a broad exception to ensure the return of the default
170+
except:
170171
if default is _nothing:
171172
raise
172173
else:
@@ -215,7 +216,7 @@ def get_part(self, doc, part):
215216

216217
else:
217218
raise JsonPointerException("Document '%s' does not support indexing, "
218-
"must be dict/list or support __getitem__" % type(doc))
219+
"must be mapping/sequence or support __getitem__" % type(doc))
219220

220221

221222
def walk(self, doc, part):
@@ -249,7 +250,7 @@ def walk(self, doc, part):
249250

250251
def contains(self, ptr):
251252
""" Returns True if self contains the given ptr """
252-
return len(self.parts) > len(ptr.parts) and \
253+
return len(self.parts) >= len(ptr.parts) and \
253254
self.parts[:len(ptr.parts)] == ptr.parts
254255

255256
@property

tests.py

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from jsonpointer import resolve_pointer, EndOfList, JsonPointerException, \
99
JsonPointer, set_pointer
1010

11+
1112
class SpecificationTests(unittest.TestCase):
1213
""" Tests all examples from the JSON Pointer specification """
1314

@@ -70,6 +71,7 @@ def test_round_trip(self):
7071
new_ptr = JsonPointer.from_parts(parts)
7172
self.assertEqual(ptr, new_ptr)
7273

74+
7375
class ComparisonTests(unittest.TestCase):
7476

7577
def test_eq_hash(self):
@@ -94,10 +96,10 @@ def test_contains(self):
9496
p3 = JsonPointer("/b/c")
9597

9698
self.assertTrue(p1.contains(p2))
99+
self.assertTrue(p1.contains(p1))
97100
self.assertFalse(p1.contains(p3))
98101

99102

100-
101103
class WrongInputTests(unittest.TestCase):
102104

103105
def test_no_start_slash(self):
@@ -181,11 +183,11 @@ def test_set(self):
181183

182184
self.assertRaises(JsonPointerException, set_pointer, doc, "", 9)
183185

184-
class AltTypesTests(unittest.TestCase):
185186

186-
def test_alttypes(self):
187-
JsonPointer.alttypes = True
187+
class AltTypesTests(unittest.TestCase):
188188

189+
@classmethod
190+
def setUpClass(cls):
189191
class Node(object):
190192
def __init__(self, name, parent=None):
191193
self.name = name
@@ -217,6 +219,18 @@ def __setitem__(self, key, val):
217219

218220
raise KeyError("Only left and right supported: %s" % key)
219221

222+
class mdict(object):
223+
def __init__(self, d):
224+
self._d = d
225+
def __getitem__(self, item):
226+
return self._d[item]
227+
228+
cls.mdict = mdict({'root': {'1': {'2': '3'}}})
229+
cls.Node = Node
230+
231+
232+
def test_alttypes(self):
233+
Node = self.Node
220234

221235
root = Node('root')
222236
root.set_left(Node('a'))
@@ -238,6 +252,38 @@ def __setitem__(self, key, val):
238252
set_pointer(root, '/left/right', Node('AB'))
239253
self.assertEqual(resolve_pointer(root, '/left/right').name, 'AB')
240254

255+
def test_mock_dict_sanity(self):
256+
doc = self.mdict
257+
default = None
258+
259+
# TODO: Generate this automatically for any given object
260+
path_to_expected_value = {
261+
'/root/1': {'2': '3'},
262+
'/root': {'1': {'2': '3'}},
263+
'/root/1/2': '3',
264+
}
265+
266+
for path, expected_value in iter(path_to_expected_value.items()):
267+
self.assertEqual(resolve_pointer(doc, path, default), expected_value)
268+
269+
def test_mock_dict_returns_default(self):
270+
doc = self.mdict
271+
default = None
272+
273+
path_to_expected_value = {
274+
'/foo': default,
275+
'/x/y/z/d': default
276+
}
277+
278+
for path, expected_value in iter(path_to_expected_value.items()):
279+
self.assertEqual(resolve_pointer(doc, path, default), expected_value)
280+
281+
def test_mock_dict_raises_key_error(self):
282+
doc = self.mdict
283+
self.assertRaises(KeyError, resolve_pointer, doc, '/foo')
284+
285+
286+
241287
suite = unittest.TestSuite()
242288
suite.addTest(unittest.makeSuite(SpecificationTests))
243289
suite.addTest(unittest.makeSuite(ComparisonTests))

0 commit comments

Comments
 (0)