aboutsummaryrefslogtreecommitdiffstats
path: root/djangorestframework/tests
diff options
context:
space:
mode:
Diffstat (limited to 'djangorestframework/tests')
-rw-r--r--djangorestframework/tests/accept.py83
-rw-r--r--djangorestframework/tests/renderers.py9
-rw-r--r--djangorestframework/tests/request.py54
-rw-r--r--djangorestframework/tests/response.py136
4 files changed, 22 insertions, 260 deletions
diff --git a/djangorestframework/tests/accept.py b/djangorestframework/tests/accept.py
deleted file mode 100644
index 7258f461..00000000
--- a/djangorestframework/tests/accept.py
+++ /dev/null
@@ -1,83 +0,0 @@
-from django.conf.urls.defaults import patterns, url, include
-from django.test import TestCase
-
-from djangorestframework.compat import RequestFactory
-from djangorestframework.views import APIView
-from djangorestframework.response import Response
-
-
-# See: http://www.useragentstring.com/
-MSIE_9_USER_AGENT = 'Mozilla/5.0 (Windows; U; MSIE 9.0; WIndows NT 9.0; en-US))'
-MSIE_8_USER_AGENT = 'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; Media Center PC 4.0; SLCC1; .NET CLR 3.0.04320)'
-MSIE_7_USER_AGENT = 'Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US)'
-FIREFOX_4_0_USER_AGENT = 'Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/4.0 (.NET CLR 3.5.30729)'
-CHROME_11_0_USER_AGENT = 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.17 (KHTML, like Gecko) Chrome/11.0.655.0 Safari/534.17'
-SAFARI_5_0_USER_AGENT = 'Mozilla/5.0 (X11; U; Linux x86_64; en-ca) AppleWebKit/531.2+ (KHTML, like Gecko) Version/5.0 Safari/531.2+'
-OPERA_11_0_MSIE_USER_AGENT = 'Mozilla/4.0 (compatible; MSIE 8.0; X11; Linux x86_64; pl) Opera 11.00'
-OPERA_11_0_OPERA_USER_AGENT = 'Opera/9.80 (X11; Linux x86_64; U; pl) Presto/2.7.62 Version/11.00'
-
-
-urlpatterns = patterns('',
- url(r'^api', include('djangorestframework.urls', namespace='djangorestframework'))
-)
-
-
-class UserAgentMungingTest(TestCase):
- """
- We need to fake up the accept headers when we deal with MSIE. Blergh.
- http://www.gethifi.com/blog/browser-rest-http-accept-headers
- """
-
- urls = 'djangorestframework.tests.accept'
-
- def setUp(self):
-
- class MockView(APIView):
- permissions = ()
- response_class = Response
-
- def get(self, request):
- return self.response_class({'a': 1, 'b': 2, 'c': 3})
-
- self.req = RequestFactory()
- self.MockView = MockView
- self.view = MockView.as_view()
-
- def test_munge_msie_accept_header(self):
- """Send MSIE user agent strings and ensure that we get an HTML response,
- even if we set a */* accept header."""
- for user_agent in (MSIE_9_USER_AGENT,
- MSIE_8_USER_AGENT,
- MSIE_7_USER_AGENT):
- req = self.req.get('/', HTTP_ACCEPT='*/*', HTTP_USER_AGENT=user_agent)
- resp = self.view(req)
- resp.render()
- self.assertEqual(resp['Content-Type'], 'text/html')
-
- def test_dont_rewrite_msie_accept_header(self):
- """Turn off _IGNORE_IE_ACCEPT_HEADER, send MSIE user agent strings and ensure
- that we get a JSON response if we set a */* accept header."""
- class IgnoreIEAcceptResponse(Response):
- _IGNORE_IE_ACCEPT_HEADER = False
- view = self.MockView.as_view(response_class=IgnoreIEAcceptResponse)
-
- for user_agent in (MSIE_9_USER_AGENT,
- MSIE_8_USER_AGENT,
- MSIE_7_USER_AGENT):
- req = self.req.get('/', HTTP_ACCEPT='*/*', HTTP_USER_AGENT=user_agent)
- resp = view(req)
- resp.render()
- self.assertEqual(resp['Content-Type'], 'application/json')
-
- def test_dont_munge_nice_browsers_accept_header(self):
- """Send Non-MSIE user agent strings and ensure that we get a JSON response,
- if we set a */* Accept header. (Other browsers will correctly set the Accept header)"""
- for user_agent in (FIREFOX_4_0_USER_AGENT,
- CHROME_11_0_USER_AGENT,
- SAFARI_5_0_USER_AGENT,
- OPERA_11_0_MSIE_USER_AGENT,
- OPERA_11_0_OPERA_USER_AGENT):
- req = self.req.get('/', HTTP_ACCEPT='*/*', HTTP_USER_AGENT=user_agent)
- resp = self.view(req)
- resp.render()
- self.assertEqual(resp['Content-Type'], 'application/json')
diff --git a/djangorestframework/tests/renderers.py b/djangorestframework/tests/renderers.py
index 718c903f..650798de 100644
--- a/djangorestframework/tests/renderers.py
+++ b/djangorestframework/tests/renderers.py
@@ -169,15 +169,6 @@ class RendererEndToEndTests(TestCase):
self.assertEquals(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT))
self.assertEquals(resp.status_code, DUMMYSTATUS)
- def test_conflicting_format_query_and_accept_ignores_accept(self):
- """If a 'format' query is specified that does not match the Accept
- header, we should only honor the 'format' query string."""
- resp = self.client.get('/?format=%s' % RendererB.format,
- HTTP_ACCEPT='dummy')
- self.assertEquals(resp['Content-Type'], RendererB.media_type)
- self.assertEquals(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT))
- self.assertEquals(resp.status_code, DUMMYSTATUS)
-
_flat_repr = '{"foo": ["bar", "baz"]}'
_indented_repr = '{\n "foo": [\n "bar",\n "baz"\n ]\n}'
diff --git a/djangorestframework/tests/request.py b/djangorestframework/tests/request.py
index 51e3660c..74eae438 100644
--- a/djangorestframework/tests/request.py
+++ b/djangorestframework/tests/request.py
@@ -7,7 +7,7 @@ from django.test import TestCase, Client
from djangorestframework import status
from djangorestframework.authentication import SessionAuthentication
-from djangorestframework.utils import RequestFactory
+from djangorestframework.compat import RequestFactory
from djangorestframework.parsers import (
FormParser,
MultiPartParser,
@@ -22,33 +22,21 @@ factory = RequestFactory()
class TestMethodOverloading(TestCase):
- def test_GET_method(self):
+ def test_method(self):
"""
- GET requests identified.
+ Request methods should be same as underlying request.
"""
- request = factory.get('/')
+ request = Request(factory.get('/'))
self.assertEqual(request.method, 'GET')
-
- def test_POST_method(self):
- """
- POST requests identified.
- """
- request = factory.post('/')
+ request = Request(factory.post('/'))
self.assertEqual(request.method, 'POST')
- def test_HEAD_method(self):
- """
- HEAD requests identified.
- """
- request = factory.head('/')
- self.assertEqual(request.method, 'HEAD')
-
def test_overloaded_method(self):
"""
POST requests can be overloaded to another method by setting a
reserved form field
"""
- request = factory.post('/', {Request._METHOD_PARAM: 'DELETE'})
+ request = Request(factory.post('/', {Request._METHOD_PARAM: 'DELETE'}))
self.assertEqual(request.method, 'DELETE')
@@ -57,14 +45,14 @@ class TestContentParsing(TestCase):
"""
Ensure request.DATA returns None for GET request with no content.
"""
- request = factory.get('/')
+ request = Request(factory.get('/'))
self.assertEqual(request.DATA, None)
def test_standard_behaviour_determines_no_content_HEAD(self):
"""
Ensure request.DATA returns None for HEAD request.
"""
- request = factory.head('/')
+ request = Request(factory.head('/'))
self.assertEqual(request.DATA, None)
def test_standard_behaviour_determines_form_content_POST(self):
@@ -72,8 +60,8 @@ class TestContentParsing(TestCase):
Ensure request.DATA returns content for POST request with form content.
"""
data = {'qwerty': 'uiop'}
- parsers = (FormParser, MultiPartParser)
- request = factory.post('/', data, parser=parsers)
+ request = Request(factory.post('/', data))
+ request.parser_classes = (FormParser, MultiPartParser)
self.assertEqual(request.DATA.items(), data.items())
def test_standard_behaviour_determines_non_form_content_POST(self):
@@ -83,9 +71,8 @@ class TestContentParsing(TestCase):
"""
content = 'qwerty'
content_type = 'text/plain'
- parsers = (PlainTextParser,)
- request = factory.post('/', content, content_type=content_type,
- parsers=parsers)
+ request = Request(factory.post('/', content, content_type=content_type))
+ request.parser_classes = (PlainTextParser,)
self.assertEqual(request.DATA, content)
def test_standard_behaviour_determines_form_content_PUT(self):
@@ -93,17 +80,17 @@ class TestContentParsing(TestCase):
Ensure request.DATA returns content for PUT request with form content.
"""
data = {'qwerty': 'uiop'}
- parsers = (FormParser, MultiPartParser)
from django import VERSION
if VERSION >= (1, 5):
from django.test.client import MULTIPART_CONTENT, BOUNDARY, encode_multipart
- request = factory.put('/', encode_multipart(BOUNDARY, data), parsers=parsers,
- content_type=MULTIPART_CONTENT)
+ request = Request(factory.put('/', encode_multipart(BOUNDARY, data),
+ content_type=MULTIPART_CONTENT))
else:
- request = factory.put('/', data, parsers=parsers)
+ request = Request(factory.put('/', data))
+ request.parser_classes = (FormParser, MultiPartParser)
self.assertEqual(request.DATA.items(), data.items())
def test_standard_behaviour_determines_non_form_content_PUT(self):
@@ -113,9 +100,8 @@ class TestContentParsing(TestCase):
"""
content = 'qwerty'
content_type = 'text/plain'
- parsers = (PlainTextParser, )
- request = factory.put('/', content, content_type=content_type,
- parsers=parsers)
+ request = Request(factory.put('/', content, content_type=content_type))
+ request.parser_classes = (PlainTextParser, )
self.assertEqual(request.DATA, content)
def test_overloaded_behaviour_allows_content_tunnelling(self):
@@ -128,8 +114,8 @@ class TestContentParsing(TestCase):
Request._CONTENT_PARAM: content,
Request._CONTENTTYPE_PARAM: content_type
}
- parsers = (PlainTextParser, )
- request = factory.post('/', data, parsers=parsers)
+ request = Request(factory.post('/', data))
+ request.parser_classes = (PlainTextParser, )
self.assertEqual(request.DATA, content)
# def test_accessing_post_after_data_form(self):
diff --git a/djangorestframework/tests/response.py b/djangorestframework/tests/response.py
index 0483d826..5083f6d2 100644
--- a/djangorestframework/tests/response.py
+++ b/djangorestframework/tests/response.py
@@ -1,18 +1,15 @@
-import json
import unittest
from django.conf.urls.defaults import patterns, url, include
from django.test import TestCase
-from djangorestframework.response import Response, NotAcceptable
+from djangorestframework.response import Response
from djangorestframework.views import APIView
-from djangorestframework.compat import RequestFactory
from djangorestframework import status
from djangorestframework.renderers import (
BaseRenderer,
JSONRenderer,
- DocumentingHTMLRenderer,
- DEFAULT_RENDERERS
+ DocumentingHTMLRenderer
)
@@ -24,126 +21,6 @@ class MockJsonRenderer(BaseRenderer):
media_type = 'application/json'
-class TestResponseDetermineRenderer(TestCase):
-
- def get_response(self, url='', accept_list=[], renderer_classes=[]):
- kwargs = {}
- if accept_list is not None:
- kwargs['HTTP_ACCEPT'] = ','.join(accept_list)
- request = RequestFactory().get(url, **kwargs)
- return Response(request=request, renderer_classes=renderer_classes)
-
- def test_determine_accept_list_accept_header(self):
- """
- Test that determine_accept_list takes the Accept header.
- """
- accept_list = ['application/pickle', 'application/json']
- response = self.get_response(accept_list=accept_list)
- self.assertEqual(response._determine_accept_list(), accept_list)
-
- def test_determine_accept_list_default(self):
- """
- Test that determine_accept_list takes the default renderer if Accept is not specified.
- """
- response = self.get_response(accept_list=None)
- self.assertEqual(response._determine_accept_list(), ['*/*'])
-
- def test_determine_accept_list_overriden_header(self):
- """
- Test Accept header overriding.
- """
- accept_list = ['application/pickle', 'application/json']
- response = self.get_response(url='?_accept=application/x-www-form-urlencoded',
- accept_list=accept_list)
- self.assertEqual(response._determine_accept_list(), ['application/x-www-form-urlencoded'])
-
- def test_determine_renderer(self):
- """
- Test that right renderer is chosen, in the order of Accept list.
- """
- accept_list = ['application/pickle', 'application/json']
- renderer_classes = (MockPickleRenderer, MockJsonRenderer)
- response = self.get_response(accept_list=accept_list, renderer_classes=renderer_classes)
- renderer, media_type = response._determine_renderer()
- self.assertEqual(media_type, 'application/pickle')
- self.assertTrue(isinstance(renderer, MockPickleRenderer))
-
- renderer_classes = (MockJsonRenderer, )
- response = self.get_response(accept_list=accept_list, renderer_classes=renderer_classes)
- renderer, media_type = response._determine_renderer()
- self.assertEqual(media_type, 'application/json')
- self.assertTrue(isinstance(renderer, MockJsonRenderer))
-
- def test_determine_renderer_default(self):
- """
- Test determine renderer when Accept was not specified.
- """
- renderer_classes = (MockPickleRenderer, )
- response = self.get_response(accept_list=None, renderer_classes=renderer_classes)
- renderer, media_type = response._determine_renderer()
- self.assertEqual(media_type, '*/*')
- self.assertTrue(isinstance(renderer, MockPickleRenderer))
-
- def test_determine_renderer_no_renderer(self):
- """
- Test determine renderer when no renderer can satisfy the Accept list.
- """
- accept_list = ['application/json']
- renderer_classes = (MockPickleRenderer, )
- response = self.get_response(accept_list=accept_list, renderer_classes=renderer_classes)
- self.assertRaises(NotAcceptable, response._determine_renderer)
-
-
-class TestResponseRenderContent(TestCase):
- def get_response(self, url='', accept_list=[], content=None, renderer_classes=None):
- request = RequestFactory().get(url, HTTP_ACCEPT=','.join(accept_list))
- return Response(request=request, content=content, renderer_classes=renderer_classes or DEFAULT_RENDERERS)
-
- def test_render(self):
- """
- Test rendering simple data to json.
- """
- content = {'a': 1, 'b': [1, 2, 3]}
- content_type = 'application/json'
- response = self.get_response(accept_list=[content_type], content=content)
- response = response.render()
- self.assertEqual(json.loads(response.content), content)
- self.assertEqual(response['Content-Type'], content_type)
-
- def test_render_no_renderer(self):
- """
- Test rendering response when no renderer can satisfy accept.
- """
- content = 'bla'
- content_type = 'weirdcontenttype'
- response = self.get_response(accept_list=[content_type], content=content)
- response = response.render()
- self.assertEqual(response.status_code, 406)
- self.assertIsNotNone(response.content)
-
- # def test_render_renderer_raises_ImmediateResponse(self):
- # """
- # Test rendering response when renderer raises ImmediateResponse
- # """
- # class PickyJSONRenderer(BaseRenderer):
- # """
- # A renderer that doesn't make much sense, just to try
- # out raising an ImmediateResponse
- # """
- # media_type = 'application/json'
-
- # def render(self, obj=None, media_type=None):
- # raise ImmediateResponse({'error': '!!!'}, status=400)
-
- # response = self.get_response(
- # accept_list=['application/json'],
- # renderers=[PickyJSONRenderer, JSONRenderer]
- # )
- # response = response.render()
- # self.assertEqual(response.status_code, 400)
- # self.assertEqual(response.content, json.dumps({'error': '!!!'}))
-
-
DUMMYSTATUS = status.HTTP_200_OK
DUMMYCONTENT = 'dummycontent'
@@ -280,15 +157,6 @@ class RendererIntegrationTests(TestCase):
self.assertEquals(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT))
self.assertEquals(resp.status_code, DUMMYSTATUS)
- def test_conflicting_format_query_and_accept_ignores_accept(self):
- """If a 'format' query is specified that does not match the Accept
- header, we should only honor the 'format' query string."""
- resp = self.client.get('/?format=%s' % RendererB.format,
- HTTP_ACCEPT='dummy')
- self.assertEquals(resp['Content-Type'], RendererB.media_type)
- self.assertEquals(resp.content, RENDERER_B_SERIALIZER(DUMMYCONTENT))
- self.assertEquals(resp.status_code, DUMMYSTATUS)
-
class Issue122Tests(TestCase):
"""