openapi-core/tests/unit/templating/test_paths_finders.py
2021-05-02 22:07:45 +01:00

594 lines
15 KiB
Python

from __future__ import division
import pytest
from openapi_core.spec.paths import SpecPath
from openapi_core.templating.datatypes import TemplateResult
from openapi_core.templating.paths.exceptions import (
PathNotFound, OperationNotFound, ServerNotFound,
)
from openapi_core.templating.paths.finders import PathFinder
from openapi_core.testing import MockRequest
class BaseTestSimpleServer(object):
server_url = 'http://petstore.swagger.io'
@pytest.fixture
def server_variable(self):
return {}
@pytest.fixture
def server_variables(self, server_variable):
if not server_variable:
return {}
return {
self.server_variable_name: server_variable,
}
@pytest.fixture
def server(self, server_variables):
server = {
'url': self.server_url,
}
if server_variables:
server['variables'] = server_variables
return server
@pytest.fixture
def servers(self, server):
return [server, ]
class BaseTestVariableServer(BaseTestSimpleServer):
server_url = 'http://petstore.swagger.io/{version}'
server_variable_name = 'version'
server_variable_default = 'v1'
server_variable_enum = ['v1', 'v2']
@pytest.fixture
def server_variable(self):
return {
self.server_variable_name: {
'default': self.server_variable_default,
'enum': self.server_variable_enum,
}
}
class BaseTestSimplePath(object):
path_name = '/resource'
@pytest.fixture
def path(self, operations):
return operations
@pytest.fixture
def paths(self, path):
return {
self.path_name: path,
}
class BaseTestVariablePath(BaseTestSimplePath):
path_name = '/resource/{resource_id}'
path_parameter_name = 'resource_id'
@pytest.fixture
def parameter(self):
return {
'name': self.path_parameter_name,
'in': 'path',
}
@pytest.fixture
def parameters(self, parameter):
return [parameter, ]
@pytest.fixture
def path(self, operations, parameters):
path = operations.copy()
path['parameters'] = parameters
return path
class BaseTestSpecServer(object):
location = 'spec'
@pytest.fixture
def info(self):
return {
'title': 'Test schema',
'version': '1.0',
}
@pytest.fixture
def operation(self):
return {
'responses': [],
}
@pytest.fixture
def operations(self, operation):
return {
'get': operation,
}
@pytest.fixture
def spec(self, info, paths, servers):
spec = {
'info': info,
'servers': servers,
'paths': paths,
}
return SpecPath.from_spec(spec)
@pytest.fixture
def finder(self, spec):
return PathFinder(spec)
class BaseTestPathServer(BaseTestSpecServer):
location = 'path'
@pytest.fixture
def path(self, operations, servers):
path = operations.copy()
path['servers'] = servers
return path
@pytest.fixture
def spec(self, info, paths):
spec = {
'info': info,
'paths': paths,
}
return SpecPath.from_spec(spec)
class BaseTestOperationServer(BaseTestSpecServer):
location = 'operation'
@pytest.fixture
def operation(self, servers):
return {
'responses': [],
'servers': servers,
}
@pytest.fixture
def spec(self, info, paths):
spec = {
'info': info,
'paths': paths,
}
return SpecPath.from_spec(spec)
class BaseTestServerNotFound(object):
@pytest.fixture
def servers(self):
return []
@pytest.mark.xfail(reason="returns default server")
def test_raises(self, finder):
request_uri = '/resource'
request = MockRequest(
'http://petstore.swagger.io', 'get', request_uri)
with pytest.raises(ServerNotFound):
finder.find(request)
class BaseTestOperationNotFound(object):
@pytest.fixture
def operations(self):
return {}
def test_raises(self, finder):
request_uri = '/resource'
request = MockRequest(
'http://petstore.swagger.io', 'get', request_uri)
with pytest.raises(OperationNotFound):
finder.find(request)
class BaseTestValid(object):
def test_simple(self, finder, spec):
request_uri = '/resource'
method = 'get'
request = MockRequest(
'http://petstore.swagger.io', method, request_uri)
result = finder.find(request)
path = spec / 'paths' / self.path_name
operation = spec / 'paths' / self.path_name / method
server = eval(self.location) / 'servers' / 0
path_result = TemplateResult(self.path_name, {})
server_result = TemplateResult(self.server_url, {})
assert result == (
path, operation, server, path_result, server_result,
)
class BaseTestVariableValid(object):
@pytest.mark.parametrize('version', ['v1', 'v2'])
def test_variable(self, finder, spec, version):
request_uri = '/{0}/resource'.format(version)
method = 'get'
request = MockRequest(
'http://petstore.swagger.io', method, request_uri)
result = finder.find(request)
path = spec / 'paths' / self.path_name
operation = spec / 'paths' / self.path_name / method
server = eval(self.location) / 'servers' / 0
path_result = TemplateResult(self.path_name, {})
server_result = TemplateResult(self.server_url, {'version': version})
assert result == (
path, operation, server, path_result, server_result,
)
class BaseTestPathVariableValid(object):
@pytest.mark.parametrize('res_id', ['111', '222'])
def test_path_variable(self, finder, spec, res_id):
request_uri = '/resource/{0}'.format(res_id)
method = 'get'
request = MockRequest(
'http://petstore.swagger.io', method, request_uri)
result = finder.find(request)
path = spec / 'paths' / self.path_name
operation = spec / 'paths' / self.path_name / method
server = eval(self.location) / 'servers' / 0
path_result = TemplateResult(self.path_name, {'resource_id': res_id})
server_result = TemplateResult(self.server_url, {})
assert result == (
path, operation, server, path_result, server_result,
)
class BaseTestPathNotFound(object):
@pytest.fixture
def paths(self):
return {}
def test_raises(self, finder):
request_uri = '/resource'
request = MockRequest(
'http://petstore.swagger.io', 'get', request_uri)
with pytest.raises(PathNotFound):
finder.find(request)
class TestSpecSimpleServerServerNotFound(
BaseTestServerNotFound, BaseTestSpecServer,
BaseTestSimplePath, BaseTestSimpleServer):
pass
class TestSpecSimpleServerOperationNotFound(
BaseTestOperationNotFound, BaseTestSpecServer,
BaseTestSimplePath, BaseTestSimpleServer):
pass
class TestSpecSimpleServerPathNotFound(
BaseTestPathNotFound, BaseTestSpecServer,
BaseTestSimplePath, BaseTestSimpleServer):
pass
class TestOperationSimpleServerServerNotFound(
BaseTestServerNotFound, BaseTestOperationServer,
BaseTestSimplePath, BaseTestSimpleServer):
pass
class TestOperationSimpleServerOperationNotFound(
BaseTestOperationNotFound, BaseTestOperationServer,
BaseTestSimplePath, BaseTestSimpleServer):
pass
class TestOperationSimpleServerPathNotFound(
BaseTestPathNotFound, BaseTestOperationServer,
BaseTestSimplePath, BaseTestSimpleServer):
pass
class TestPathSimpleServerServerNotFound(
BaseTestServerNotFound, BaseTestPathServer,
BaseTestSimplePath, BaseTestSimpleServer):
pass
class TestPathSimpleServerOperationNotFound(
BaseTestOperationNotFound, BaseTestPathServer,
BaseTestSimplePath, BaseTestSimpleServer):
pass
class TestPathSimpleServerPathNotFound(
BaseTestPathNotFound, BaseTestPathServer,
BaseTestSimplePath, BaseTestSimpleServer):
pass
class TestSpecSimpleServerValid(
BaseTestValid, BaseTestSpecServer,
BaseTestSimplePath, BaseTestSimpleServer):
pass
class TestOperationSimpleServerValid(
BaseTestValid, BaseTestOperationServer,
BaseTestSimplePath, BaseTestSimpleServer):
pass
class TestPathSimpleServerValid(
BaseTestValid, BaseTestPathServer,
BaseTestSimplePath, BaseTestSimpleServer):
pass
class TestSpecSimpleServerVariablePathValid(
BaseTestPathVariableValid, BaseTestSpecServer,
BaseTestVariablePath, BaseTestSimpleServer):
pass
class TestOperationSimpleServerVariablePathValid(
BaseTestPathVariableValid, BaseTestOperationServer,
BaseTestVariablePath, BaseTestSimpleServer):
pass
class TestPathSimpleServerVariablePathValid(
BaseTestPathVariableValid, BaseTestPathServer,
BaseTestVariablePath, BaseTestSimpleServer):
pass
class TestSpecVariableServerServerNotFound(
BaseTestServerNotFound, BaseTestSpecServer,
BaseTestSimplePath, BaseTestVariableServer):
pass
class TestSpecVariableServerOperationNotFound(
BaseTestOperationNotFound, BaseTestSpecServer,
BaseTestSimplePath, BaseTestVariableServer):
pass
class TestSpecVariableServerPathNotFound(
BaseTestPathNotFound, BaseTestSpecServer,
BaseTestSimplePath, BaseTestVariableServer):
pass
class TestOperationVariableServerServerNotFound(
BaseTestServerNotFound, BaseTestOperationServer,
BaseTestSimplePath, BaseTestVariableServer):
pass
class TestOperationVariableServerOperationNotFound(
BaseTestOperationNotFound, BaseTestOperationServer,
BaseTestSimplePath, BaseTestVariableServer):
pass
class TestOperationVariableServerPathNotFound(
BaseTestPathNotFound, BaseTestOperationServer,
BaseTestSimplePath, BaseTestVariableServer):
pass
class TestPathVariableServerServerNotFound(
BaseTestServerNotFound, BaseTestPathServer,
BaseTestSimplePath, BaseTestVariableServer):
pass
class TestPathVariableServerOperationNotFound(
BaseTestOperationNotFound, BaseTestPathServer,
BaseTestSimplePath, BaseTestVariableServer):
pass
class TestPathVariableServerPathNotFound(
BaseTestPathNotFound, BaseTestPathServer,
BaseTestSimplePath, BaseTestVariableServer):
pass
class TestSpecVariableServerValid(
BaseTestVariableValid, BaseTestSpecServer,
BaseTestSimplePath, BaseTestVariableServer):
pass
class TestOperationVariableServerValid(
BaseTestVariableValid, BaseTestOperationServer,
BaseTestSimplePath, BaseTestVariableServer):
pass
class TestPathVariableServerValid(
BaseTestVariableValid, BaseTestPathServer,
BaseTestSimplePath, BaseTestVariableServer):
pass
class TestSimilarPaths(
BaseTestSpecServer, BaseTestSimpleServer):
path_name = '/tokens'
path_2_name = '/keys/{id}/tokens'
@pytest.fixture
def operation_2(self):
return {
'responses': [],
}
@pytest.fixture
def operations_2(self, operation_2):
return {
'get': operation_2,
}
@pytest.fixture
def path(self, operations):
return operations
@pytest.fixture
def path_2(self, operations_2):
return operations_2
@pytest.fixture
def paths(self, path, path_2):
return {
self.path_name: path,
self.path_2_name: path_2,
}
def test_valid(self, finder, spec):
token_id = '123'
request_uri = '/keys/{0}/tokens'.format(token_id)
method = 'get'
request = MockRequest(
'http://petstore.swagger.io', method, request_uri)
result = finder.find(request)
path_2 = spec / 'paths' / self.path_2_name
operation_2 = spec / 'paths' / self.path_2_name / method
server = eval(self.location) / 'servers' / 0
path_result = TemplateResult(self.path_2_name, {'id': token_id})
server_result = TemplateResult(self.server_url, {})
assert result == (
path_2, operation_2, server, path_result, server_result,
)
class TestConcretePaths(
BaseTestSpecServer, BaseTestSimpleServer):
path_name = '/keys/{id}/tokens'
path_2_name = '/keys/master/tokens'
@pytest.fixture
def operation_2(self):
return {
'responses': [],
}
@pytest.fixture
def operations_2(self, operation_2):
return {
'get': operation_2,
}
@pytest.fixture
def path(self, operations):
return operations
@pytest.fixture
def path_2(self, operations_2):
return operations_2
@pytest.fixture
def paths(self, path, path_2):
return {
self.path_name: path,
self.path_2_name: path_2,
}
def test_valid(self, finder, spec):
request_uri = '/keys/master/tokens'
method = 'get'
request = MockRequest(
'http://petstore.swagger.io', method, request_uri)
result = finder.find(request)
path_2 = spec / 'paths' / self.path_2_name
operation_2 = spec / 'paths' / self.path_2_name / method
server = eval(self.location) / 'servers' / 0
path_result = TemplateResult(self.path_2_name, {})
server_result = TemplateResult(self.server_url, {})
assert result == (
path_2, operation_2, server, path_result, server_result,
)
class TestTemplateConcretePaths(
BaseTestSpecServer, BaseTestSimpleServer):
path_name = '/keys/{id}/tokens/{id2}'
path_2_name = '/keys/{id}/tokens/master'
@pytest.fixture
def operation_2(self):
return {
'responses': [],
}
@pytest.fixture
def operations_2(self, operation_2):
return {
'get': operation_2,
}
@pytest.fixture
def path(self, operations):
return operations
@pytest.fixture
def path_2(self, operations_2):
return operations_2
@pytest.fixture
def paths(self, path, path_2):
return {
self.path_name: path,
self.path_2_name: path_2,
}
def test_valid(self, finder, spec):
token_id = '123'
request_uri = '/keys/{0}/tokens/master'.format(token_id)
method = 'get'
request = MockRequest(
'http://petstore.swagger.io', method, request_uri)
result = finder.find(request)
path_2 = spec / 'paths' / self.path_2_name
operation_2 = spec / 'paths' / self.path_2_name / method
server = eval(self.location) / 'servers' / 0
path_result = TemplateResult(self.path_2_name, {'id': '123'})
server_result = TemplateResult(self.server_url, {})
assert result == (
path_2, operation_2, server, path_result, server_result,
)