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 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
|
import json
import pytest
from openapi_core import V30ResponseValidator
from openapi_core.deserializing.media_types.exceptions import (
MediaTypeDeserializeError,
)
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.responses.exceptions import ResponseNotFound
from openapi_core.testing import MockRequest
from openapi_core.testing import MockResponse
from openapi_core.validation.response.exceptions import DataValidationError
from openapi_core.validation.response.exceptions import InvalidData
from openapi_core.validation.response.exceptions import InvalidHeader
from openapi_core.validation.response.exceptions import MissingData
from openapi_core.validation.schemas.exceptions import InvalidSchemaValue
class TestResponseValidator:
host_url = "http://petstore.swagger.io"
@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 response_validator(self, spec):
return V30ResponseValidator(spec)
def test_invalid_server(self, response_validator):
request = MockRequest("http://petstore.invalid.net/v1", "get", "/")
response = MockResponse(b"Not Found", status_code=404)
with pytest.raises(PathNotFound):
response_validator.validate(request, response)
def test_invalid_operation(self, response_validator):
request = MockRequest(self.host_url, "patch", "/v1/pets")
response = MockResponse(b"Not Found", status_code=404)
with pytest.raises(OperationNotFound):
response_validator.validate(request, response)
def test_invalid_response(self, response_validator):
request = MockRequest(self.host_url, "get", "/v1/pets")
response = MockResponse(b"Not Found", status_code=409)
with pytest.raises(ResponseNotFound):
response_validator.validate(request, response)
def test_invalid_content_type(self, response_validator):
request = MockRequest(self.host_url, "get", "/v1/pets")
response = MockResponse(b"Not Found", content_type="text/csv")
with pytest.raises(DataValidationError) as exc_info:
response_validator.validate(request, response)
assert type(exc_info.value.__cause__) == MediaTypeNotFound
def test_missing_body(self, response_validator):
request = MockRequest(self.host_url, "get", "/v1/pets")
response = MockResponse(None)
with pytest.raises(MissingData):
response_validator.validate(request, response)
def test_invalid_media_type(self, response_validator):
request = MockRequest(self.host_url, "get", "/v1/pets")
response = MockResponse(b"abcde")
with pytest.raises(DataValidationError) as exc_info:
response_validator.validate(request, response)
assert exc_info.value.__cause__ == MediaTypeDeserializeError(
mimetype="application/json", value=b"abcde"
)
def test_invalid_media_type_value(self, response_validator):
request = MockRequest(self.host_url, "get", "/v1/pets")
response = MockResponse(b"{}")
with pytest.raises(DataValidationError) as exc_info:
response_validator.validate(request, response)
assert type(exc_info.value.__cause__) == InvalidSchemaValue
def test_invalid_value(self, response_validator):
request = MockRequest(self.host_url, "get", "/v1/tags")
response_json = {
"data": [
{"id": 1, "name": "Sparky"},
],
}
response_data = json.dumps(response_json).encode()
response = MockResponse(response_data)
with pytest.raises(InvalidData) as exc_info:
response_validator.validate(request, response)
assert type(exc_info.value.__cause__) == InvalidSchemaValue
def test_invalid_header(self, response_validator):
request = MockRequest(
self.host_url,
"delete",
"/v1/tags",
path_pattern="/v1/tags",
)
response_json = {
"data": [
{
"id": 1,
"name": "Sparky",
"ears": {
"healthy": True,
},
},
],
}
response_data = json.dumps(response_json).encode()
headers = {
"x-delete-confirm": "true",
"x-delete-date": "today",
}
response = MockResponse(response_data, headers=headers)
with pytest.raises(InvalidHeader):
with pytest.warns(DeprecationWarning):
response_validator.validate(request, response)
def test_valid(self, response_validator):
request = MockRequest(self.host_url, "get", "/v1/pets")
response_json = {
"data": [
{
"id": 1,
"name": "Sparky",
"ears": {
"healthy": True,
},
},
],
}
response_data = json.dumps(response_json).encode()
response = MockResponse(response_data)
result = response_validator.validate(request, response)
assert result is None
|