def test_customized_list_serializer(): class X(models.Model): position = models.IntegerField() class XSerializer(serializers.ModelSerializer): class Meta: model = X fields = ("id", "position") class XListUpdateSerializer(serializers.ListSerializer): child = XSerializer() class XAPIView(generics.GenericAPIView): model = X serializer_class = XListUpdateSerializer def put(self, request, *args, **kwargs): pass # pragma: no cover schema = generate_schema('x', view=XAPIView) operation = schema['paths']['/x']['put'] comp = '#/components/schemas/X' assert get_request_schema(operation)['type'] == 'array' assert get_request_schema(operation)['items']['$ref'] == comp assert get_response_schema(operation)['type'] == 'array' assert get_response_schema(operation)['items']['$ref'] == comp assert operation['operationId'] == 'x_update' assert len(schema['components'] ['schemas']) == 1 and 'X' in schema['components']['schemas']
def test_owned_serializer_naming_override_with_ref_name(no_warnings): def x_owned1(): class XSerializer(serializers.Serializer): x = serializers.UUIDField() return XSerializer def x_owned2(): class XSerializer(serializers.Serializer): x = serializers.IntegerField() class Meta: ref_name = 'Y' return XSerializer x_owned1, x_owned2 = x_owned1(), x_owned2() class XAPIView(APIView): @extend_schema(request=x_owned1, responses=x_owned2) def post(self, request): pass # pragma: no cover schema = generate_schema('x', view=XAPIView) operation = schema['paths']['/x']['post'] assert get_request_schema(operation)['$ref'] == '#/components/schemas/X' assert get_response_schema(operation)['$ref'] == '#/components/schemas/Y'
def test_lib_serializer_naming_collision_resolution(no_warnings): """ parity test in tests.test_warnings.test_serializer_name_reuse """ def x_lib1(): class XSerializer(serializers.Serializer): x = serializers.UUIDField() return XSerializer def x_lib2(): class XSerializer(serializers.Serializer): x = serializers.IntegerField() return XSerializer x_lib1, x_lib2 = x_lib1(), x_lib2() class XAPIView(APIView): @extend_schema(request=x_lib1, responses=x_lib2) def post(self, request): pass # pragma: no cover class Lib2XSerializerRename(OpenApiSerializerExtension): target_class = x_lib2 # also accepts import strings def get_name(self): return 'RenamedLib2X' schema = generate_schema('x', view=XAPIView) operation = schema['paths']['/x']['post'] assert get_request_schema(operation)['$ref'] == '#/components/schemas/X' assert get_response_schema( operation)['$ref'] == '#/components/schemas/RenamedLib2X'
def test_many_polymorphic_serializer_extend_schema(no_warnings, explicit): if explicit: proxy_serializer = serializers.ListSerializer( child=PolymorphicProxySerializer(**PROXY_SERIALIZER_PARAMS)) else: proxy_serializer = PolymorphicProxySerializer(** PROXY_SERIALIZER_PARAMS, many=True) @extend_schema(request=proxy_serializer, responses=proxy_serializer) @api_view(['POST']) def view_func(request, format=None): pass # pragma: no cover schema = generate_schema('/x/', view_function=view_func) assert 'MetaPerson' in schema['components']['schemas'] op = schema['paths']['/x/']['post'] assert get_response_schema(op) == { 'type': 'array', 'items': { '$ref': '#/components/schemas/MetaPerson' } } assert get_request_schema(op) == { 'type': 'array', 'items': { '$ref': '#/components/schemas/MetaPerson' } }
def test_api_view_decorator_multi(no_warnings): @extend_schema(request=OpenApiTypes.FLOAT, responses=OpenApiTypes.INT, methods=['POST']) @extend_schema(responses=OpenApiTypes.FLOAT, methods=['GET']) @api_view(['GET', 'POST']) def pi(request): pass # pragma: no cover schema = generate_schema('x', view_function=pi) operation = schema['paths']['/x']['get'] assert get_response_schema(operation)['type'] == 'number' operation = schema['paths']['/x']['post'] assert get_request_schema(operation)['type'] == 'number' assert get_response_schema(operation)['type'] == 'integer'
def test_list_serializer_with_field_child_on_extend_schema(): class XAPIView(APIView): @extend_schema( request=serializers.ListSerializer(child=serializers.IntegerField()), responses=serializers.ListSerializer(child=serializers.IntegerField()), ) def post(self, request): pass # pragma: no cover schema = generate_schema('x', view=XAPIView) req_schema = get_request_schema(schema['paths']['/x']['post']) res_schema = get_response_schema(schema['paths']['/x']['post']) for s in [req_schema, res_schema]: assert s['type'] == 'array' assert s['items']['type'] == 'integer'
def test_file_field_duality_on_split_request(no_warnings): class XSerializer(serializers.Serializer): file = serializers.FileField() class XView(generics.ListCreateAPIView): serializer_class = XSerializer parser_classes = [parsers.MultiPartParser] schema = generate_schema('/x', view=XView) assert get_response_schema( schema['paths']['/x']['get'] )['items']['$ref'] == '#/components/schemas/X' assert get_request_schema( schema['paths']['/x']['post'], content_type='multipart/form-data' )['$ref'] == '#/components/schemas/XRequest' assert schema['components']['schemas']['X']['properties']['file']['format'] == 'uri' assert schema['components']['schemas']['XRequest']['properties']['file']['format'] == 'binary'
def test_list_serializer_with_field_child(): class XSerializer(serializers.Serializer): field = serializers.ListSerializer(child=serializers.IntegerField()) class XAPIView(views.APIView): serializer_class = XSerializer def post(self, request, *args, **kwargs): pass # pragma: no cover # assumption on Serializer functionality assert XSerializer({'field': [1, 2, 3]}).data['field'] == [1, 2, 3] schema = generate_schema('x', view=XAPIView) assert get_request_schema(schema['paths']['/x']['post'])['$ref'] == '#/components/schemas/X' assert get_response_schema(schema['paths']['/x']['post'])['$ref'] == '#/components/schemas/X' properties = schema['components']['schemas']['X']['properties'] assert properties['field']['type'] == 'array' assert properties['field']['items']['type'] == 'integer'
def test_component_split_request(): class XSerializer(serializers.Serializer): ro = serializers.IntegerField(read_only=True) rw = serializers.IntegerField() wo = serializers.IntegerField(write_only=True) @extend_schema(request=XSerializer, responses=XSerializer) @api_view(['POST']) def pi(request, format=None): pass # pragma: no cover schema = generate_schema('/x', view_function=pi) operation = schema['paths']['/x']['post'] assert get_response_schema(operation)['$ref'] == '#/components/schemas/X' assert get_request_schema(operation)['$ref'] == '#/components/schemas/XRequest' assert len(schema['components']['schemas']['X']['properties']) == 2 assert 'wo' not in schema['components']['schemas']['X']['properties'] assert len(schema['components']['schemas']['XRequest']['properties']) == 2 assert 'ro' not in schema['components']['schemas']['XRequest']['properties']
def test_many_polymorphic_proxy_serializer_extend_schema_field( no_warnings, explicit): if explicit: proxy_serializer = serializers.ListField( child=PolymorphicProxySerializer(**PROXY_SERIALIZER_PARAMS)) else: proxy_serializer = PolymorphicProxySerializer(** PROXY_SERIALIZER_PARAMS, many=True) @extend_schema_field(proxy_serializer) class XField(serializers.DictField): pass # pragma: no cover class XSerializer(serializers.Serializer): field = XField() @extend_schema(request=XSerializer, responses=XSerializer) @api_view(['POST']) def view_func(request, format=None): pass # pragma: no cover schema = generate_schema('/x/', view_function=view_func) assert 'MetaPerson' in schema['components']['schemas'] assert schema['components']['schemas']['X'] == { 'type': 'object', 'properties': { 'field': { 'type': 'array', 'items': { '$ref': '#/components/schemas/MetaPerson' } } }, 'required': ['field'] } op = schema['paths']['/x/']['post'] assert get_request_schema(op) == {'$ref': '#/components/schemas/X'} assert get_response_schema(op) == {'$ref': '#/components/schemas/X'}