1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
from base64 import b64encode
import pytest
from openapi_core import V30RequestValidator
from openapi_core.templating.media_types.exceptions import MediaTypeNotFound
from openapi_core.templating.paths.exceptions import OperationNotFound
from openapi_core.templating.paths.exceptions import PathNotFound
from openapi_core.templating.security.exceptions import SecurityNotFound
from openapi_core.testing import MockRequest
from openapi_core.validation.request.exceptions import MissingRequiredParameter
from openapi_core.validation.request.exceptions import (
RequestBodyValidationError,
)
from openapi_core.validation.request.exceptions import SecurityValidationError
class TestRequestValidator:
host_url = "http://petstore.swagger.io"
api_key = "12345"
@property
def api_key_encoded(self):
api_key_bytes = self.api_key.encode("utf8")
api_key_bytes_enc = b64encode(api_key_bytes)
return str(api_key_bytes_enc, "utf8")
@pytest.fixture(scope="session")
def spec_dict(self, v30_petstore_content):
return v30_petstore_content
@pytest.fixture(scope="session")
def spec(self, v30_petstore_spec):
return v30_petstore_spec
@pytest.fixture(scope="session")
def request_validator(self, spec):
return V30RequestValidator(spec)
def test_request_server_error(self, request_validator):
request = MockRequest("http://petstore.invalid.net/v1", "get", "/")
with pytest.raises(PathNotFound):
request_validator.validate(request)
def test_path_not_found(self, request_validator):
request = MockRequest(self.host_url, "get", "/v1")
with pytest.raises(PathNotFound):
request_validator.validate(request)
def test_operation_not_found(self, request_validator):
request = MockRequest(self.host_url, "patch", "/v1/pets")
with pytest.raises(OperationNotFound):
request_validator.validate(request)
def test_missing_parameter(self, request_validator):
request = MockRequest(self.host_url, "get", "/v1/pets")
with pytest.raises(MissingRequiredParameter):
with pytest.warns(DeprecationWarning):
request_validator.validate(request)
def test_security_not_found(self, request_validator):
request = MockRequest(
self.host_url,
"get",
"/v1/pets/1",
path_pattern="/v1/pets/{petId}",
view_args={"petId": "1"},
)
with pytest.raises(SecurityValidationError) as exc_info:
request_validator.validate(request)
assert exc_info.value.__cause__ == SecurityNotFound(
[["petstore_auth"]]
)
def test_media_type_not_found(self, request_validator):
data = b"csv,data"
headers = {
"api-key": self.api_key_encoded,
}
cookies = {
"user": "123",
}
request = MockRequest(
"https://development.gigantic-server.com",
"post",
"/v1/pets",
path_pattern="/v1/pets",
content_type="text/csv",
data=data,
headers=headers,
cookies=cookies,
)
with pytest.raises(RequestBodyValidationError) as exc_info:
request_validator.validate(request)
assert exc_info.value.__cause__ == MediaTypeNotFound(
mimetype="text/csv",
availableMimetypes=[
"application/json",
"application/x-www-form-urlencoded",
"text/plain",
],
)
def test_valid(self, request_validator):
authorization = "Basic " + self.api_key_encoded
headers = {
"Authorization": authorization,
}
request = MockRequest(
self.host_url,
"get",
"/v1/pets/1",
path_pattern="/v1/pets/{petId}",
view_args={"petId": "1"},
headers=headers,
)
result = request_validator.validate(request)
assert result is None
|