From 116da9fbd87708f7aed2fe0ceb8275bc7dc592e2 Mon Sep 17 00:00:00 2001 From: Bruno Marques Date: Mon, 27 Jun 2016 18:02:49 -0300 Subject: [PATCH] Setting Content-Type: text/plain for DELETE responses --- restless/dj.py | 10 ++++++++-- tests/test_dj.py | 23 ++++++++++++++++++++++- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/restless/dj.py b/restless/dj.py index 3ffb778..f7e1ed6 100644 --- a/restless/dj.py +++ b/restless/dj.py @@ -6,6 +6,7 @@ from django.http import HttpResponse, Http404 from django.views.decorators.csrf import csrf_exempt +from .constants import OK, NO_CONTENT from .exceptions import NotFound from .resources import Resource @@ -30,9 +31,14 @@ def is_debug(self): # By default, Django-esque. return settings.DEBUG - def build_response(self, data, status=200): + def build_response(self, data, status=OK): # By default, Django-esque. - resp = HttpResponse(data, content_type='application/json') + if status == NO_CONTENT: + # Avoid crashing the client when it tries to parse nonexisting JSON. + content_type = 'text/plain' + else: + content_type = 'application/json' + resp = HttpResponse(data, content_type=content_type) resp.status_code = status return resp diff --git a/tests/test_dj.py b/tests/test_dj.py index bcdc5be..bd6da39 100644 --- a/tests/test_dj.py +++ b/tests/test_dj.py @@ -51,7 +51,7 @@ def fake_init(self): ] def is_authenticated(self): - if self.request_method() == 'DELETE': + if self.request_method() == 'DELETE' and self.endpoint == 'list': return False return True @@ -82,6 +82,12 @@ def update(self, pk): def create_detail(self): raise ValueError("This is a random & crazy exception.") + def delete(self, pk): + for i, item in enumerate(self.fake_db): + if item.id == pk: + del self.fake_db[i] + return + @skip_prepare def schema(self): # A WILD SCHEMA VIEW APPEARS! @@ -340,3 +346,18 @@ def test_create(self): 'id': 6, 'title': 'Moved hosts' }) + + def test_delete(self): + self.res.request = FakeHttpRequest('DELETE') + self.assertEqual(len(self.res.fake_db), 3) + + resp = self.res.handle('detail', pk=2) + self.assertEqual(resp['Content-Type'], 'text/plain') + self.assertEqual(resp.status_code, 204) + self.assertEqual(resp.content.decode('utf-8'), '') + + # Check the internal state. + self.res.request = FakeHttpRequest('GET') + self.assertEqual(len(self.res.fake_db), 2) + resp = self.res.handle('detail', pk=2) + self.assertEqual(resp.status_code, 404)