Skip to content

Commit 3b6e995

Browse files
committed
Add documentation about how to transform factory request to DRF request
1 parent 853969c commit 3b6e995

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

docs/api-guide/testing.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,20 @@ This means that setting attributes directly on the request object may not always
105105
request.user = user
106106
response = view(request)
107107

108+
If you want to test a request involving the REST framework’s 'Request' object, you’ll need to manually transform it first:
109+
110+
class DummyView(APIView):
111+
...
112+
113+
factory = APIRequestFactory()
114+
request = factory.get('/', {'demo': 'test'})
115+
drf_request = DummyView().initialize_request(request)
116+
assert drf_request.query_params == {'demo': ['test']}
117+
118+
request = factory.post('/', {'example': 'test'})
119+
drf_request = DummyView().initialize_request(request)
120+
assert drf_request.data.get('example') == 'test'
121+
108122
---
109123

110124
## Forcing CSRF validation

tests/test_testing.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from rest_framework.test import (
1818
APIClient, APIRequestFactory, URLPatternsTestCase, force_authenticate
1919
)
20+
from rest_framework.views import APIView
2021

2122

2223
@api_view(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'])
@@ -294,6 +295,28 @@ def test_explicitly_enforce_csrf_checks(self):
294295
assert response.status_code == 403
295296
assert response.data == expected
296297

298+
def test_transform_factory_django_request_to_drf_request(self):
299+
"""
300+
ref: GH-3608, GH-4440 & GH-6488.
301+
"""
302+
303+
factory = APIRequestFactory()
304+
305+
class DummyView(APIView): # Your custom view.
306+
...
307+
308+
request = factory.get('/', {'demo': 'test'})
309+
drf_request = DummyView().initialize_request(request)
310+
assert drf_request.query_params == {'demo': ['test']}
311+
312+
assert hasattr(drf_request, 'accepted_media_type') is False
313+
DummyView().initial(drf_request)
314+
assert drf_request.accepted_media_type == 'application/json'
315+
316+
request = factory.post('/', {'example': 'test'})
317+
drf_request = DummyView().initialize_request(request)
318+
assert drf_request.data.get('example') == 'test'
319+
297320
def test_invalid_format(self):
298321
"""
299322
Attempting to use a format that is not configured will raise an

0 commit comments

Comments
 (0)