Skip to content

Commit

Permalink
Add json_body test
Browse files Browse the repository at this point in the history
  • Loading branch information
Maxim Avanov committed Jan 16, 2015
1 parent 22bd95e commit 5e387da
Show file tree
Hide file tree
Showing 8 changed files with 43 additions and 18 deletions.
20 changes: 16 additions & 4 deletions rhetoric/middleware.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,28 @@
from django.http import HttpResponse
import json
from django.http import HttpResponse, HttpRequest
from django.middleware.csrf import CsrfViewMiddleware

from rhetoric.view import ViewCallback
from rhetoric.request import JsonBodyProperty
from .view import ViewCallback
from .compat import text_


class CsrfProtectedViewDispatchMiddleware(CsrfViewMiddleware):

def __init__(self):
super(CsrfProtectedViewDispatchMiddleware, self).__init__()
self.add_property(
HttpRequest,
'json_body',
lambda request: json.loads(text_(request.read(), request.encoding or 'utf-8'))
)

def process_request(self, request):
# We assume here that CsrfViewMiddleware doesn't have the process_request method
# which should be called via super().
# -------------------------------------------------
# set request.response object as in
# http://docs.pylonsproject.org/projects/pyramid/en/latest/api/request.html#pyramid.request.Request.response
setattr(request, 'response', HttpResponse())
setattr(request, 'json_body', JsonBodyProperty(request))


def process_view(self, request, callback, callback_args, callback_kwargs):
Expand All @@ -29,3 +37,7 @@ def process_view(self, request, callback, callback_args, callback_kwargs):
return super(CsrfProtectedViewDispatchMiddleware, self).process_view(
request, callback, callback_args, callback_kwargs
)

def add_property(self, cls, name, method):
if not hasattr(cls, name):
setattr(cls, name, property(method))
10 changes: 0 additions & 10 deletions rhetoric/request.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,2 @@
""" Request-related shortcuts.
"""
import json

from django.utils.functional import SimpleLazyObject

from .compat import text_


class JsonBodyProperty(SimpleLazyObject):
def __init__(self, request):
super(JsonBodyProperty, self).__init__(lambda: json.loads(text_(request.read(), request.encoding or 'utf-8')))
2 changes: 0 additions & 2 deletions tests/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,3 @@ def setUp(self):
self.client = Client(**DEFAULT_HEADERS)
self.rhetoric = rhetoric
self.wsgi_app = application


Empty file added tests/blogs/__init__.py
Empty file.
11 changes: 11 additions & 0 deletions tests/blogs/forms_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import json

from .. import BaseTestCase


class BlogsFormTest(BaseTestCase):
def test_json_body_request(self):
response = self.client.post('/blog/page/page-slug',
content_type='application/json',
data=json.dumps({'slug': 'slug'}))
assert response.status_code == 200
5 changes: 5 additions & 0 deletions tests/testapp/testapp/blog/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from django import forms


class BlogPostForm(forms.Form):
slug = forms.CharField(max_length=140, min_length=1)
9 changes: 8 additions & 1 deletion tests/testapp/testapp/blog/views.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
from django.http import HttpResponse
from rhetoric import view_config

from . import forms


@view_config(route_name='test.new.routes')
def default_view(request, param):
Expand Down Expand Up @@ -28,4 +30,9 @@ def blog_page(request, page_slug):

@view_config(route_name='blog.page', request_method='POST', renderer='json')
def blog_page_post(request, page_slug):
return HttpResponse(page_slug)
form = forms.BlogPostForm(request.json_body)
if not form.is_valid():
return HttpResponse('Error')

data = form.cleaned_data
return HttpResponse(data['slug'])
4 changes: 3 additions & 1 deletion tests/url_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ def test_blog_requests(self):
json_data = response.content.decode('utf-8')
assert {'page_slug':'page-slug'} == json.loads(json_data)

response = self.client.post('/blog/page/page-slug')
response = self.client.post('/blog/page/page-slug',
json.dumps({}),
content_type='application/json')
assert response.status_code == 200

def test_dashboard_requests(self):
Expand Down

0 comments on commit 5e387da

Please sign in to comment.