From a5fcf10c0ee269f77d04f41bc087a8c4d2ba6b59 Mon Sep 17 00:00:00 2001 From: Artem Muterko Date: Sat, 7 Jan 2017 00:32:13 +0200 Subject: [PATCH] Raise RuntimeError when trying to encode coreapi objects (#4790) --- rest_framework/utils/encoders.py | 10 +++++----- tests/test_encoders.py | 11 +++++++++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/rest_framework/utils/encoders.py b/rest_framework/utils/encoders.py index 8203a7bc8..8896e4f2c 100644 --- a/rest_framework/utils/encoders.py +++ b/rest_framework/utils/encoders.py @@ -55,6 +55,11 @@ class JSONEncoder(json.JSONEncoder): elif hasattr(obj, 'tolist'): # Numpy arrays and array scalars. return obj.tolist() + elif (coreapi is not None) and isinstance(obj, (coreapi.Document, coreapi.Error)): + raise RuntimeError( + 'Cannot return a coreapi object from a JSON view. ' + 'You should be using a schema renderer instead for this view.' + ) elif hasattr(obj, '__getitem__'): try: return dict(obj) @@ -62,9 +67,4 @@ class JSONEncoder(json.JSONEncoder): pass elif hasattr(obj, '__iter__'): return tuple(item for item in obj) - elif (coreapi is not None) and isinstance(obj, (coreapi.Document, coreapi.Error)): - raise RuntimeError( - 'Cannot return a coreapi object from a JSON view. ' - 'You should be using a schema renderer instead for this view.' - ) return super(JSONEncoder, self).default(obj) diff --git a/tests/test_encoders.py b/tests/test_encoders.py index 687141476..403b1e9b2 100644 --- a/tests/test_encoders.py +++ b/tests/test_encoders.py @@ -4,6 +4,7 @@ from uuid import uuid4 from django.test import TestCase +from rest_framework.compat import coreapi from rest_framework.utils.encoders import JSONEncoder @@ -79,3 +80,13 @@ class JSONEncoderTests(TestCase): """ unique_id = uuid4() assert self.encoder.default(unique_id) == str(unique_id) + + def test_encode_coreapi_raises_error(self): + """ + Tests encoding a coreapi objects raises proper error + """ + with self.assertRaises(RuntimeError): + self.encoder.default(coreapi.Document()) + + with self.assertRaises(RuntimeError): + self.encoder.default(coreapi.Error())