Skip to content

Commit 1805b0d

Browse files
committed
resolver / add schema_resolver tests (squash me)
1 parent ad9c7da commit 1805b0d

File tree

1 file changed

+245
-0
lines changed

1 file changed

+245
-0
lines changed

tests/test_resolver/test_resolver_schema_resolver.py

Lines changed: 245 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
import pathlib
12
import urllib
3+
import urllib.parse
24

35
import pytest
46

@@ -20,3 +22,246 @@ def test___init__invalid_data(mocker):
2022
invalid_url = mocker.Mock()
2123
with pytest.raises(urllib.error.URLError):
2224
SchemaResolver(invalid_url)
25+
26+
27+
def test__init_with_filepath(mocker):
28+
mocker.patch("openapi_python_client.resolver.schema_resolver.SchemaResolver._isapath", return_value=True)
29+
mocker.patch("openapi_python_client.resolver.schema_resolver.DataLoader.load", return_value={})
30+
path = mocker.MagicMock()
31+
32+
from openapi_python_client.resolver.schema_resolver import SchemaResolver
33+
34+
resolver = SchemaResolver(path)
35+
resolver.resolve()
36+
37+
path.absolute().read_bytes.assert_called_once()
38+
39+
40+
def test__init_with_url(mocker):
41+
mocker.patch("openapi_python_client.resolver.schema_resolver.DataLoader.load", return_value={})
42+
url_parse = mocker.patch(
43+
"urllib.parse.urlparse",
44+
return_value=urllib.parse.ParseResult(
45+
scheme="http", netloc="foobar.io", path="foo", params="", query="", fragment="/bar"
46+
),
47+
)
48+
get = mocker.patch("httpx.get")
49+
50+
url = mocker.MagicMock()
51+
52+
from openapi_python_client.resolver.schema_resolver import SchemaResolver
53+
54+
resolver = SchemaResolver(url)
55+
resolver.resolve()
56+
57+
url_parse.assert_called_once_with(url)
58+
get.assert_called_once()
59+
60+
61+
def test__resolve_schema_references_with_path(mocker):
62+
read_bytes = mocker.patch("pathlib.Path.read_bytes")
63+
64+
from openapi_python_client.resolver.schema_resolver import SchemaResolver
65+
66+
path = pathlib.Path("/foo/bar/foobar")
67+
path_parent = str(path.parent)
68+
schema = {"foo": {"$ref": "foobar#/foobar"}}
69+
external_schemas = {}
70+
errors = []
71+
72+
def _datalaod_mocked_result(path, data):
73+
if path == "/foo/bar/foobar":
74+
return {"foobar": "bar", "bar": {"$ref": "bar#/foobar"}, "local": {"$ref": "#/toto"}}
75+
76+
if path == "/foo/bar/bar":
77+
return {"foobar": "bar", "bar": {"$ref": "../bar#/foobar"}}
78+
79+
if path == "/foo/bar":
80+
return {"foobar": "bar/bar", "bar": {"$ref": "/barfoo.io/foobar#foobar"}}
81+
82+
if path == "/barfoo.io/foobar":
83+
return {"foobar": "barfoo.io/foobar", "bar": {"$ref": "./bar#foobar"}}
84+
85+
if path == "/barfoo.io/bar":
86+
return {"foobar": "barfoo.io/bar", "bar": {"$ref": "/bar.foo/foobar"}}
87+
88+
if path == "/bar.foo/foobar":
89+
return {"foobar": "bar.foo/foobar", "bar": {"$ref": "/foo.bar/foobar"}}
90+
91+
if path == "/foo.bar/foobar":
92+
return {"foobar": "foo.bar/foobar", "bar": {"$ref": "/foo/bar/foobar"}} # Loop to first path
93+
94+
raise ValueError(f"Unexpected path {path}")
95+
96+
mocker.patch("openapi_python_client.resolver.schema_resolver.DataLoader.load", _datalaod_mocked_result)
97+
resolver = SchemaResolver(path)
98+
resolver._resolve_schema_references(path_parent, schema, external_schemas, errors, True)
99+
100+
assert len(errors) == 0
101+
assert "/foo/bar/foobar" in external_schemas
102+
assert "/foo/bar/bar" in external_schemas
103+
assert "/foo/bar" in external_schemas
104+
assert "/barfoo.io/foobar" in external_schemas
105+
assert "/barfoo.io/bar" in external_schemas
106+
assert "/bar.foo/foobar" in external_schemas
107+
assert "/foo.bar/foobar" in external_schemas
108+
109+
110+
def test__resolve_schema_references_with_url(mocker):
111+
get = mocker.patch("httpx.get")
112+
113+
from openapi_python_client.resolver.schema_resolver import SchemaResolver
114+
115+
url = "http://foobar.io/foo/bar/foobar"
116+
url_parent = "http://foobar.io/foo/bar/"
117+
schema = {"foo": {"$ref": "foobar#/foobar"}}
118+
external_schemas = {}
119+
errors = []
120+
121+
def _datalaod_mocked_result(url, data):
122+
if url == "http://foobar.io/foo/bar/foobar":
123+
return {"foobar": "bar", "bar": {"$ref": "bar#/foobar"}, "local": {"$ref": "#/toto"}}
124+
125+
if url == "http://foobar.io/foo/bar/bar":
126+
return {"foobar": "bar", "bar": {"$ref": "../bar#/foobar"}}
127+
128+
if url == "http://foobar.io/foo/bar":
129+
return {"foobar": "bar/bar", "bar": {"$ref": "//barfoo.io/foobar#foobar"}}
130+
131+
if url == "http://barfoo.io/foobar":
132+
return {"foobar": "barfoo.io/foobar", "bar": {"$ref": "./bar#foobar"}}
133+
134+
if url == "http://barfoo.io/bar":
135+
return {"foobar": "barfoo.io/bar", "bar": {"$ref": "https://bar.foo/foobar"}}
136+
137+
if url == "https://bar.foo/foobar":
138+
return {"foobar": "bar.foo/foobar", "bar": {"$ref": "//foo.bar/foobar"}}
139+
140+
if url == "https://foo.bar/foobar":
141+
return {"foobar": "foo.bar/foobar", "bar": {"$ref": "http://foobar.io/foo/bar/foobar"}} # Loop to first uri
142+
143+
raise ValueError(f"Unexpected url {url}")
144+
145+
mocker.patch("openapi_python_client.resolver.schema_resolver.DataLoader.load", _datalaod_mocked_result)
146+
147+
resolver = SchemaResolver(url)
148+
resolver._resolve_schema_references(url_parent, schema, external_schemas, errors, True)
149+
150+
assert len(errors) == 0
151+
assert "http://foobar.io/foo/bar/bar" in external_schemas
152+
assert "http://foobar.io/foo/bar" in external_schemas
153+
assert "http://barfoo.io/foobar" in external_schemas
154+
assert "http://barfoo.io/foobar" in external_schemas
155+
assert "http://barfoo.io/bar" in external_schemas
156+
assert "https://bar.foo/foobar" in external_schemas
157+
assert "https://foo.bar/foobar" in external_schemas
158+
159+
160+
def test__resolve_schema_references_mix_path_and_url(mocker):
161+
read_bytes = mocker.patch("pathlib.Path.read_bytes")
162+
get = mocker.patch("httpx.get")
163+
164+
from openapi_python_client.resolver.schema_resolver import SchemaResolver
165+
166+
path = pathlib.Path("/foo/bar/foobar")
167+
path_parent = str(path.parent)
168+
schema = {"foo": {"$ref": "foobar#/foobar"}}
169+
external_schemas = {}
170+
errors = []
171+
172+
def _datalaod_mocked_result(path, data):
173+
if path == "/foo/bar/foobar":
174+
return {"foobar": "bar", "bar": {"$ref": "bar#/foobar"}, "local": {"$ref": "#/toto"}}
175+
176+
if path == "/foo/bar/bar":
177+
return {"foobar": "bar", "bar": {"$ref": "../bar#/foobar"}}
178+
179+
if path == "/foo/bar":
180+
return {"foobar": "bar/bar", "bar": {"$ref": "//barfoo.io/foobar#foobar"}}
181+
182+
if path == "http://barfoo.io/foobar":
183+
return {"foobar": "barfoo.io/foobar", "bar": {"$ref": "./bar#foobar"}}
184+
185+
if path == "http://barfoo.io/bar":
186+
return {"foobar": "barfoo.io/bar", "bar": {"$ref": "https://bar.foo/foobar"}}
187+
188+
if path == "https://bar.foo/foobar":
189+
return {"foobar": "bar.foo/foobar", "bar": {"$ref": "//foo.bar/foobar"}}
190+
191+
if path == "https://foo.bar/foobar":
192+
return {"foobar": "foo.bar/foobar"}
193+
194+
raise ValueError(f"Unexpected path {path}")
195+
196+
mocker.patch("openapi_python_client.resolver.schema_resolver.DataLoader.load", _datalaod_mocked_result)
197+
resolver = SchemaResolver(path)
198+
resolver._resolve_schema_references(path_parent, schema, external_schemas, errors, True)
199+
200+
assert len(errors) == 0
201+
assert "/foo/bar/foobar" in external_schemas
202+
assert "/foo/bar/bar" in external_schemas
203+
assert "/foo/bar" in external_schemas
204+
assert "http://barfoo.io/foobar" in external_schemas
205+
assert "http://barfoo.io/bar" in external_schemas
206+
assert "https://bar.foo/foobar" in external_schemas
207+
assert "https://foo.bar/foobar" in external_schemas
208+
209+
210+
def test__resolve_schema_references_with_error(mocker):
211+
get = mocker.patch("httpx.get")
212+
213+
import httpcore
214+
215+
from openapi_python_client.resolver.schema_resolver import SchemaResolver
216+
217+
url = "http://foobar.io/foo/bar/foobar"
218+
url_parent = "http://foobar.io/foo/bar/"
219+
schema = {"foo": {"$ref": "foobar#/foobar"}}
220+
external_schemas = {}
221+
errors = []
222+
223+
def _datalaod_mocked_result(url, data):
224+
if url == "http://foobar.io/foo/bar/foobar":
225+
return {
226+
"foobar": "bar",
227+
"bar": {"$ref": "bar#/foobar"},
228+
"barfoor": {"$ref": "barfoo#foobar"},
229+
"local": {"$ref": "#/toto"},
230+
}
231+
232+
if url == "http://foobar.io/foo/bar/bar":
233+
raise httpcore.NetworkError("mocked error")
234+
235+
if url == "http://foobar.io/foo/bar/barfoo":
236+
return {"foobar": "foo/bar/barfoo", "bar": {"$ref": "//barfoo.io/foobar#foobar"}}
237+
238+
if url == "http://barfoo.io/foobar":
239+
return {"foobar": "foobar"}
240+
241+
mocker.patch("openapi_python_client.resolver.schema_resolver.DataLoader.load", _datalaod_mocked_result)
242+
resolver = SchemaResolver(url)
243+
resolver._resolve_schema_references(url_parent, schema, external_schemas, errors, True)
244+
245+
assert len(errors) == 1
246+
assert errors[0] == "Failed to gather external reference data of bar#/foobar from http://foobar.io/foo/bar/bar"
247+
assert "http://foobar.io/foo/bar/bar" not in external_schemas
248+
assert "http://foobar.io/foo/bar/foobar" in external_schemas
249+
assert "http://foobar.io/foo/bar/barfoo" in external_schemas
250+
assert "http://barfoo.io/foobar" in external_schemas
251+
252+
253+
def test___lookup_schema_references():
254+
from openapi_python_client.resolver.schema_resolver import SchemaResolver
255+
256+
data_set = {
257+
"foo": {"$ref": "#/ref_1"},
258+
"bar": {"foobar": {"$ref": "#/ref_2"}},
259+
"foobar": [{"foo": {"$ref": "#/ref_3"}}, {"bar": [{"foobar": {"$ref": "#/ref_4"}}]}],
260+
}
261+
262+
resolver = SchemaResolver("http://foobar.io")
263+
expected_references = sorted([f"#/ref_{x}" for x in range(1, 5)])
264+
references = sorted([x.value for x in resolver._lookup_schema_references(data_set)])
265+
266+
for idx, ref in enumerate(references):
267+
assert expected_references[idx] == ref

0 commit comments

Comments
 (0)