Skip to content

Commit 9811572

Browse files
committed
add json_request decorator with test-cases
1 parent 98b1dcd commit 9811572

File tree

2 files changed

+124
-1
lines changed

2 files changed

+124
-1
lines changed

jsonview/decorators.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,3 +159,28 @@ def _wrapped(request, *a, **kw):
159159
return decorator(args[0])
160160
else:
161161
return decorator
162+
163+
164+
def json_request(*args, **kwargs):
165+
assume_json = bool(kwargs.get('assume_json', True))
166+
167+
def decorator(f):
168+
@wraps(f)
169+
def _wrapped(request, *a, **kw):
170+
request.data = {}
171+
if assume_json or request.META.get('CONTENT_TYPE') == JSON:
172+
try:
173+
request.data = json.loads(request.body)
174+
except:
175+
pass
176+
elif request.method == 'GET':
177+
request.data = request.GET.dict()
178+
elif request.method == 'POST':
179+
request.data = request.POST.dict()
180+
return f(request, *a, **kw)
181+
return _wrapped
182+
183+
if len(args) == 1 and callable(args[0]):
184+
return decorator(args[0])
185+
else:
186+
return decorator

jsonview/tests.py

Lines changed: 99 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
import mock
1919

20-
from .decorators import json_view
20+
from .decorators import json_view, json_request
2121
from .exceptions import BadRequest
2222

2323

@@ -326,3 +326,101 @@ def get(self, request):
326326
eq_(JSON, res['content-type'])
327327
data = json.loads(res.content.decode('utf-8'))
328328
eq_('bar', data['foo'])
329+
330+
331+
class JsonRequestTests(TestCase):
332+
def test_application_json(self):
333+
data = {
334+
'foo': 'bar',
335+
'baz': 'qux',
336+
'quz': [{'foo': 'bar'}],
337+
}
338+
339+
@json_request
340+
def temp(req):
341+
return req.data
342+
343+
res = temp(rf.post(
344+
'/',
345+
data=json.dumps(data),
346+
content_type='application/json'
347+
))
348+
eq_(res, data)
349+
350+
def test_get_requests(self):
351+
data = {
352+
'foo': 'bar',
353+
'baz': '0'
354+
}
355+
356+
@json_request(assume_json=False)
357+
def temp(req):
358+
return req.data
359+
360+
res = temp(rf.get('/?foo=bar&baz=0'))
361+
eq_(res, data)
362+
363+
def test_post_requests(self):
364+
data = {
365+
'foo': 'bar',
366+
'baz': '0'
367+
}
368+
369+
@json_request(assume_json=False)
370+
def temp(req):
371+
return req.data
372+
373+
# test application/x-www-form-urlencoded
374+
res = temp(rf.post(
375+
'/',
376+
data='foo=bar&baz=0',
377+
content_type='application/x-www-form-urlencoded'
378+
))
379+
eq_(res, data)
380+
381+
# test multipart/form-data
382+
res = temp(rf.post('/', data=data, files=None))
383+
eq_(res, data)
384+
385+
def test_assume_json(self):
386+
data = {
387+
'foo': 'bar',
388+
'baz': '0'
389+
}
390+
391+
@json_request(assume_json=True)
392+
def temp(req):
393+
return req.data
394+
395+
@json_request(assume_json=False)
396+
def temp_2(req):
397+
return req.data
398+
399+
# test get request
400+
res = temp(rf.get('/?foo=bar&baz=0'))
401+
eq_(res, {})
402+
403+
res = temp_2(rf.get('/?foo=bar&baz=0'))
404+
eq_(res, data)
405+
406+
# test application/x-www-form-urlencoded
407+
res = temp(rf.post(
408+
'/',
409+
data='foo=bar&baz=0',
410+
content_type='application/x-www-form-urlencoded'
411+
))
412+
eq_(res, {})
413+
414+
res = temp_2(rf.post(
415+
'/',
416+
data='foo=bar&baz=0',
417+
content_type='application/x-www-form-urlencoded'
418+
))
419+
eq_(res, data)
420+
421+
# test multipart/form-data
422+
res = temp(rf.post('/', data=data, files=None))
423+
eq_(res, {})
424+
425+
res = temp_2(rf.post('/', data=data, files=None))
426+
eq_(res, data)

0 commit comments

Comments
 (0)