diff options
| author | James Rutherford | 2015-03-11 10:38:03 +0000 | 
|---|---|---|
| committer | James Rutherford | 2015-03-11 10:38:03 +0000 | 
| commit | 4a2d27975ab5249269aebafd803be87a2107092b (patch) | |
| tree | 55b524c93b02eef404304f734be98871bbb1324f /tests/test_views.py | |
| parent | 856dc855c952746f566a6a8de263afe951362dfb (diff) | |
| parent | dc56e5a0f41fdd6350e91a5749023d086bd1640f (diff) | |
| download | django-rest-framework-4a2d27975ab5249269aebafd803be87a2107092b.tar.bz2 | |
Merge pull request #1 from tomchristie/master
Merge in from upstream
Diffstat (limited to 'tests/test_views.py')
| -rw-r--r-- | tests/test_views.py | 148 | 
1 files changed, 148 insertions, 0 deletions
| diff --git a/tests/test_views.py b/tests/test_views.py new file mode 100644 index 00000000..77b113ee --- /dev/null +++ b/tests/test_views.py @@ -0,0 +1,148 @@ +from __future__ import unicode_literals + +import sys +import copy +from django.test import TestCase +from rest_framework import status +from rest_framework.decorators import api_view +from rest_framework.response import Response +from rest_framework.settings import api_settings +from rest_framework.test import APIRequestFactory +from rest_framework.views import APIView + +factory = APIRequestFactory() + +if sys.version_info[:2] >= (3, 4): +    JSON_ERROR = 'JSON parse error - Expecting value:' +else: +    JSON_ERROR = 'JSON parse error - No JSON object could be decoded' + + +class BasicView(APIView): +    def get(self, request, *args, **kwargs): +        return Response({'method': 'GET'}) + +    def post(self, request, *args, **kwargs): +        return Response({'method': 'POST', 'data': request.DATA}) + + +@api_view(['GET', 'POST', 'PUT', 'PATCH']) +def basic_view(request): +    if request.method == 'GET': +        return {'method': 'GET'} +    elif request.method == 'POST': +        return {'method': 'POST', 'data': request.DATA} +    elif request.method == 'PUT': +        return {'method': 'PUT', 'data': request.DATA} +    elif request.method == 'PATCH': +        return {'method': 'PATCH', 'data': request.DATA} + + +class ErrorView(APIView): +    def get(self, request, *args, **kwargs): +        raise Exception + + +@api_view(['GET']) +def error_view(request): +    raise Exception + + +def sanitise_json_error(error_dict): +    """ +    Exact contents of JSON error messages depend on the installed version +    of json. +    """ +    ret = copy.copy(error_dict) +    chop = len(JSON_ERROR) +    ret['detail'] = ret['detail'][:chop] +    return ret + + +class ClassBasedViewIntegrationTests(TestCase): +    def setUp(self): +        self.view = BasicView.as_view() + +    def test_400_parse_error(self): +        request = factory.post('/', 'f00bar', content_type='application/json') +        response = self.view(request) +        expected = { +            'detail': JSON_ERROR +        } +        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) +        self.assertEqual(sanitise_json_error(response.data), expected) + +    def test_400_parse_error_tunneled_content(self): +        content = 'f00bar' +        content_type = 'application/json' +        form_data = { +            api_settings.FORM_CONTENT_OVERRIDE: content, +            api_settings.FORM_CONTENTTYPE_OVERRIDE: content_type +        } +        request = factory.post('/', form_data) +        response = self.view(request) +        expected = { +            'detail': JSON_ERROR +        } +        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) +        self.assertEqual(sanitise_json_error(response.data), expected) + + +class FunctionBasedViewIntegrationTests(TestCase): +    def setUp(self): +        self.view = basic_view + +    def test_400_parse_error(self): +        request = factory.post('/', 'f00bar', content_type='application/json') +        response = self.view(request) +        expected = { +            'detail': JSON_ERROR +        } +        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) +        self.assertEqual(sanitise_json_error(response.data), expected) + +    def test_400_parse_error_tunneled_content(self): +        content = 'f00bar' +        content_type = 'application/json' +        form_data = { +            api_settings.FORM_CONTENT_OVERRIDE: content, +            api_settings.FORM_CONTENTTYPE_OVERRIDE: content_type +        } +        request = factory.post('/', form_data) +        response = self.view(request) +        expected = { +            'detail': JSON_ERROR +        } +        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) +        self.assertEqual(sanitise_json_error(response.data), expected) + + +class TestCustomExceptionHandler(TestCase): +    def setUp(self): +        self.DEFAULT_HANDLER = api_settings.EXCEPTION_HANDLER + +        def exception_handler(exc): +            return Response('Error!', status=status.HTTP_400_BAD_REQUEST) + +        api_settings.EXCEPTION_HANDLER = exception_handler + +    def tearDown(self): +        api_settings.EXCEPTION_HANDLER = self.DEFAULT_HANDLER + +    def test_class_based_view_exception_handler(self): +        view = ErrorView.as_view() + +        request = factory.get('/', content_type='application/json') +        response = view(request) +        expected = 'Error!' +        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) +        self.assertEqual(response.data, expected) + +    def test_function_based_view_exception_handler(self): +        view = error_view + +        request = factory.get('/', content_type='application/json') +        response = view(request) +        expected = 'Error!' +        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) +        self.assertEqual(response.data, expected) | 
