|
3 | 3 |
|
4 | 4 | from openapi_core.exceptions import ( |
5 | 5 | InvalidServer, InvalidOperation, MissingParameter, |
6 | | - MissingBody, InvalidContentType, |
| 6 | + MissingBody, InvalidContentType, InvalidResponse, InvalidMediaTypeValue, |
7 | 7 | ) |
8 | 8 | from openapi_core.shortcuts import create_spec |
9 | | -from openapi_core.validators import RequestValidator |
10 | | -from openapi_core.wrappers import MockRequest |
| 9 | +from openapi_core.validators import RequestValidator, ResponseValidator |
| 10 | +from openapi_core.wrappers import MockRequest, MockResponse |
11 | 11 |
|
12 | 12 |
|
13 | 13 | class TestRequestValidator(object): |
@@ -155,3 +155,93 @@ def test_get_pet(self, validator): |
155 | 155 | 'petId': 1, |
156 | 156 | }, |
157 | 157 | } |
| 158 | + |
| 159 | + |
| 160 | +class TestResponseValidator(object): |
| 161 | + |
| 162 | + host_url = 'http://petstore.swagger.io' |
| 163 | + |
| 164 | + @pytest.fixture |
| 165 | + def spec_dict(self, factory): |
| 166 | + return factory.spec_from_file("data/v3.0/petstore.yaml") |
| 167 | + |
| 168 | + @pytest.fixture |
| 169 | + def spec(self, spec_dict): |
| 170 | + return create_spec(spec_dict) |
| 171 | + |
| 172 | + @pytest.fixture |
| 173 | + def validator(self, spec): |
| 174 | + return ResponseValidator(spec) |
| 175 | + |
| 176 | + def test_invalid_server(self, validator): |
| 177 | + request = MockRequest('http://petstore.invalid.net/v1', 'get', '/') |
| 178 | + response = MockResponse('Not Found', status=404) |
| 179 | + |
| 180 | + result = validator.validate(request, response) |
| 181 | + |
| 182 | + assert len(result.errors) == 1 |
| 183 | + assert type(result.errors[0]) == InvalidServer |
| 184 | + assert result.body is None |
| 185 | + assert result.headers == {} |
| 186 | + |
| 187 | + def test_invalid_operation(self, validator): |
| 188 | + request = MockRequest(self.host_url, 'get', '/v1') |
| 189 | + response = MockResponse('Not Found', status=404) |
| 190 | + |
| 191 | + result = validator.validate(request, response) |
| 192 | + |
| 193 | + assert len(result.errors) == 1 |
| 194 | + assert type(result.errors[0]) == InvalidOperation |
| 195 | + assert result.body is None |
| 196 | + assert result.headers == {} |
| 197 | + |
| 198 | + def test_invalid_response(self, validator): |
| 199 | + request = MockRequest(self.host_url, 'get', '/v1/pets') |
| 200 | + response = MockResponse('Not Found', status=409) |
| 201 | + |
| 202 | + result = validator.validate(request, response) |
| 203 | + |
| 204 | + assert len(result.errors) == 1 |
| 205 | + assert type(result.errors[0]) == InvalidResponse |
| 206 | + assert result.body is None |
| 207 | + assert result.headers == {} |
| 208 | + |
| 209 | + def test_missing_body(self, validator): |
| 210 | + request = MockRequest(self.host_url, 'get', '/v1/pets') |
| 211 | + response = MockResponse(None) |
| 212 | + |
| 213 | + result = validator.validate(request, response) |
| 214 | + |
| 215 | + assert len(result.errors) == 1 |
| 216 | + assert type(result.errors[0]) == MissingBody |
| 217 | + assert result.body is None |
| 218 | + assert result.headers == {} |
| 219 | + |
| 220 | + def test_invalid_media_type_value(self, validator): |
| 221 | + request = MockRequest(self.host_url, 'get', '/v1/pets') |
| 222 | + response = MockResponse('\{\}') |
| 223 | + |
| 224 | + result = validator.validate(request, response) |
| 225 | + |
| 226 | + assert len(result.errors) == 1 |
| 227 | + assert type(result.errors[0]) == InvalidMediaTypeValue |
| 228 | + assert result.body is None |
| 229 | + assert result.headers == {} |
| 230 | + |
| 231 | + def test_get_pets(self, validator): |
| 232 | + request = MockRequest(self.host_url, 'get', '/v1/pets') |
| 233 | + response_json = { |
| 234 | + 'data': [ |
| 235 | + { |
| 236 | + 'id': 1, |
| 237 | + }, |
| 238 | + ], |
| 239 | + } |
| 240 | + response_data = json.dumps(response_json) |
| 241 | + response = MockResponse(response_data) |
| 242 | + |
| 243 | + result = validator.validate(request, response) |
| 244 | + |
| 245 | + assert result.errors == [] |
| 246 | + assert result.body == response_json |
| 247 | + assert result.headers == {} |
0 commit comments