|
9 | 9 | from openapi_core.extensions.models.models import BaseModel
|
10 | 10 | from openapi_core.schema.operations.exceptions import InvalidOperation
|
11 | 11 | from openapi_core.schema.parameters.exceptions import MissingRequiredParameter
|
| 12 | +from openapi_core.schema.parameters.exceptions import InvalidParameterValue |
| 13 | +from openapi_core.schema.paths.exceptions import InvalidPath |
12 | 14 | from openapi_core.schema.request_bodies.exceptions import MissingRequestBody
|
13 | 15 | from openapi_core.schema.responses.exceptions import (
|
14 | 16 | MissingResponseContent, InvalidResponse,
|
@@ -54,11 +56,21 @@ def test_request_server_error(self, validator):
|
54 | 56 | assert result.body is None
|
55 | 57 | assert result.parameters == {}
|
56 | 58 |
|
57 |
| - def test_invalid_operation(self, validator): |
| 59 | + def test_invalid_path(self, validator): |
58 | 60 | request = MockRequest(self.host_url, 'get', '/v1')
|
59 | 61 |
|
60 | 62 | result = validator.validate(request)
|
61 | 63 |
|
| 64 | + assert len(result.errors) == 1 |
| 65 | + assert type(result.errors[0]) == InvalidPath |
| 66 | + assert result.body is None |
| 67 | + assert result.parameters == {} |
| 68 | + |
| 69 | + def test_invalid_operation(self, validator): |
| 70 | + request = MockRequest(self.host_url, 'patch', '/v1/pets') |
| 71 | + |
| 72 | + result = validator.validate(request) |
| 73 | + |
62 | 74 | assert len(result.errors) == 1
|
63 | 75 | assert type(result.errors[0]) == InvalidOperation
|
64 | 76 | assert result.body is None
|
@@ -220,6 +232,80 @@ def test_get_pet(self, validator):
|
220 | 232 | }
|
221 | 233 |
|
222 | 234 |
|
| 235 | +class TestPathItemParamsValidator(object): |
| 236 | + |
| 237 | + @pytest.fixture |
| 238 | + def spec_dict(self, factory): |
| 239 | + return { |
| 240 | + "openapi": "3.0.0", |
| 241 | + "info": { |
| 242 | + "title": "Test path item parameter validation", |
| 243 | + "version": "0.1", |
| 244 | + }, |
| 245 | + "paths": { |
| 246 | + "/resource": { |
| 247 | + "parameters": [ |
| 248 | + { |
| 249 | + "name": "resId", |
| 250 | + "in": "query", |
| 251 | + "required": True, |
| 252 | + "schema": { |
| 253 | + "type": "integer", |
| 254 | + }, |
| 255 | + }, |
| 256 | + ], |
| 257 | + "get": { |
| 258 | + "responses": { |
| 259 | + "default": { |
| 260 | + "description": "Return the resource." |
| 261 | + } |
| 262 | + } |
| 263 | + } |
| 264 | + } |
| 265 | + } |
| 266 | + } |
| 267 | + |
| 268 | + @pytest.fixture |
| 269 | + def spec(self, spec_dict): |
| 270 | + return create_spec(spec_dict) |
| 271 | + |
| 272 | + @pytest.fixture |
| 273 | + def validator(self, spec): |
| 274 | + return RequestValidator(spec) |
| 275 | + |
| 276 | + def test_request_missing_param(self, validator): |
| 277 | + request = MockRequest('http://example.com', 'get', '/resource') |
| 278 | + result = validator.validate(request) |
| 279 | + |
| 280 | + assert len(result.errors) == 1 |
| 281 | + assert type(result.errors[0]) == MissingRequiredParameter |
| 282 | + assert result.body is None |
| 283 | + assert result.parameters == {} |
| 284 | + |
| 285 | + def test_request_invalid_param(self, validator): |
| 286 | + request = MockRequest( |
| 287 | + 'http://example.com', 'get', '/resource', |
| 288 | + args={'resId': 'invalid'}, |
| 289 | + ) |
| 290 | + result = validator.validate(request) |
| 291 | + |
| 292 | + assert len(result.errors) == 1 |
| 293 | + assert type(result.errors[0]) == InvalidParameterValue |
| 294 | + assert result.body is None |
| 295 | + assert result.parameters == {} |
| 296 | + |
| 297 | + def test_request_valid_param(self, validator): |
| 298 | + request = MockRequest( |
| 299 | + 'http://example.com', 'get', '/resource', |
| 300 | + args={'resId': '10'}, |
| 301 | + ) |
| 302 | + result = validator.validate(request) |
| 303 | + |
| 304 | + assert len(result.errors) == 0 |
| 305 | + assert result.body is None |
| 306 | + assert result.parameters == {'query': {'resId': 10}} |
| 307 | + |
| 308 | + |
223 | 309 | class TestResponseValidator(object):
|
224 | 310 |
|
225 | 311 | host_url = 'http://petstore.swagger.io'
|
|
0 commit comments