1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import doctest
import unittest
import sys
from jsonpointer import resolve_pointer, EndOfList, JsonPointerException, \
JsonPointer
class SpecificationTests(unittest.TestCase):
""" Tests all examples from the JSON Pointer specification """
def test_example(self):
doc = {
"foo": ["bar", "baz"],
"": 0,
"a/b": 1,
"c%d": 2,
"e^f": 3,
"g|h": 4,
"i\\j": 5,
"k\"l": 6,
" ": 7,
"m~n": 8
}
self.assertEqual(resolve_pointer(doc, ""), doc)
self.assertEqual(resolve_pointer(doc, "/foo"), ["bar", "baz"])
self.assertEqual(resolve_pointer(doc, "/foo/0"), "bar")
self.assertEqual(resolve_pointer(doc, "/"), 0)
self.assertEqual(resolve_pointer(doc, "/a~1b"), 1)
self.assertEqual(resolve_pointer(doc, "/c%d"), 2)
self.assertEqual(resolve_pointer(doc, "/e^f"), 3)
self.assertEqual(resolve_pointer(doc, "/g|h"), 4)
self.assertEqual(resolve_pointer(doc, "/i\\j"), 5)
self.assertEqual(resolve_pointer(doc, "/k\"l"), 6)
self.assertEqual(resolve_pointer(doc, "/ "), 7)
self.assertEqual(resolve_pointer(doc, "/m~0n"), 8)
def test_eol(self):
doc = {
"foo": ["bar", "baz"]
}
self.assertTrue(isinstance(resolve_pointer(doc, "/foo/-"), EndOfList))
self.assertRaises(JsonPointerException, resolve_pointer, doc, "/foo/-/1")
class ComparisonTests(unittest.TestCase):
def test_eq_hash(self):
p1 = JsonPointer("/something/1/b")
p2 = JsonPointer("/something/1/b")
p3 = JsonPointer("/something/1.0/b")
self.assertEqual(p1, p2)
self.assertNotEqual(p1, p3)
self.assertNotEqual(p2, p3)
self.assertEqual(hash(p1), hash(p2))
self.assertNotEqual(hash(p1), hash(p3))
self.assertNotEqual(hash(p2), hash(p3))
# a pointer compares not-equal to objects of other types
self.assertFalse(p1 == "/something/1/b")
def test_contains(self):
p1 = JsonPointer("/a/b/c")
p2 = JsonPointer("/a/b")
p3 = JsonPointer("/b/c")
self.assertTrue(p1.contains(p2))
self.assertFalse(p1.contains(p3))
class WrongInputTests(unittest.TestCase):
def test_no_start_slash(self):
# an exception is raised when the pointer string does not start with /
self.assertRaises(JsonPointerException, JsonPointer, 'some/thing')
def test_invalid_index(self):
# 'a' is not a valid list index
doc = [0, 1, 2]
self.assertRaises(JsonPointerException, resolve_pointer, doc, '/a')
def test_oob(self):
# this list does not have 10 members
doc = [0, 1, 2]
self.assertRaises(JsonPointerException, resolve_pointer, doc, '/10')
class ToLastTests(unittest.TestCase):
def test_empty_path(self):
doc = {'a': [1, 2, 3]}
ptr = JsonPointer('')
last, nxt = ptr.to_last(doc)
self.assertEqual(doc, last)
self.assertTrue(nxt is None)
def test_path(self):
doc = {'a': [{'b': 1, 'c': 2}, 5]}
ptr = JsonPointer('/a/0/b')
last, nxt = ptr.to_last(doc)
self.assertEqual(last, {'b': 1, 'c': 2})
self.assertEqual(nxt, 'b')
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(SpecificationTests))
suite.addTest(unittest.makeSuite(ComparisonTests))
suite.addTest(unittest.makeSuite(WrongInputTests))
suite.addTest(unittest.makeSuite(ToLastTests))
modules = ['jsonpointer']
for module in modules:
m = __import__(module, fromlist=[module])
suite.addTest(doctest.DocTestSuite(m))
runner = unittest.TextTestRunner(verbosity=1)
result = runner.run(suite)
if not result.wasSuccessful():
sys.exit(1)
|