HTTP DELETE in Django TestClient

Although it may be rare to do it, an HTTP DELETE may have a payload that accompanies it as noted near the end of section 4.3.5 of Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content (draft 22).  An example would be in the SmartFile API to delete attributes or tags from the information associated with a path (see Path Info API).

While Django 1.5 fixes this, TestClient in prior versions of Django did not pass the payload to the view.  I believe in keeping it simple, so I devised a way to do it that works with Django v1.4 and possibly earlier versions; I subverted a separate call (i.e., put()) to behave like delete.  The way Client.put() works allows the HTTP method to be changed since it updates the request with everything in its kwargs.

from django.test.client import Client

class PayloadClient(Client):
    def delete_with_data(self, *args, **kwargs):
        """ Construct a DELETE request that includes data.
        kwargs.update({'REQUEST_METHOD': 'DELETE'})
        return super(PayloadClient, self).put(*args, **kwargs)

To make use of it, one only needs to set the client_class attribute of a TestCase-based test case to this client and call it within the test case with the payload.  Here is an example unit test to delete the testtag tag off testfile.

from django.test import TestCase

class PayloadTestCase(TestCase):
    client_class = PayloadClient
    def test_delete(self):
        self.client.delete_with_data('/api/2/path/info/testfile',
                                     {'tags': ('testtag', )})

SmartFile is a business file mangement platform that gives you more control, compliance and security.

TO SIGN UP