Skip to content

Commit db89238

Browse files
committed
Tests
1 parent db528f2 commit db89238

File tree

1 file changed

+177
-0
lines changed

1 file changed

+177
-0
lines changed

tests/test_create.py

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
import doctest
2+
from collections import namedtuple
3+
4+
import pytest
5+
6+
import jsonpath_ng
7+
from jsonpath_ng.ext import parse
8+
9+
Params = namedtuple('Params', 'string initial_data insert_val target')
10+
11+
12+
@pytest.mark.parametrize('string, initial_data, insert_val, target', [
13+
14+
Params(string='$.foo',
15+
initial_data={},
16+
insert_val=42,
17+
target={'foo': 42}),
18+
19+
Params(string='$.foo.bar',
20+
initial_data={},
21+
insert_val=42,
22+
target={'foo': {'bar': 42}}),
23+
24+
Params(string='$.foo[0]',
25+
initial_data={},
26+
insert_val=42,
27+
target={'foo': [42]}),
28+
29+
Params(string='$.foo[1]',
30+
initial_data={},
31+
insert_val=42,
32+
target={'foo': [{}, 42]}),
33+
34+
Params(string='$.foo[0].bar',
35+
initial_data={},
36+
insert_val=42,
37+
target={'foo': [{'bar': 42}]}),
38+
39+
Params(string='$.foo[1].bar',
40+
initial_data={},
41+
insert_val=42,
42+
target={'foo': [{}, {'bar': 42}]}),
43+
44+
Params(string='$.foo[0][0]',
45+
initial_data={},
46+
insert_val=42,
47+
target={'foo': [[42]]}),
48+
49+
Params(string='$.foo[1][1]',
50+
initial_data={},
51+
insert_val=42,
52+
target={'foo': [{}, [{}, 42]]}),
53+
54+
Params(string='foo[0]',
55+
initial_data={},
56+
insert_val=42,
57+
target={'foo': [42]}),
58+
59+
Params(string='foo[1]',
60+
initial_data={},
61+
insert_val=42,
62+
target={'foo': [{}, 42]}),
63+
64+
Params(string='foo',
65+
initial_data={},
66+
insert_val=42,
67+
target={'foo': 42}),
68+
69+
# Initial data can be a list if we expect a list back
70+
Params(string='[0]',
71+
initial_data=[],
72+
insert_val=42,
73+
target=[42]),
74+
75+
Params(string='[1]',
76+
initial_data=[],
77+
insert_val=42,
78+
target=[{}, 42]),
79+
80+
# Converts initial data to a list if necessary
81+
Params(string='[0]',
82+
initial_data={},
83+
insert_val=42,
84+
target=[42]),
85+
86+
Params(string='[1]',
87+
initial_data={},
88+
insert_val=42,
89+
target=[{}, 42]),
90+
91+
Params(string='foo[?bar="baz"].qux',
92+
initial_data={'foo': [
93+
{'bar': 'baz'},
94+
{'bar': 'bizzle'},
95+
]},
96+
insert_val=42,
97+
target={'foo': [
98+
{'bar': 'baz', 'qux': 42},
99+
{'bar': 'bizzle'}
100+
]}),
101+
])
102+
def test_update_or_create(string, initial_data, insert_val, target):
103+
jsonpath = parse(string)
104+
result = jsonpath.update_or_create(initial_data, insert_val)
105+
assert result == target
106+
107+
108+
@pytest.mark.parametrize('string, initial_data, insert_val, target', [
109+
# Slice not supported
110+
Params(string='foo[0:1]',
111+
initial_data={},
112+
insert_val=42,
113+
target={'foo': [42, 42]}),
114+
# result is {'foo': {}}
115+
116+
# Filter does not create items to meet criteria
117+
Params(string='foo[?bar="baz"].qux',
118+
initial_data={},
119+
insert_val=42,
120+
target={'foo': [{'bar': 'baz', 'qux': 42}]}),
121+
# result is {'foo': {}}
122+
123+
# Does not convert initial data to a dictionary
124+
Params(string='foo',
125+
initial_data=[],
126+
insert_val=42,
127+
target={'foo': 42}),
128+
# raises TypeError
129+
130+
])
131+
@pytest.mark.xfail
132+
def test_unsupported_classes(string, initial_data, insert_val, target):
133+
jsonpath = parse(string)
134+
result = jsonpath.update_or_create(initial_data, insert_val)
135+
assert result == target
136+
137+
138+
@pytest.mark.parametrize('string, initial_data, insert_val, target', [
139+
140+
Params(string='$.name[0].text',
141+
initial_data={},
142+
insert_val='Sir Michael',
143+
target={'name': [{'text': 'Sir Michael'}]}),
144+
145+
Params(string='$.name[0].given[0]',
146+
initial_data={'name': [{'text': 'Sir Michael'}]},
147+
insert_val='Michael',
148+
target={'name': [{'text': 'Sir Michael',
149+
'given': ['Michael']}]}),
150+
151+
Params(string='$.name[0].prefix[0]',
152+
initial_data={'name': [{'text': 'Sir Michael',
153+
'given': ['Michael']}]},
154+
insert_val='Sir',
155+
target={'name': [{'text': 'Sir Michael',
156+
'given': ['Michael'],
157+
'prefix': ['Sir']}]}),
158+
159+
Params(string='$.birthDate',
160+
initial_data={'name': [{'text': 'Sir Michael',
161+
'given': ['Michael'],
162+
'prefix': ['Sir']}]},
163+
insert_val='1943-05-05',
164+
target={'name': [{'text': 'Sir Michael',
165+
'given': ['Michael'],
166+
'prefix': ['Sir']}],
167+
'birthDate': '1943-05-05'}),
168+
])
169+
def test_build_doc(string, initial_data, insert_val, target):
170+
jsonpath = parse(string)
171+
result = jsonpath.update_or_create(initial_data, insert_val)
172+
assert result == target
173+
174+
175+
def test_doctests():
176+
results = doctest.testmod(jsonpath_ng)
177+
assert results.failed == 0

0 commit comments

Comments
 (0)