diff --git a/drf_spectacular/extensions.py b/drf_spectacular/extensions.py index 37e206ea..0ea301c3 100644 --- a/drf_spectacular/extensions.py +++ b/drf_spectacular/extensions.py @@ -18,7 +18,7 @@ def get_security_requirement(self, auto_schema): @abstractmethod def get_security_definition(self, auto_schema): - pass + pass # pragma: no cover class OpenApiSerializerExtension(OpenApiGeneratorExtension['OpenApiSerializerExtension']): @@ -33,7 +33,7 @@ def get_name(self) -> Optional[str]: @abstractmethod def map_serializer(self, auto_schema, direction): - pass + pass # pragma: no cover class OpenApiSerializerFieldExtension(OpenApiGeneratorExtension['OpenApiSerializerFieldExtension']): @@ -44,7 +44,7 @@ class OpenApiSerializerFieldExtension(OpenApiGeneratorExtension['OpenApiSerializ @abstractmethod def map_serializer_field(self, auto_schema): - pass + pass # pragma: no cover class OpenApiViewExtension(OpenApiGeneratorExtension['OpenApiViewExtension']): @@ -62,4 +62,4 @@ def _load_class(cls): @abstractmethod def view_replacement(self): - pass + pass # pragma: no cover diff --git a/tests/test_extensions.py b/tests/test_extensions.py index 30ab6f92..eaef08f1 100644 --- a/tests/test_extensions.py +++ b/tests/test_extensions.py @@ -1,4 +1,6 @@ from rest_framework import fields, serializers, viewsets, mixins +from rest_framework.decorators import api_view +from rest_framework.response import Response from rest_framework.views import APIView from drf_spectacular.extensions import OpenApiSerializerFieldExtension, OpenApiViewExtension @@ -35,7 +37,7 @@ class XViewset(mixins.ListModelMixin, viewsets.GenericViewSet): class XView(APIView): """ underspecified library view """ def get(self): - return 1.234 # pragma: no cover + return Response(1.234) # pragma: no cover def test_view_extension(no_warnings): @@ -54,3 +56,23 @@ def get(self, request): validate_schema(schema) operation = schema['paths']['/x']['get'] assert operation['responses']['200']['content']['application/json']['schema']['type'] == 'number' + + +@api_view() +def x_view_function(): + """ underspecified library view """ + return Response(1.234) # pragma: no cover + + +def test_view_function_extension(no_warnings): + class FixXFunctionView(OpenApiViewExtension): + target_class = 'tests.test_extensions.x_view_function' + + def view_replacement(self): + fixed = extend_schema(responses=OpenApiTypes.FLOAT)(self.target_class) + return fixed + + schema = generate_schema('x', view_function=x_view_function) + validate_schema(schema) + operation = schema['paths']['/x']['get'] + assert operation['responses']['200']['content']['application/json']['schema']['type'] == 'number'