1
+ import json
2
+
1
3
from django .conf .urls import url
2
4
from django .contrib .auth .models import User
5
+ from django .http import HttpRequest
3
6
from django .test import override_settings
4
7
5
8
from rest_framework .authentication import TokenAuthentication
6
9
from rest_framework .authtoken .models import Token
10
+ from rest_framework .request import is_form_media_type
11
+ from rest_framework .response import Response
7
12
from rest_framework .test import APITestCase
8
13
from rest_framework .views import APIView
9
14
15
+
16
+ class PostView (APIView ):
17
+ def post (self , request ):
18
+ return Response (data = request .data , status = 200 )
19
+
20
+
10
21
urlpatterns = [
11
- url (r'^$' , APIView .as_view (authentication_classes = (TokenAuthentication ,))),
22
+ url (r'^auth$' , APIView .as_view (authentication_classes = (TokenAuthentication ,))),
23
+ url (r'^post$' , PostView .as_view ()),
12
24
]
13
25
14
26
15
- class MyMiddleware (object ):
27
+ class RequestUserMiddleware (object ):
16
28
def __init__ (self , get_response ):
17
29
self .get_response = get_response
18
30
@@ -24,13 +36,43 @@ def __call__(self, request):
24
36
return response
25
37
26
38
39
+ class RequestPOSTMiddleware (object ):
40
+ def __init__ (self , get_response ):
41
+ self .get_response = get_response
42
+
43
+ def __call__ (self , request ):
44
+ assert isinstance (request , HttpRequest )
45
+
46
+ # Parse body with underlying Django request
47
+ request .body
48
+
49
+ # Process request with DRF view
50
+ response = self .get_response (request )
51
+
52
+ # Ensure request.POST is set as appropriate
53
+ if is_form_media_type (request .content_type ):
54
+ assert request .POST == {'foo' : ['bar' ]}
55
+ else :
56
+ assert request .POST == {}
57
+
58
+ return response
59
+
60
+
27
61
@override_settings (ROOT_URLCONF = 'tests.test_middleware' )
28
62
class TestMiddleware (APITestCase ):
29
63
30
- @override_settings (MIDDLEWARE = ('tests.test_middleware.MyMiddleware ' ,))
64
+ @override_settings (MIDDLEWARE = ('tests.test_middleware.RequestUserMiddleware ' ,))
31
65
def test_middleware_can_access_user_when_processing_response (self ):
32
66
user = User .
objects .
create_user (
'john' ,
'[email protected] ' ,
'password' )
33
67
key = 'abcd1234'
34
68
Token .objects .create (key = key , user = user )
35
69
36
70
self .client .get ('/auth' , HTTP_AUTHORIZATION = 'Token %s' % key )
71
+
72
+ @override_settings (MIDDLEWARE = ('tests.test_middleware.RequestPOSTMiddleware' ,))
73
+ def test_middleware_can_access_request_post_when_processing_response (self ):
74
+ response = self .client .post ('/post' , {'foo' : 'bar' })
75
+ assert response .status_code == 200
76
+
77
+ response = self .client .post ('/post' , {'foo' : 'bar' }, format = 'json' )
78
+ assert response .status_code == 200
0 commit comments