diff options
| author | Tom Christie | 2013-08-19 20:36:18 +0100 | 
|---|---|---|
| committer | Tom Christie | 2013-08-19 20:36:18 +0100 | 
| commit | c607414f1637221486a6f13c6ce0d64dbe95957b (patch) | |
| tree | 39160b6c4bbd4af7b251907f0d5314c468230dc4 /rest_framework/tests | |
| parent | 34d65119fc1c200b76a8af7213a92d6b279bd478 (diff) | |
| parent | eaae8fb2d973769a827214e0606a7e41028d5d34 (diff) | |
| download | django-rest-framework-c607414f1637221486a6f13c6ce0d64dbe95957b.tar.bz2 | |
Merge
Diffstat (limited to 'rest_framework/tests')
| -rw-r--r-- | rest_framework/tests/test_routers.py | 64 | 
1 files changed, 55 insertions, 9 deletions
diff --git a/rest_framework/tests/test_routers.py b/rest_framework/tests/test_routers.py index 5fcccb74..c3597e38 100644 --- a/rest_framework/tests/test_routers.py +++ b/rest_framework/tests/test_routers.py @@ -4,7 +4,7 @@ from django.test import TestCase  from django.core.exceptions import ImproperlyConfigured  from rest_framework import serializers, viewsets, permissions  from rest_framework.compat import include, patterns, url -from rest_framework.decorators import link, action +from rest_framework.decorators import detail_route, list_route  from rest_framework.response import Response  from rest_framework.routers import SimpleRouter, DefaultRouter  from rest_framework.test import APIRequestFactory @@ -18,23 +18,23 @@ class BasicViewSet(viewsets.ViewSet):      def list(self, request, *args, **kwargs):          return Response({'method': 'list'}) -    @action() +    @detail_route(methods=['post'])      def action1(self, request, *args, **kwargs):          return Response({'method': 'action1'}) -    @action() +    @detail_route(methods=['post'])      def action2(self, request, *args, **kwargs):          return Response({'method': 'action2'}) -    @action(methods=['post', 'delete']) +    @detail_route(methods=['post', 'delete'])      def action3(self, request, *args, **kwargs):          return Response({'method': 'action2'}) -    @link() +    @detail_route()      def link1(self, request, *args, **kwargs):          return Response({'method': 'link1'}) -    @link() +    @detail_route()      def link2(self, request, *args, **kwargs):          return Response({'method': 'link2'}) @@ -175,7 +175,7 @@ class TestActionKeywordArgs(TestCase):          class TestViewSet(viewsets.ModelViewSet):              permission_classes = [] -            @action(permission_classes=[permissions.AllowAny]) +            @detail_route(methods=['post'], permission_classes=[permissions.AllowAny])              def custom(self, request, *args, **kwargs):                  return Response({                      'permission_classes': self.permission_classes @@ -196,14 +196,14 @@ class TestActionKeywordArgs(TestCase):  class TestActionAppliedToExistingRoute(TestCase):      """ -    Ensure `@action` decorator raises an except when applied +    Ensure `@detail_route` decorator raises an except when applied      to an existing route      """      def test_exception_raised_when_action_applied_to_existing_route(self):          class TestViewSet(viewsets.ModelViewSet): -            @action() +            @detail_route(methods=['post'])              def retrieve(self, request, *args, **kwargs):                  return Response({                      'hello': 'world' @@ -214,3 +214,49 @@ class TestActionAppliedToExistingRoute(TestCase):          with self.assertRaises(ImproperlyConfigured):              self.router.urls + + +class DynamicListAndDetailViewSet(viewsets.ViewSet): +    def list(self, request, *args, **kwargs): +        return Response({'method': 'list'}) + +    @list_route(methods=['post']) +    def list_route_post(self, request, *args, **kwargs): +        return Response({'method': 'action1'}) + +    @detail_route(methods=['post']) +    def detail_route_post(self, request, *args, **kwargs): +        return Response({'method': 'action2'}) + +    @list_route() +    def list_route_get(self, request, *args, **kwargs): +        return Response({'method': 'link1'}) + +    @detail_route() +    def detail_route_get(self, request, *args, **kwargs): +        return Response({'method': 'link2'}) + + +class TestDynamicListAndDetailRouter(TestCase): +    def setUp(self): +        self.router = SimpleRouter() + +    def test_list_and_detail_route_decorators(self): +        routes = self.router.get_routes(DynamicListAndDetailViewSet) +        decorator_routes = [r for r in routes if not (r.name.endswith('-list') or r.name.endswith('-detail'))] +        # Make sure all these endpoints exist and none have been clobbered +        for i, endpoint in enumerate(['list_route_get', 'list_route_post', 'detail_route_get', 'detail_route_post']): +            route = decorator_routes[i] +            # check url listing +            if endpoint.startswith('list_'): +                self.assertEqual(route.url, +                                 '^{{prefix}}/{0}{{trailing_slash}}$'.format(endpoint)) +            else: +                self.assertEqual(route.url, +                                 '^{{prefix}}/{{lookup}}/{0}{{trailing_slash}}$'.format(endpoint)) +            # check method to function mapping +            if endpoint.endswith('_post'): +                method_map = 'post' +            else: +                method_map = 'get' +            self.assertEqual(route.mapping[method_map], endpoint)  | 
