def test_response_body_nested_serializer(self): path = '/' method = 'POST' class NestedSerializer(serializers.Serializer): number = serializers.IntegerField() class Serializer(serializers.Serializer): text = serializers.CharField() nested = NestedSerializer() class View(generics.GenericAPIView): serializer_class = Serializer view = create_view( View, method, create_request(path), ) inspector = AutoSchema() inspector.view = view responses = inspector._get_responses(path, method) schema = responses['200']['content']['application/json']['schema'] assert sorted(schema['required']) == ['nested', 'text'] assert sorted(list(schema['properties'].keys())) == ['nested', 'text'] assert schema['properties']['nested']['type'] == 'object' assert list( schema['properties']['nested']['properties'].keys()) == ['number'] assert schema['properties']['nested']['required'] == ['number']
def test_response_body_nested_serializer(self): path = '/' method = 'POST' class NestedSerializer(serializers.Serializer): number = serializers.IntegerField() class Serializer(serializers.Serializer): text = serializers.CharField() nested = NestedSerializer() class View(generics.GenericAPIView): serializer_class = Serializer view = create_view( View, method, create_request(path), ) inspector = AutoSchema() inspector.view = view responses = inspector._get_responses(path, method) schema = responses['200']['content']['application/json']['schema'] assert sorted(schema['required']) == ['nested', 'text'] assert sorted(list(schema['properties'].keys())) == ['nested', 'text'] assert schema['properties']['nested']['type'] == 'object' assert list(schema['properties']['nested']['properties'].keys()) == ['number'] assert schema['properties']['nested']['required'] == ['number']
def test_empty_required(self): path = '/' method = 'POST' class Serializer(serializers.Serializer): read_only = serializers.CharField(read_only=True) write_only = serializers.CharField(write_only=True, required=False) class View(generics.GenericAPIView): serializer_class = Serializer view = create_view( View, method, create_request(path) ) inspector = AutoSchema() inspector.view = view request_body = inspector._get_request_body(path, method) # there should be no empty 'required' property, see #6834 assert 'required' not in request_body['content']['application/json']['schema'] for response in inspector._get_responses(path, method).values(): assert 'required' not in response['content']['application/json']['schema']
def test_response_body_generation(self): path = '/' method = 'POST' class ItemSerializer(serializers.Serializer): text = serializers.CharField() write_only = serializers.CharField(write_only=True) class View(generics.GenericAPIView): serializer_class = ItemSerializer view = create_view(View, method, create_request(path)) inspector = AutoSchema() inspector.view = view responses = inspector._get_responses(path, method) assert responses['201']['content']['application/json']['schema'][ '$ref'] == '#/components/schemas/Item' components = inspector.get_components(path, method) assert sorted(components['Item']['required']) == ['text', 'write_only'] assert sorted(list(components['Item']['properties'].keys())) == [ 'text', 'write_only' ] assert 'description' in responses['201']
def test_paginated_list_response_body_generation(self): """Test that pagination properties are added for a paginated list view.""" path = '/' method = 'GET' class Pagination(pagination.BasePagination): def get_paginated_response_schema(self, schema): return { 'type': 'object', 'item': schema, } class ItemSerializer(serializers.Serializer): text = serializers.CharField() class View(generics.GenericAPIView): serializer_class = ItemSerializer pagination_class = Pagination view = create_view( View, method, create_request(path), ) inspector = AutoSchema() inspector.view = view responses = inspector._get_responses(path, method) assert responses == { '200': { 'description': '', 'content': { 'application/json': { 'schema': { 'type': 'object', 'item': { 'type': 'array', 'items': { '$ref': '#/components/schemas/Item' }, }, }, }, }, }, } components = inspector.get_components(path, method) assert components == { 'Item': { 'type': 'object', 'properties': { 'text': { 'type': 'string', }, }, 'required': ['text'], } }
def test_serializer_validators(self): path = '/' method = 'GET' view = create_view( views.ExampleValidatedAPIView, method, create_request(path), ) inspector = AutoSchema() inspector.view = view responses = inspector._get_responses(path, method) response_schema = responses['200']['content']['application/json'][ 'schema'] properties = response_schema['items']['properties'] assert properties['integer']['type'] == 'integer' assert properties['integer']['maximum'] == 99 assert properties['integer']['minimum'] == -11 assert properties['string']['minLength'] == 2 assert properties['string']['maxLength'] == 10 assert properties['lst']['minItems'] == 2 assert properties['lst']['maxItems'] == 10 assert properties['regex']['pattern'] == r'[ABC]12{3}' assert properties['regex'][ 'description'] == 'must have an A, B, or C followed by 1222' assert properties['decimal1']['type'] == 'number' assert properties['decimal1']['multipleOf'] == .01 assert properties['decimal1']['maximum'] == 10000 assert properties['decimal1']['minimum'] == -10000 assert properties['decimal2']['type'] == 'number' assert properties['decimal2']['multipleOf'] == .0001 assert properties['email']['type'] == 'string' assert properties['email']['format'] == 'email' assert properties['email']['default'] == '*****@*****.**' assert properties['url']['type'] == 'string' assert properties['url']['nullable'] is True assert properties['url']['default'] == 'http://www.example.com' assert properties['uuid']['type'] == 'string' assert properties['uuid']['format'] == 'uuid' assert properties['ip4']['type'] == 'string' assert properties['ip4']['format'] == 'ipv4' assert properties['ip6']['type'] == 'string' assert properties['ip6']['format'] == 'ipv6' assert properties['ip']['type'] == 'string' assert 'format' not in properties['ip']
def test_retrieve_response_body_generation(self): """ Test that a list of properties is returned for retrieve item views. Pagination properties should not be added as the view represents a single item. """ path = '/{id}/' method = 'GET' class Pagination(pagination.BasePagination): def get_paginated_response_schema(self, schema): return { 'type': 'object', 'item': schema, } class ItemSerializer(serializers.Serializer): text = serializers.CharField() class View(generics.GenericAPIView): serializer_class = ItemSerializer pagination_class = Pagination view = create_view( View, method, create_request(path), ) inspector = AutoSchema() inspector.view = view responses = inspector._get_responses(path, method) assert responses == { '200': { 'description': '', 'content': { 'application/json': { 'schema': { 'type': 'object', 'properties': { 'text': { 'type': 'string', }, }, 'required': ['text'], }, }, }, }, }
def test_serializer_callable_default(self): path = '/' method = 'GET' view = create_view( views.ExampleGenericAPIView, method, create_request(path), ) inspector = AutoSchema() inspector.view = view responses = inspector._get_responses(path, method) response_schema = responses['200']['content']['application/json']['schema'] properties = response_schema['items']['properties'] assert 'default' not in properties['uuid_field']
def test_serializer_hstorefield(self): path = '/' method = 'GET' view = create_view( views.ExampleGenericAPIView, method, create_request(path), ) inspector = AutoSchema() inspector.view = view responses = inspector._get_responses(path, method) response_schema = responses['200']['content']['application/json']['schema'] properties = response_schema['items']['properties'] assert properties['hstore']['type'] == 'object'
def test_serializer_datefield(self): path = '/' method = 'GET' view = create_view( views.ExampleGenericAPIView, method, create_request(path), ) inspector = AutoSchema() inspector.view = view responses = inspector._get_responses(path, method) response_schema = responses['200']['content']['application/json']['schema']['properties'] assert response_schema['date']['type'] == response_schema['datetime']['type'] == 'string' assert response_schema['date']['format'] == 'date' assert response_schema['datetime']['format'] == 'date-time'
def test_response_body_generation(self): path = '/' method = 'POST' class Serializer(serializers.Serializer): text = serializers.CharField() write_only = serializers.CharField(write_only=True) class View(generics.GenericAPIView): serializer_class = Serializer view = create_view(View, method, create_request(path)) inspector = AutoSchema() inspector.view = view responses = inspector._get_responses(path, method) assert responses['200']['content']['application/json']['schema'][ 'required'] == ['text'] assert list(responses['200']['content']['application/json']['schema'] ['properties'].keys()) == ['text']
def test_list_response_body_generation(self): """Test that an array schema is returned for list views.""" path = '/' method = 'GET' class ItemSerializer(serializers.Serializer): text = serializers.CharField() class View(generics.GenericAPIView): serializer_class = ItemSerializer view = create_view( View, method, create_request(path), ) inspector = AutoSchema() inspector.view = view responses = inspector._get_responses(path, method) assert responses == { '200': { 'description': '', 'content': { 'application/json': { 'schema': { 'type': 'array', 'items': { 'type': 'object', 'properties': { 'text': { 'type': 'string', }, }, 'required': ['text'], }, }, }, }, }, }
def test_empty_required_with_patch_method(self): path = '/' method = 'PATCH' class ItemSerializer(serializers.Serializer): read_only = serializers.CharField(read_only=True) write_only = serializers.CharField(write_only=True, required=False) class View(generics.GenericAPIView): serializer_class = ItemSerializer view = create_view(View, method, create_request(path)) inspector = AutoSchema() inspector.view = view components = inspector.get_components(path, method) component = components['Item'] # there should be no empty 'required' property, see #6834 assert 'required' not in component for response in inspector._get_responses(path, method).values(): assert 'required' not in component
def test_delete_response_body_generation(self): """Test that a view's delete method generates a proper response body schema.""" path = '/{id}/' method = 'DELETE' class View(generics.DestroyAPIView): serializer_class = views.ExampleSerializer view = create_view( View, method, create_request(path), ) inspector = AutoSchema() inspector.view = view responses = inspector._get_responses(path, method) assert responses == { '204': { 'description': '', }, }
def test_response_body_generation(self): path = '/' method = 'POST' class Serializer(serializers.Serializer): text = serializers.CharField() write_only = serializers.CharField(write_only=True) class View(generics.GenericAPIView): serializer_class = Serializer view = create_view( View, method, create_request(path) ) inspector = AutoSchema() inspector.view = view responses = inspector._get_responses(path, method) assert responses['200']['content']['application/json']['schema']['required'] == ['text'] assert list(responses['200']['content']['application/json']['schema']['properties'].keys()) == ['text']
def test_renderer_mapping(self): """Test that view's renderers are mapped to OA media types""" path = '/{id}/' method = 'GET' class View(generics.CreateAPIView): serializer_class = views.ExampleSerializer renderer_classes = [JSONRenderer] view = create_view( View, method, create_request(path), ) inspector = AutoSchema() inspector.view = view responses = inspector._get_responses(path, method) # TODO this should be changed once the multiple response # schema support is there success_response = responses['200'] assert len(success_response['content'].keys()) == 1 assert 'application/json' in success_response['content']