diff options
| author | BrickXu | 2014-12-02 12:55:34 +0800 | 
|---|---|---|
| committer | xulei | 2014-12-02 17:07:55 +0800 | 
| commit | 53f52765fc90472a05cbeb34760b45f735a7332c (patch) | |
| tree | fa23ccefecb526c71e99d404ca3906be6e5ca04b | |
| parent | 81870b6e1a7b0c3c149d4bfba0e20924ebf1b187 (diff) | |
| download | django-rest-framework-53f52765fc90472a05cbeb34760b45f735a7332c.tar.bz2 | |
Not allow to pass an empty actions to viewset.as_view(). Refs issue #2171
| -rw-r--r-- | rest_framework/viewsets.py | 6 | ||||
| -rw-r--r-- | tests/test_viewsets.py | 35 | 
2 files changed, 41 insertions, 0 deletions
| diff --git a/rest_framework/viewsets.py b/rest_framework/viewsets.py index 84b4bd8d..70d14695 100644 --- a/rest_framework/viewsets.py +++ b/rest_framework/viewsets.py @@ -48,6 +48,12 @@ class ViewSetMixin(object):          # eg. 'List' or 'Instance'.          cls.suffix = None +        # actions must not be empty +        if not actions: +            raise TypeError("The `actions` argument must be provided when " +                            "calling `.as_view()` on a ViewSet. For example " +                            "`.as_view({'get': 'list'})`") +          # sanitize keyword arguments          for key in initkwargs:              if key in cls.http_method_names: diff --git a/tests/test_viewsets.py b/tests/test_viewsets.py new file mode 100644 index 00000000..4d18a955 --- /dev/null +++ b/tests/test_viewsets.py @@ -0,0 +1,35 @@ +from django.test import TestCase +from rest_framework import status +from rest_framework.response import Response +from rest_framework.test import APIRequestFactory +from rest_framework.viewsets import GenericViewSet + + +factory = APIRequestFactory() + + +class BasicViewSet(GenericViewSet): +    def list(self, request, *args, **kwargs): +        return Response({'ACTION': 'LIST'}) + + +class InitializeViewSetsTestCase(TestCase): +    def test_initialize_view_set_with_actions(self): +        request = factory.get('/', '', content_type='application/json') +        my_view = BasicViewSet.as_view(actions={ +            'get': 'list', +        }) + +        response = my_view(request) +        self.assertEqual(response.status_code, status.HTTP_200_OK) +        self.assertEqual(response.data, {'ACTION': 'LIST'}) + +    def test_initialize_view_set_with_empty_actions(self): +        try: +            BasicViewSet.as_view() +        except TypeError as e: +            self.assertEqual(str(e), "The `actions` argument must be provided " +                                     "when calling `.as_view()` on a ViewSet. " +                                     "For example `.as_view({'get': 'list'})`") +        else: +            self.fail("actions must not be empty.") | 
