Skip to content

Commit b333ca5

Browse files
committed
move adding error examples to AutoSchema._get_examples to avoid @extend_schema_serializer examples being ignored
fixes #65
1 parent 90b82bf commit b333ca5

File tree

3 files changed

+47
-2
lines changed

3 files changed

+47
-2
lines changed

docs/changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
1010

1111
### Fixed
1212
- enforce support of only drf-spectacular 0.27 and newer in pyproject.toml
13+
- ensure examples from `@extend_schema_serializer` are not ignored when adding error response examples
1314

1415
## [0.13.0] - 2024-02-28
1516
### Changed

drf_standardized_errors/openapi.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -337,5 +337,14 @@ def _get_extra_validation_errors(self) -> Dict[str, Set[str]]:
337337

338338
return extra_codes_by_field
339339

340-
def get_examples(self) -> list:
341-
return get_error_examples()
340+
def _get_examples(
341+
self, serializer, direction, media_type, status_code=None, extras=None
342+
):
343+
all_examples = (extras or []) + get_error_examples()
344+
return super()._get_examples(
345+
serializer,
346+
direction,
347+
media_type,
348+
status_code=status_code,
349+
extras=all_examples,
350+
)

tests/test_openapi.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@
77
from drf_spectacular.types import OpenApiTypes
88
from drf_spectacular.utils import (
99
OpenApiCallback,
10+
OpenApiExample,
1011
OpenApiResponse,
1112
PolymorphicProxySerializer,
1213
extend_schema,
14+
extend_schema_serializer,
1315
inline_serializer,
1416
)
1517
from rest_framework import serializers
@@ -621,3 +623,36 @@ def test_get_view_does_not_raise_missing_serializer_warning(capsys):
621623
def test_schema_generated(api_client):
622624
response = api_client.get("/schema/")
623625
assert response.status_code == 200
626+
627+
628+
@extend_schema_serializer(
629+
examples=[
630+
OpenApiExample(
631+
"extend_schema_serializer_example",
632+
summary="short summary",
633+
value={"field": "specific_value"},
634+
response_only=True,
635+
),
636+
]
637+
)
638+
class SomeSerializer(serializers.Serializer):
639+
field = serializers.CharField()
640+
641+
642+
class ExtendSchemaSerializerView(GenericAPIView):
643+
serializer_class = SomeSerializer
644+
645+
def get(self, request, *args, **kwargs):
646+
serializer = self.get_serializer(instance={"field": "value1"})
647+
return Response(serializer.data)
648+
649+
650+
def test_examples_from_extend_schema_serializer_are_showing_up(api_client):
651+
view = ExtendSchemaSerializerView.as_view()
652+
schema = generate_view_schema("extend_schema_serializer/", view)
653+
resp200 = schema["paths"]["/extend_schema_serializer/"]["get"]["responses"]["200"]
654+
assert "examples" in resp200["content"]["application/json"]
655+
examples = resp200["content"]["application/json"]["examples"]
656+
assert (
657+
examples["ExtendSchemaSerializerExample"]["value"]["field"] == "specific_value"
658+
)

0 commit comments

Comments
 (0)