1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
|
import sys
import typing
import pytest
from django.urls import path
from rest_framework.decorators import api_view
from drf_spectacular.utils import extend_schema, extend_schema_serializer
from tests import assert_schema, generate_schema
@pytest.mark.contrib('rest_framework_dataclasses')
@pytest.mark.skipif(sys.version_info < (3, 7), reason='dataclass required by package')
def test_rest_framework_dataclasses(no_warnings):
from dataclasses import dataclass
from rest_framework_dataclasses.serializers import DataclassSerializer
@dataclass
class PersonDetail:
name: str
length: int
@dataclass
class Person:
name: str
length: int
detail: PersonDetail
@dataclass
class Group:
name: str
leader: Person
members: typing.List[Person]
class GroupSerializer(DataclassSerializer):
class Meta:
dataclass = Group
class GroupSerializer2(DataclassSerializer):
class Meta:
dataclass = Group
ref_name = "CustomGroupNameFromRefName"
@extend_schema_serializer(component_name='CustomGroupNameFromSerializerDecoration')
class GroupSerializer3(DataclassSerializer[Group]):
class Meta:
dataclass = Group
@extend_schema_serializer(component_name='CustomGroupNameFromDecoration')
@dataclass
class Group2:
name: str
leader: Person
members: typing.List[Person]
@extend_schema(responses=GroupSerializer)
@api_view(['GET'])
def named(request):
pass # pragma: no cover
@extend_schema(responses=DataclassSerializer(dataclass=Person))
@api_view(['GET'])
def anonymous(request):
pass # pragma: no cover
@extend_schema(responses=GroupSerializer2(many=True))
@api_view(['GET'])
def custom_name_via_ref(request):
pass # pragma: no cover
@extend_schema(responses=DataclassSerializer(dataclass=Group2))
@api_view(['GET'])
def custom_name_via_decoration(request):
pass # pragma: no cover
@extend_schema(responses=GroupSerializer3)
@api_view(['GET'])
def custom_name_via_serializer_decoration(request):
pass # pragma: no cover
urlpatterns = [
path('named', named),
path('anonymous', anonymous),
path('custom_name_via_ref', custom_name_via_ref),
path('custom_name_via_decoration', custom_name_via_decoration),
path('custom_name_via_serializer_decoration', custom_name_via_serializer_decoration)
]
assert_schema(
generate_schema(None, patterns=urlpatterns),
'tests/contrib/test_rest_framework_dataclasses.yml'
)
@pytest.mark.contrib('rest_framework_dataclasses')
@pytest.mark.skipif(sys.version_info < (3, 7), reason='dataclass required by package')
def test_rest_framework_dataclasses_class_reuse(no_warnings):
from dataclasses import dataclass
from rest_framework_dataclasses.serializers import DataclassSerializer
@dataclass
class Person:
name: str
age: int
@dataclass
class Party:
person: Person
num_persons: int
class PartySerializer(DataclassSerializer[Party]):
class Meta:
dataclass = Party
class PersonSerializer(DataclassSerializer[Person]):
class Meta:
dataclass = Person
@extend_schema(responses=PartySerializer)
@api_view()
def party(request):
pass # pragma: no cover
@extend_schema(responses=PersonSerializer)
@api_view()
def person(request):
pass # pragma: no cover
urlpatterns = [
path('party', person),
path('person', party),
]
schema = generate_schema(None, patterns=urlpatterns)
# just existence is enough to check since its about no_warnings
assert 'Person' in schema['components']['schemas']
assert 'Party' in schema['components']['schemas']
|