1
+ import pathlib
1
2
import urllib
3
+ import urllib .parse
2
4
3
5
import pytest
4
6
@@ -20,3 +22,246 @@ def test___init__invalid_data(mocker):
20
22
invalid_url = mocker .Mock ()
21
23
with pytest .raises (urllib .error .URLError ):
22
24
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