-
-
Notifications
You must be signed in to change notification settings - Fork 136
Expand file tree
/
Copy pathtest_response_validators.py
More file actions
183 lines (148 loc) · 6.35 KB
/
test_response_validators.py
File metadata and controls
183 lines (148 loc) · 6.35 KB
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
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.response.exceptions import MissingRequiredHeader
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_missing_deprecated_required_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()
response = MockResponse(response_data)
with pytest.raises(MissingRequiredHeader) as exc_info:
response_validator.validate(request, response)
assert exc_info.value == MissingRequiredHeader(name="x-delete-confirm")
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