Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django Test Client Method Override Header

I am trying to test my update method on my viewset. The viewset is a modelviewset taken from drf. To update i would need to send a put request. As this is not always supported there are 2 ways to tell the server i am making a put request, the first which does not fit my needs is to use an additional field to form called _method and set it to put. As i need to post json data i need to use the second way, which uses the X-HTTP-Method-Override header.

To post my data in the testcase i use the following code:

header = {'X_HTTP_METHOD_OVERRIDE': 'PUT'} response = client.post('/model/1/', content_type='application/json', data=post_data_clean, **header) 

But unfortunately the result I get is {'detail':'Method POST not allowed.'}. I tested the behavior of the server using a addon (Postman) where i specified the X-HTTP-Method-Override header too. No exception is raised. I need to know now how to correctly pass the header to the django test client, otherwise testing will get really annoying over here.

like image 888
Iwan1993 Avatar asked Aug 09 '15 09:08

Iwan1993


2 Answers

You need to specify header as 'HTTP_X_HTTP_METHOD_OVERRIDE' instead of 'X_HTTP_METHOD_OVERRIDE' i.e. add HTTP_ at the beginning of the header.

header = {'HTTP_X_HTTP_METHOD_OVERRIDE': 'PUT'} response = client.post('/model/1/', content_type='application/json', data=post_data_clean, **header) 

From the Django documentation:

HTTP headers in the request are converted to META keys by converting all characters to uppercase, replacing any hyphens with underscores and adding an HTTP_ prefix to the name. So, for example, a header called X-Bender would be mapped to the META key HTTP_X_BENDER.

like image 174
Rahul Gupta Avatar answered Sep 16 '22 17:09

Rahul Gupta


Also, you can pass headers to the constructor of the Client:

from django.test import Client  client = Client(HTTP_USER_AGENT="Mozilla/5.0 ...", HTTP_X_USER_ID="982734") 

This way every request will contain default headers.

PS: This approach is valid for DRF TestApiClient and ApiRequestFactory.

like image 45
username Avatar answered Sep 17 '22 17:09

username