mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-07-23 22:49:50 +03:00
Added tests and improved RedirectView
* Fixed wrong Header handling in Response * Fixed Old tests to work again * added Redirect Test * Location Header is now in Redirect Response
This commit is contained in:
parent
dcbe789fd8
commit
372e58c471
|
@ -20,9 +20,12 @@ class Response(SimpleTemplateResponse):
|
||||||
"""
|
"""
|
||||||
super(Response, self).__init__(None, status=status)
|
super(Response, self).__init__(None, status=status)
|
||||||
self.data = data
|
self.data = data
|
||||||
self.headers = headers and headers[:] or []
|
|
||||||
self.template_name = template_name
|
self.template_name = template_name
|
||||||
self.exception = exception
|
self.exception = exception
|
||||||
|
|
||||||
|
if headers:
|
||||||
|
for name,value in headers.iteritems():
|
||||||
|
self[name] = value
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def rendered_content(self):
|
def rendered_content(self):
|
||||||
|
|
|
@ -106,7 +106,7 @@ class ThrottlingTests(TestCase):
|
||||||
if expect is not None:
|
if expect is not None:
|
||||||
self.assertEquals(response['X-Throttle-Wait-Seconds'], expect)
|
self.assertEquals(response['X-Throttle-Wait-Seconds'], expect)
|
||||||
else:
|
else:
|
||||||
self.assertFalse('X-Throttle-Wait-Seconds' in response.headers)
|
self.assertFalse('X-Throttle-Wait-Seconds' in response)
|
||||||
|
|
||||||
def test_seconds_fields(self):
|
def test_seconds_fields(self):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
import copy
|
import copy
|
||||||
|
from django.conf.urls.defaults import patterns, url
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.test.client import RequestFactory
|
from django.test.client import RequestFactory
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
from rest_framework.decorators import api_view
|
from rest_framework.decorators import api_view
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework.settings import api_settings
|
from rest_framework.settings import api_settings
|
||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView, RedirectAPIView
|
||||||
|
|
||||||
factory = RequestFactory()
|
factory = RequestFactory()
|
||||||
|
|
||||||
|
@ -17,6 +18,16 @@ class BasicView(APIView):
|
||||||
def post(self, request, *args, **kwargs):
|
def post(self, request, *args, **kwargs):
|
||||||
return Response({'method': 'POST', 'data': request.DATA})
|
return Response({'method': 'POST', 'data': request.DATA})
|
||||||
|
|
||||||
|
class RedirectBasicView(RedirectAPIView):
|
||||||
|
permanent = False
|
||||||
|
view_name = 'basic-view'
|
||||||
|
|
||||||
|
|
||||||
|
urlpatterns = patterns('',
|
||||||
|
url(r'^basic/$', BasicView.as_view(), name='basic-view'),
|
||||||
|
url(r'^redirect_to_basic/$', RedirectBasicView.as_view(), name='old-basic-view'),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@api_view(['GET', 'POST', 'PUT'])
|
@api_view(['GET', 'POST', 'PUT'])
|
||||||
def basic_view(request):
|
def basic_view(request):
|
||||||
|
@ -39,7 +50,7 @@ def sanitise_json_error(error_dict):
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
class ClassBasedViewIntegrationTests(TestCase):
|
class ClassBasedViewIntegrationTests(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.view = BasicView.as_view()
|
self.view = BasicView.as_view()
|
||||||
|
|
||||||
|
@ -95,3 +106,16 @@ class FunctionBasedViewIntegrationTests(TestCase):
|
||||||
}
|
}
|
||||||
self.assertEquals(response.status_code, status.HTTP_400_BAD_REQUEST)
|
self.assertEquals(response.status_code, status.HTTP_400_BAD_REQUEST)
|
||||||
self.assertEquals(sanitise_json_error(response.data), expected)
|
self.assertEquals(sanitise_json_error(response.data), expected)
|
||||||
|
|
||||||
|
class RedirectViewTests(TestCase):
|
||||||
|
urls = 'rest_framework.tests.views'
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.view = RedirectBasicView.as_view()
|
||||||
|
|
||||||
|
def test_redirect(self):
|
||||||
|
request = factory.get('/redirect_to_basic', content_type='application/json')
|
||||||
|
response = self.view(request)
|
||||||
|
|
||||||
|
self.assertEquals(response.status_code, status.HTTP_302_FOUND)
|
||||||
|
self.assertEquals(response['Location'], 'http://testserver/basic/')
|
|
@ -380,10 +380,11 @@ class RedirectAPIView(APIView):
|
||||||
"""
|
"""
|
||||||
permanent = True
|
permanent = True
|
||||||
view_name = None
|
view_name = None
|
||||||
|
#http_method_names = ['get', 'post', 'head', 'options', 'delete', 'put']
|
||||||
|
|
||||||
def get_redirect_url(self, request, *args, **kwargs):
|
def get_redirect_url(self, request, *args, **kwargs):
|
||||||
"""
|
"""
|
||||||
Return the URL redirect to. Keyword arguments from the
|
Return the URL redirect to. Arguments and Keyword arguments from the
|
||||||
URL pattern match generating the redirect request
|
URL pattern match generating the redirect request
|
||||||
are provided as kwargs to this method.
|
are provided as kwargs to this method.
|
||||||
"""
|
"""
|
||||||
|
@ -395,14 +396,30 @@ class RedirectAPIView(APIView):
|
||||||
def get(self, request, *args, **kwargs):
|
def get(self, request, *args, **kwargs):
|
||||||
url = self.get_redirect_url(request, *args, **kwargs)
|
url = self.get_redirect_url(request, *args, **kwargs)
|
||||||
if url:
|
if url:
|
||||||
|
headers = {'Location': url}
|
||||||
if self.permanent:
|
if self.permanent:
|
||||||
return Response(status=status.HTTP_301_MOVED_PERMANENTLY)
|
return Response(status=status.HTTP_301_MOVED_PERMANENTLY, headers=headers)
|
||||||
else:
|
else:
|
||||||
return Response(status=status.HTTP_302_FOUND)
|
return Response(status=status.HTTP_302_FOUND, headers=headers)
|
||||||
else:
|
else:
|
||||||
logger.warning('Gone: %s', self.request.path,
|
logger.warning('Gone: %s', self.request.path,
|
||||||
extra={
|
extra={
|
||||||
'status_code': 410,
|
'status_code': status.HTTP_410_GONE,
|
||||||
'request': self.request
|
'request': self.request
|
||||||
})
|
})
|
||||||
return Response(status=status.HTTP_410_GONE)
|
return Response(status=status.HTTP_410_GONE)
|
||||||
|
|
||||||
|
def head(self, request, *args, **kwargs):
|
||||||
|
return self.get(request, *args, **kwargs)
|
||||||
|
|
||||||
|
def post(self, request, *args, **kwargs):
|
||||||
|
return self.get(request, *args, **kwargs)
|
||||||
|
|
||||||
|
def options(self, request, *args, **kwargs):
|
||||||
|
return self.get(request, *args, **kwargs)
|
||||||
|
|
||||||
|
def delete(self, request, *args, **kwargs):
|
||||||
|
return self.get(request, *args, **kwargs)
|
||||||
|
|
||||||
|
def put(self, request, *args, **kwargs):
|
||||||
|
return self.get(request, *args, **kwargs)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user