Skip to content

Commit 89ec335

Browse files
authored
Merge pull request #222 from p1c2u/paths-finer-paths-order-test-2
Paths finder paths order fix
2 parents 187b3d6 + 9c22ddf commit 89ec335

File tree

3 files changed

+58
-10
lines changed

3 files changed

+58
-10
lines changed

openapi_core/schema/servers/models.py

+3-8
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
"""OpenAPI core servers models module"""
22
from six import iteritems
3-
from six.moves.urllib.parse import urljoin
43

54

65
class Server(object):
@@ -28,15 +27,11 @@ def get_url(self, **variables):
2827
variables = self.default_variables
2928
return self.url.format(**variables)
3029

31-
@staticmethod
32-
def is_absolute(url):
30+
def is_absolute(self, url=None):
31+
if url is None:
32+
url = self.url
3333
return url.startswith('//') or '://' in url
3434

35-
def get_absolute_url(self, base_url=None):
36-
if base_url is not None and not self.is_absolute(self.url):
37-
return urljoin(base_url, self.url)
38-
return self.url
39-
4035

4136
class ServerVariable(object):
4237

openapi_core/templating/paths/finders.py

+10-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
"""OpenAPI core templating paths finders module"""
22
from more_itertools import peekable
33
from six import iteritems
4+
from six.moves.urllib.parse import urljoin, urlparse
45

56
from openapi_core.templating.datatypes import TemplateResult
67
from openapi_core.templating.util import parse, search
@@ -63,11 +64,18 @@ def _get_servers_iter(self, full_url_pattern, ooperations_iter):
6364
for server in servers:
6465
server_url_pattern = full_url_pattern.rsplit(
6566
path_result.resolved, 1)[0]
66-
server_url = server.get_absolute_url(self.base_url)
67+
server_url = server.url
68+
if not server.is_absolute():
69+
# relative to absolute url
70+
if self.base_url is not None:
71+
server_url = urljoin(self.base_url, server.url)
72+
# if no base url check only path part
73+
else:
74+
server_url_pattern = urlparse(server_url_pattern).path
6775
if server_url.endswith('/'):
6876
server_url = server_url[:-1]
6977
# simple path
70-
if server_url_pattern.startswith(server_url):
78+
if server_url_pattern == server_url:
7179
server_result = TemplateResult(server.url, {})
7280
yield (
7381
path, operation, server,

tests/unit/templating/test_paths_finders.py

+45
Original file line numberDiff line numberDiff line change
@@ -390,3 +390,48 @@ class TestPathVariableServerValid(
390390
BaseTestVariableValid, BaseTestPathServer,
391391
BaseTestSimplePath, BaseTestVariableServer):
392392
pass
393+
394+
395+
class TestSimilarPaths(
396+
BaseTestSpecServer, BaseTestSimpleServer):
397+
398+
path_name = '/tokens'
399+
400+
@pytest.fixture
401+
def operation_2(self):
402+
return Operation('get', '/keys/{id}/tokens', {}, {})
403+
404+
@pytest.fixture
405+
def operations_2(self, operation_2):
406+
return {
407+
'get': operation_2,
408+
}
409+
410+
@pytest.fixture
411+
def path(self, operations):
412+
return Path('/tokens', operations)
413+
414+
@pytest.fixture
415+
def path_2(self, operations_2):
416+
return Path('/keys/{id}/tokens', operations_2)
417+
418+
@pytest.fixture
419+
def paths(self, path, path_2):
420+
return {
421+
path.name: path,
422+
path_2.name: path_2,
423+
}
424+
425+
def test_valid(self, finder, path_2, operation_2, server):
426+
token_id = '123'
427+
request_uri = '/keys/{0}/tokens'.format(token_id)
428+
request = MockRequest(
429+
'http://petstore.swagger.io', 'get', request_uri)
430+
431+
result = finder.find(request)
432+
433+
path_result = TemplateResult(path_2.name, {'id': token_id})
434+
server_result = TemplateResult(self.server_url, {})
435+
assert result == (
436+
path_2, operation_2, server, path_result, server_result,
437+
)

0 commit comments

Comments
 (0)