Fix for 500 error when POST data is not a dict.

This commit is contained in:
Chris Church 2013-08-26 11:26:03 -04:00
parent e661f96054
commit e343c9386d
3 changed files with 22 additions and 2 deletions

View File

@ -257,6 +257,9 @@ class SubListCreateAPIView(SubListAPIView, ListCreateAPIView):
return Response(status=status.HTTP_204_NO_CONTENT)
def post(self, request, *args, **kwargs):
if not isinstance(request.DATA, dict):
return Response('invalid type for post data',
status=status.HTTP_400_BAD_REQUEST)
if 'disassociate' in request.DATA:
return self.unattach(request, *args, **kwargs)
else:

View File

@ -154,8 +154,8 @@ class BaseTestMixin(object):
data_type=None, accept=None, remote_addr=None):
assert method is not None
method_name = method.lower()
if method_name not in ('options', 'head', 'get', 'delete'):
assert data is not None
#if method_name not in ('options', 'head', 'get', 'delete'):
# assert data is not None
client_kwargs = {}
if accept:
client_kwargs['HTTP_ACCEPT'] = accept

View File

@ -394,4 +394,21 @@ class OrganizationsTest(BaseTest):
# also check that DELETE on the collection doesn't work
self.delete(self.collection(), expect=405, auth=self.get_super_credentials())
def test_invalid_post_data(self):
url = reverse('main:organization_list')
# API should gracefully handle data of an invalid type.
self.post(url, expect=400, data=None, auth=self.get_super_credentials())
self.post(url, expect=400, data=99, auth=self.get_super_credentials())
self.post(url, expect=400, data='abcd', auth=self.get_super_credentials())
self.post(url, expect=400, data=3.14, auth=self.get_super_credentials())
self.post(url, expect=400, data=True, auth=self.get_super_credentials())
self.post(url, expect=400, data=[1,2,3], auth=self.get_super_credentials())
url = reverse('main:organization_users_list', args=(self.organizations[0].pk,))
self.post(url, expect=400, data=None, auth=self.get_super_credentials())
self.post(url, expect=400, data=99, auth=self.get_super_credentials())
self.post(url, expect=400, data='abcd', auth=self.get_super_credentials())
self.post(url, expect=400, data=3.14, auth=self.get_super_credentials())
self.post(url, expect=400, data=True, auth=self.get_super_credentials())
self.post(url, expect=400, data=[1,2,3], auth=self.get_super_credentials())
# TODO: tests for tag disassociation