@@ -656,3 +656,77 @@ def test_examples_from_extend_schema_serializer_are_showing_up(api_client):
656656 assert (
657657 examples ["ExtendSchemaSerializerExample" ]["value" ]["field" ] == "specific_value"
658658 )
659+
660+
661+ class CustomError403Serializer (serializers .Serializer ):
662+ code = serializers .ChoiceField (choices = [("perm_denied" , "perm_denied" )])
663+ detail = serializers .CharField ()
664+ attr = serializers .CharField (allow_null = True )
665+
666+
667+ class CustomErrorResponse403Serializer (serializers .Serializer ):
668+ type = serializers .ChoiceField (choices = ClientErrorEnum .choices )
669+ errors = CustomError403Serializer (many = True )
670+
671+
672+ class ExpSerializer (serializers .Serializer ):
673+ field = serializers .CharField ()
674+
675+
676+ class ExamplesView (GenericAPIView ):
677+ authentication_classes = [BasicAuthentication ]
678+ permission_classes = [IsAuthenticated , IsAdminUser ]
679+ serializer_class = ExpSerializer
680+
681+ @extend_schema (
682+ responses = {
683+ 403 : OpenApiResponse (
684+ response = CustomErrorResponse403Serializer ,
685+ description = "Registration is disabled" ,
686+ )
687+ },
688+ examples = [
689+ OpenApiExample (
690+ "Example" ,
691+ summary = "short summary" ,
692+ description = "longer description" ,
693+ value = {
694+ "type" : "client_error" ,
695+ "errors" : [
696+ {
697+ "code" : "perm_denied" ,
698+ "detail" : "Registration is disabled." ,
699+ "attr" : None ,
700+ }
701+ ],
702+ },
703+ status_codes = [403 ],
704+ ),
705+ ],
706+ )
707+ def get (self , request , * args , ** kwargs ):
708+ serializer = self .get_serializer (instance = {"field" : "value1" })
709+ return Response (serializer .data )
710+
711+
712+ def test_default_examples_are_showing_up_only_when_status_code_is_allowed (
713+ api_client , settings
714+ ):
715+ settings .DRF_STANDARDIZED_ERRORS = {"ALLOWED_ERROR_STATUS_CODES" : ["403" ]}
716+
717+ route = "perm-denied/"
718+ view = ExamplesView .as_view ()
719+ schema = generate_view_schema (route , view )
720+ responses = get_responses (schema , route )
721+ examples = responses ["403" ]["content" ]["application/json" ]["examples" ]
722+ assert "Example" in examples
723+ assert "PermissionDenied" in examples
724+
725+ settings .DRF_STANDARDIZED_ERRORS = {"ALLOWED_ERROR_STATUS_CODES" : []}
726+ route = "perm-denied/"
727+ view = ExamplesView .as_view ()
728+ schema = generate_view_schema (route , view )
729+ responses = get_responses (schema , route )
730+ examples = responses ["403" ]["content" ]["application/json" ]["examples" ]
731+ assert "Example" in examples
732+ assert "PermissionDenied" not in examples
0 commit comments