Merge pull request #1 from shaun-emburse/openapi-request-response-serializers

Doc & test for Openapi request response serializers
This commit is contained in:
Denis Orehovsky 2021-02-14 08:44:27 +03:00 committed by GitHub
commit d052ee9fd8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 98 additions and 0 deletions

View File

@ -375,6 +375,20 @@ operationIds.
In order to work around this, you can override `get_operation_id_base()` to In order to work around this, you can override `get_operation_id_base()` to
provide a different base for name part of the ID. provide a different base for name part of the ID.
#### `get_serializer()`
If the view has implemented `get_serializer()`, returns the result.
#### `get_request_serializer()`
By default returns `get_serializer()` but can be overridden to
differentiate between request and response objects.
#### `get_response_serializer()`
By default returns `get_serializer()` but can be overridden to
differentiate between request and response objects.
### `AutoSchema.__init__()` kwargs ### `AutoSchema.__init__()` kwargs
`AutoSchema` provides a number of `__init__()` kwargs that can be used for `AutoSchema` provides a number of `__init__()` kwargs that can be used for

View File

@ -702,6 +702,90 @@ class TestOperationIntrospection(TestCase):
operationId = inspector.get_operation_id(path, method) operationId = inspector.get_operation_id(path, method)
assert operationId == 'listItem' assert operationId == 'listItem'
def test_different_request_response_objects(self):
class RequestSerializer(serializers.Serializer):
text = serializers.CharField()
class ResponseSerializer(serializers.Serializer):
text = serializers.BooleanField()
class CustomSchema(AutoSchema):
def get_request_serializer(self, path, method):
return RequestSerializer()
def get_response_serializer(self, path, method):
return ResponseSerializer()
path = '/'
method = 'POST'
view = create_view(
views.ExampleGenericAPIView,
method,
create_request(path),
)
inspector = CustomSchema()
inspector.view = view
components = inspector.get_components(path, method)
assert components == {
'Request': {
'properties': {
'text': {
'type': 'string'
}
},
'required': ['text'],
'type': 'object'
},
'Response': {
'properties': {
'text': {
'type': 'boolean'}
},
'required': ['text'],
'type': 'object'
}
}
operation = inspector.get_operation(path, method)
assert operation == {
'operationId': 'createExample',
'description': '',
'parameters': [],
'requestBody': {
'content': {
'application/json': {
'schema': {
'$ref': '#/components/schemas/Request'
}
},
'application/x-www-form-urlencoded': {
'schema': {
'$ref': '#/components/schemas/Request'
}
},
'multipart/form-data': {
'schema': {
'$ref': '#/components/schemas/Request'
}
}
}
},
'responses': {
'201': {
'content': {
'application/json': {
'schema': {
'$ref': '#/components/schemas/Response'
}
}
},
'description': ''
}
},
'tags': ['']
}
def test_repeat_operation_ids(self): def test_repeat_operation_ids(self):
router = routers.SimpleRouter() router = routers.SimpleRouter()
router.register('account', views.ExampleGenericViewSet, basename="account") router.register('account', views.ExampleGenericViewSet, basename="account")