Skip to content

Commit

Permalink
Correct schema parsing for JSONField (encode#5878)
Browse files Browse the repository at this point in the history
Fixes encode#5873.
* Use Object type. 
* Add test for field_to_schema
  • Loading branch information
beruic authored and Pierre Chiquet committed Mar 24, 2020
1 parent cc9bff5 commit ea25219
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 0 deletions.
3 changes: 3 additions & 0 deletions rest_framework/schemas/inspectors.py
Expand Up @@ -95,13 +95,16 @@ def field_to_schema(field):
description=description,
format='date-time'
)
elif isinstance(field, serializers.JSONField):
return coreschema.Object(title=title, description=description)

if field.style.get('base_template') == 'textarea.html':
return coreschema.String(
title=title,
description=description,
format='textarea'
)

return coreschema.String(title=title, description=description)


Expand Down
41 changes: 41 additions & 0 deletions tests/test_schemas.py
Expand Up @@ -17,6 +17,7 @@
AutoSchema, ManualSchema, SchemaGenerator, get_schema_view
)
from rest_framework.schemas.generators import EndpointEnumerator
from rest_framework.schemas.inspectors import field_to_schema
from rest_framework.schemas.utils import is_list_view
from rest_framework.test import APIClient, APIRequestFactory
from rest_framework.utils import formatting
Expand Down Expand Up @@ -763,6 +764,46 @@ class CustomView(APIView):
link = view.schema.get_link(path, method, base_url)
assert link == expected

def test_field_to_schema(self):
label = 'Test label'
help_text = 'This is a helpful test text'

cases = [
# tuples are ([field], [expected schema])
# TODO: Add remaining cases
(
serializers.BooleanField(label=label, help_text=help_text),
coreschema.Boolean(title=label, description=help_text)
),
(
serializers.DecimalField(1000, 1000, label=label, help_text=help_text),
coreschema.Number(title=label, description=help_text)
),
(
serializers.FloatField(label=label, help_text=help_text),
coreschema.Number(title=label, description=help_text)
),
(
serializers.IntegerField(label=label, help_text=help_text),
coreschema.Integer(title=label, description=help_text)
),
(
serializers.DateField(label=label, help_text=help_text),
coreschema.String(title=label, description=help_text, format='date')
),
(
serializers.DateTimeField(label=label, help_text=help_text),
coreschema.String(title=label, description=help_text, format='date-time')
),
(
serializers.JSONField(label=label, help_text=help_text),
coreschema.Object(title=label, description=help_text)
),
]

for case in cases:
self.assertEqual(field_to_schema(case[0]), case[1])


def test_docstring_is_not_stripped_by_get_description():
class ExampleDocstringAPIView(APIView):
Expand Down

0 comments on commit ea25219

Please sign in to comment.