示例#1
0
class ExtendedDefaultRouterTest(TestCase):
    def setUp(self):
        self.router = ExtendedDefaultRouter()

    def get_routes_names(self, routes):
        return [i.name for i in routes]

    def get_dynamic_route_by_def_name(self, def_name, routes):
        try:
            return [i for i in routes if def_name in i.mapping.values()][0]
        except IndexError:
            return None

    def test_dynamic_routes_should_be_first_in_order(self):
        class BasicViewSet(viewsets.ViewSet):
            def list(self, request, *args, **kwargs):
                return Response({'method': 'list'})

            @detail_route()
            def detail1(self, request, *args, **kwargs):
                return Response({'method': 'detail1'})

        routes = self.router.get_routes(BasicViewSet)
        expected = [
            '{basename}-detail1', '{basename}-list', '{basename}-detail'
        ]
        msg = '@detail_route methods should come first in routes order'
        self.assertEqual(self.get_routes_names(routes), expected, msg)

    def test_detail_route(self):
        class BasicViewSet(viewsets.ViewSet):
            @detail_route()
            def action1(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_route = self.get_dynamic_route_by_def_name('action1', routes)

        msg = '@detail_route should map methods to def name'
        self.assertEqual(action1_route.mapping, {'get': 'action1'}, msg)

        msg = '@detail_route should use url with detail lookup'
        self.assertEqual(
            action1_route.url,
            add_trailing_slash_if_needed(u'^{prefix}/{lookup}/action1/$'), msg)

    def test_detail_route__with_methods(self):
        class BasicViewSet(viewsets.ViewSet):
            @detail_route(methods=['post'])
            def action1(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_route = self.get_dynamic_route_by_def_name('action1', routes)

        msg = '@detail_route should map methods to def name'
        self.assertEqual(action1_route.mapping, {'post': 'action1'}, msg)

        msg = '@detail_route should use url with detail lookup'
        self.assertEqual(
            action1_route.url,
            add_trailing_slash_if_needed(u'^{prefix}/{lookup}/action1/$'), msg)

    def test_detail_route__with_methods__and__with_url_path(self):
        class BasicViewSet(viewsets.ViewSet):
            @detail_route(methods=['post'], url_path='action-one')
            def action1(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_route = self.get_dynamic_route_by_def_name('action1', routes)

        msg = '@detail_route should map methods to "url_path"'
        self.assertEqual(action1_route.mapping, {'post': 'action1'}, msg)

        msg = '@detail_route should use url with detail lookup and "url_path" value'
        self.assertEqual(
            action1_route.url,
            add_trailing_slash_if_needed(u'^{prefix}/{lookup}/action-one/$'),
            msg)

    def test_list_route(self):
        class BasicViewSet(viewsets.ViewSet):
            @list_route()
            def action1(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_route = self.get_dynamic_route_by_def_name('action1', routes)

        msg = '@list_route should map methods to def name'
        self.assertEqual(action1_route.mapping, {'get': 'action1'}, msg)

        msg = '@list_route should use url in list scope'
        self.assertEqual(action1_route.url,
                         add_trailing_slash_if_needed(u'^{prefix}/action1/$'),
                         msg)

    def test_list_route__with_methods(self):
        class BasicViewSet(viewsets.ViewSet):
            @list_route(methods=['post'])
            def action1(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_route = self.get_dynamic_route_by_def_name('action1', routes)

        msg = '@list_route should map methods to def name'
        self.assertEqual(action1_route.mapping, {'post': 'action1'}, msg)

        msg = '@list_route should use url in list scope'
        self.assertEqual(action1_route.url,
                         add_trailing_slash_if_needed(u'^{prefix}/action1/$'),
                         msg)

    def test_list_route__with_methods__and__with_url_path(self):
        class BasicViewSet(viewsets.ViewSet):
            @list_route(methods=['post'], url_path='action-one')
            def action1(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_route = self.get_dynamic_route_by_def_name('action1', routes)

        msg = '@list_route should map methods to "url_path"'
        self.assertEqual(action1_route.mapping, {'post': 'action1'}, msg)

        msg = '@list_route should use url in list scope with "url_path" value'
        self.assertEqual(
            action1_route.url,
            add_trailing_slash_if_needed(u'^{prefix}/action-one/$'), msg)

    def test_list_route_and_detail_route_with_exact_names(self):
        class BasicViewSet(viewsets.ViewSet):
            @list_route(url_path='action-one')
            def action1(self, request, *args, **kwargs):
                pass

            @detail_route(url_path='action-one')
            def action1_detail(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_list_route = self.get_dynamic_route_by_def_name(
            'action1', routes)
        action1_detail_route = self.get_dynamic_route_by_def_name(
            'action1_detail', routes)

        self.assertEqual(action1_list_route.mapping, {'get': 'action1'})
        self.assertEqual(
            action1_list_route.url,
            add_trailing_slash_if_needed(u'^{prefix}/action-one/$'))

        self.assertEqual(action1_detail_route.mapping,
                         {'get': 'action1_detail'})
        self.assertEqual(
            action1_detail_route.url,
            add_trailing_slash_if_needed(u'^{prefix}/{lookup}/action-one/$'))

    def test_list_route_and_detail_route_names(self):
        class BasicViewSet(viewsets.ViewSet):
            @list_route()
            def action1(self, request, *args, **kwargs):
                pass

            @detail_route()
            def action2(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_list_route = self.get_dynamic_route_by_def_name(
            'action1', routes)
        action2_detail_route = self.get_dynamic_route_by_def_name(
            'action2', routes)

        self.assertEqual(action1_list_route.name, u'{basename}-action1-list')
        self.assertEqual(action2_detail_route.name, u'{basename}-action2')

    def test_list_route_and_detail_route_names__with_endpoints(self):
        class BasicViewSet(viewsets.ViewSet):
            @list_route(url_path='action_one')
            def action1(self, request, *args, **kwargs):
                pass

            @detail_route(url_path='action-two')
            def action2(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_list_route = self.get_dynamic_route_by_def_name(
            'action1', routes)
        action2_detail_route = self.get_dynamic_route_by_def_name(
            'action2', routes)

        self.assertEqual(action1_list_route.name,
                         u'{basename}-action-one-list')
        self.assertEqual(action2_detail_route.name, u'{basename}-action-two')
示例#2
0
class ExtendedDefaultRouterTest(TestCase):
    def setUp(self):
        self.router = ExtendedDefaultRouter()

    def get_routes_names(self, routes):
        return [i.name for i in routes]

    def get_dynamic_route_by_def_name(self, def_name, routes):
        try:
            return [i for i in routes if def_name in i.mapping.values()][0]
        except IndexError:
            return None

    def test_dynamic_routes_should_be_first_in_order(self):
        class BasicViewSet(viewsets.ViewSet):
            def list(self, request, *args, **kwargs):
                return Response({'method': 'list'})

            @action()
            def action1(self, request, *args, **kwargs):
                return Response({'method': 'action1'})

            @link()
            def link1(self, request, *args, **kwargs):
                return Response({'method': 'link1'})

        routes = self.router.get_routes(BasicViewSet)
        expected = [
            '{basename}-action1', '{basename}-link1', '{basename}-list',
            '{basename}-detail'
        ]
        msg = '@action and @link methods should come first in routes order'
        self.assertEqual(self.get_routes_names(routes), expected, msg)

    def test_action_endpoint(self):
        class BasicViewSet(viewsets.ViewSet):
            @action(endpoint='action-one')
            def action1(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_route = self.get_dynamic_route_by_def_name('action1', routes)

        msg = '@action with endpoint route should map methods to endpoint if it is specified'
        self.assertEqual(action1_route.mapping, {'post': 'action1'}, msg)

        msg = '@action with endpoint route should use url with detail lookup'
        self.assertEqual(
            action1_route.url,
            add_trailing_slash_if_needed(u'^{prefix}/{lookup}/action-one/$'),
            msg)

    def test_link_endpoint(self):
        class BasicViewSet(viewsets.ViewSet):
            @link(endpoint='link-one')
            def link1(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        link1_route = self.get_dynamic_route_by_def_name('link1', routes)

        msg = '@link with endpoint route should map methods to endpoint if it is specified'
        self.assertEqual(link1_route.mapping, {'get': 'link1'}, msg)

        msg = '@link with endpoint route should use url with detail lookup'
        self.assertEqual(
            link1_route.url,
            add_trailing_slash_if_needed(u'^{prefix}/{lookup}/link-one/$'),
            msg)

    def test_action__for_list(self):
        class BasicViewSet(viewsets.ViewSet):
            @action(is_for_list=True)
            def action1(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_route = self.get_dynamic_route_by_def_name('action1', routes)

        msg = '@action with is_for_list=True route should map methods to def name'
        self.assertEqual(action1_route.mapping, {'post': 'action1'}, msg)

        msg = '@action with is_for_list=True route should use url in list scope'
        self.assertEqual(action1_route.url,
                         add_trailing_slash_if_needed(u'^{prefix}/action1/$'),
                         msg)

    def test_action__for_list__and__with_endpoint(self):
        class BasicViewSet(viewsets.ViewSet):
            @action(is_for_list=True, endpoint='action-one')
            def action1(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_route = self.get_dynamic_route_by_def_name('action1', routes)

        msg = '@action with is_for_list=True and endpoint route should map methods to "endpoint"'
        self.assertEqual(action1_route.mapping, {'post': 'action1'}, msg)

        msg = '@action with is_for_list=True and endpoint route should use url in list scope with "endpoint" value'
        self.assertEqual(
            action1_route.url,
            add_trailing_slash_if_needed(u'^{prefix}/action-one/$'), msg)

    def test_actions__for_list_and_detail_with_exact_names(self):
        class BasicViewSet(viewsets.ViewSet):
            @action(is_for_list=True, endpoint='action-one')
            def action1(self, request, *args, **kwargs):
                pass

            @action(endpoint='action-one')
            def action1_detail(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_list_route = self.get_dynamic_route_by_def_name(
            'action1', routes)
        action1_detail_route = self.get_dynamic_route_by_def_name(
            'action1_detail', routes)

        self.assertEqual(action1_list_route.mapping, {'post': 'action1'})
        self.assertEqual(
            action1_list_route.url,
            add_trailing_slash_if_needed(u'^{prefix}/action-one/$'))

        self.assertEqual(action1_detail_route.mapping,
                         {'post': 'action1_detail'})
        self.assertEqual(
            action1_detail_route.url,
            add_trailing_slash_if_needed(u'^{prefix}/{lookup}/action-one/$'))

    def test_action_names(self):
        class BasicViewSet(viewsets.ViewSet):
            @action(is_for_list=True)
            def action1(self, request, *args, **kwargs):
                pass

            @action()
            def action2(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_list_route = self.get_dynamic_route_by_def_name(
            'action1', routes)
        action2_detail_route = self.get_dynamic_route_by_def_name(
            'action2', routes)

        self.assertEqual(action1_list_route.name, u'{basename}-action1-list')
        self.assertEqual(action2_detail_route.name, u'{basename}-action2')

    def test_action_names__with_endpoints(self):
        class BasicViewSet(viewsets.ViewSet):
            @action(is_for_list=True, endpoint='action_one')
            def action1(self, request, *args, **kwargs):
                pass

            @action(endpoint='action-two')
            def action2(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_list_route = self.get_dynamic_route_by_def_name(
            'action1', routes)
        action2_detail_route = self.get_dynamic_route_by_def_name(
            'action2', routes)

        self.assertEqual(action1_list_route.name,
                         u'{basename}-action-one-list')
        self.assertEqual(action2_detail_route.name, u'{basename}-action-two')

    @unittest.skipIf(
        not get_rest_framework_features()['has_action_and_link_decorators'],
        "Current DRF version has removed 'action' and 'link' decorators")
    def test_with_default_controllers(self):
        class BasicViewSet(viewsets.ViewSet):
            @link()
            def link(self, request, *args, **kwargs):
                pass

            @decorators.link()
            def link_default(self, request, *args, **kwargs):
                pass

            @action()
            def action(self, request, *args, **kwargs):
                pass

            @decorators.action()
            def action_default(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        link_route = self.get_dynamic_route_by_def_name('link', routes)
        link_default_route = self.get_dynamic_route_by_def_name(
            'link_default', routes)
        action_route = self.get_dynamic_route_by_def_name('action', routes)
        action_default_route = self.get_dynamic_route_by_def_name(
            'action_default', routes)

        self.assertEqual(link_route.name, u'{basename}-link')
        self.assertEqual(link_default_route.name, u'{basename}-link-default')
        self.assertEqual(action_route.name, u'{basename}-action')
        self.assertEqual(action_default_route.name,
                         u'{basename}-action-default')
示例#3
0
class ExtendedDefaultRouterTest(TestCase):
    def setUp(self):
        self.router = ExtendedDefaultRouter()

    def get_routes_names(self, routes):
        return [i.name for i in routes]

    def get_dynamic_route_by_def_name(self, def_name, routes):
        try:
            return [i for i in routes if def_name in i.mapping.values()][0]
        except IndexError:
            return None

    def test_dynamic_routes_should_be_first_in_order(self):
        class BasicViewSet(viewsets.ViewSet):
            def list(self, request, *args, **kwargs):
                return Response({'method': 'list'})

            @action()
            def action1(self, request, *args, **kwargs):
                return Response({'method': 'action1'})

            @link()
            def link1(self, request, *args, **kwargs):
                return Response({'method': 'link1'})

        routes = self.router.get_routes(BasicViewSet)
        expected = [
            '{basename}-action1',
            '{basename}-link1',
            '{basename}-list',
            '{basename}-detail'
        ]
        msg = '@action and @link methods should come first in routes order'
        self.assertEqual(self.get_routes_names(routes), expected, msg)

    def test_action_endpoint(self):
        class BasicViewSet(viewsets.ViewSet):
            @action(endpoint='action-one')
            def action1(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_route = self.get_dynamic_route_by_def_name('action1', routes)

        msg = '@action with endpoint route should map methods to endpoint if it is specified'
        self.assertEqual(action1_route.mapping, {'post': 'action1'}, msg)

        msg = '@action with endpoint route should use url with detail lookup'
        self.assertEqual(action1_route.url, add_trailing_slash_if_needed(u'^{prefix}/{lookup}/action-one/$'), msg)

    def test_link_endpoint(self):
        class BasicViewSet(viewsets.ViewSet):
            @link(endpoint='link-one')
            def link1(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        link1_route = self.get_dynamic_route_by_def_name('link1', routes)

        msg = '@link with endpoint route should map methods to endpoint if it is specified'
        self.assertEqual(link1_route.mapping, {'get': 'link1'}, msg)

        msg = '@link with endpoint route should use url with detail lookup'
        self.assertEqual(link1_route.url, add_trailing_slash_if_needed(u'^{prefix}/{lookup}/link-one/$'), msg)

    def test_action__for_list(self):
        class BasicViewSet(viewsets.ViewSet):
            @action(is_for_list=True)
            def action1(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_route = self.get_dynamic_route_by_def_name('action1', routes)

        msg = '@action with is_for_list=True route should map methods to def name'
        self.assertEqual(action1_route.mapping, {'post': 'action1'}, msg)

        msg = '@action with is_for_list=True route should use url in list scope'
        self.assertEqual(action1_route.url, add_trailing_slash_if_needed(u'^{prefix}/action1/$'), msg)

    def test_action__for_list__and__with_endpoint(self):
        class BasicViewSet(viewsets.ViewSet):
            @action(is_for_list=True, endpoint='action-one')
            def action1(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_route = self.get_dynamic_route_by_def_name('action1', routes)

        msg = '@action with is_for_list=True and endpoint route should map methods to "endpoint"'
        self.assertEqual(action1_route.mapping, {'post': 'action1'}, msg)

        msg = '@action with is_for_list=True and endpoint route should use url in list scope with "endpoint" value'
        self.assertEqual(action1_route.url, add_trailing_slash_if_needed(u'^{prefix}/action-one/$'), msg)

    def test_actions__for_list_and_detail_with_exact_names(self):
        class BasicViewSet(viewsets.ViewSet):
            @action(is_for_list=True, endpoint='action-one')
            def action1(self, request, *args, **kwargs):
                pass

            @action(endpoint='action-one')
            def action1_detail(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_list_route = self.get_dynamic_route_by_def_name('action1', routes)
        action1_detail_route = self.get_dynamic_route_by_def_name('action1_detail', routes)

        self.assertEqual(action1_list_route.mapping, {'post': 'action1'})
        self.assertEqual(action1_list_route.url, add_trailing_slash_if_needed(u'^{prefix}/action-one/$'))

        self.assertEqual(action1_detail_route.mapping, {'post': 'action1_detail'})
        self.assertEqual(action1_detail_route.url, add_trailing_slash_if_needed(u'^{prefix}/{lookup}/action-one/$'))

    def test_action_names(self):
        class BasicViewSet(viewsets.ViewSet):
            @action(is_for_list=True)
            def action1(self, request, *args, **kwargs):
                pass

            @action()
            def action2(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_list_route = self.get_dynamic_route_by_def_name('action1', routes)
        action2_detail_route = self.get_dynamic_route_by_def_name('action2', routes)

        self.assertEqual(action1_list_route.name, u'{basename}-action1-list')
        self.assertEqual(action2_detail_route.name, u'{basename}-action2')

    def test_action_names__with_endpoints(self):
        class BasicViewSet(viewsets.ViewSet):
            @action(is_for_list=True, endpoint='action_one')
            def action1(self, request, *args, **kwargs):
                pass

            @action(endpoint='action-two')
            def action2(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_list_route = self.get_dynamic_route_by_def_name('action1', routes)
        action2_detail_route = self.get_dynamic_route_by_def_name('action2', routes)

        self.assertEqual(action1_list_route.name, u'{basename}-action-one-list')
        self.assertEqual(action2_detail_route.name, u'{basename}-action-two')

    def test_with_default_controllers(self):
        class BasicViewSet(viewsets.ViewSet):
            @link()
            def link(self, request, *args, **kwargs):
                pass

            @decorators.link()
            def link_default(self, request, *args, **kwargs):
                pass

            @action()
            def action(self, request, *args, **kwargs):
                pass

            @decorators.action()
            def action_default(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        link_route = self.get_dynamic_route_by_def_name('link', routes)
        link_default_route = self.get_dynamic_route_by_def_name('link_default', routes)
        action_route = self.get_dynamic_route_by_def_name('action', routes)
        action_default_route = self.get_dynamic_route_by_def_name('action_default', routes)

        self.assertEqual(link_route.name, u'{basename}-link')
        self.assertEqual(link_default_route.name, u'{basename}-link-default')
        self.assertEqual(action_route.name, u'{basename}-action')
        self.assertEqual(action_default_route.name, u'{basename}-action-default')
示例#4
0
class ExtendedDefaultRouterTest(TestCase):
    def setUp(self):
        self.router = ExtendedDefaultRouter()

    def get_routes_names(self, routes):
        return [i.name for i in routes]

    def get_dynamic_route_by_def_name(self, def_name, routes):
        try:
            return [i for i in routes if def_name in i.mapping.values()][0]
        except IndexError:
            return None

    def test_dynamic_list_route_should_come_before_detail_route(self):
        class BasicViewSet(viewsets.ViewSet):
            def list(self, request, *args, **kwargs):
                return Response({'method': 'list'})

            @action(detail=False)
            def detail1(self, request, *args, **kwargs):
                return Response({'method': 'detail1'})

        routes = self.router.get_routes(BasicViewSet)
        expected = [
            '{basename}-list',
            '{basename}-detail1',
            '{basename}-detail'
        ]
        msg = '@detail_route methods should come first in routes order'
        self.assertEqual(self.get_routes_names(routes), expected, msg)

    def test_detail_route(self):
        class BasicViewSet(viewsets.ViewSet):
            @action(detail=True)
            def action1(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_route = self.get_dynamic_route_by_def_name('action1', routes)

        msg = '@detail_route should map methods to def name'
        self.assertEqual(action1_route.mapping, {'get': 'action1'}, msg)

        msg = '@detail_route should use url with detail lookup'
        self.assertEqual(action1_route.url, u'^{prefix}/{lookup}/action1{trailing_slash}$', msg)

    def test_detail_route__with_methods(self):
        class BasicViewSet(viewsets.ViewSet):
            @action(detail=True, methods=['post'])
            def action1(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_route = self.get_dynamic_route_by_def_name('action1', routes)

        msg = '@detail_route should map methods to def name'
        self.assertEqual(action1_route.mapping, {'post': 'action1'}, msg)

        msg = '@detail_route should use url with detail lookup'
        self.assertEqual(action1_route.url, u'^{prefix}/{lookup}/action1{trailing_slash}$', msg)

    def test_detail_route__with_methods__and__with_url_path(self):
        class BasicViewSet(viewsets.ViewSet):
            @action(detail=True, methods=['post'], url_path='action-one')
            def action1(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_route = self.get_dynamic_route_by_def_name('action1', routes)

        msg = '@detail_route should map methods to "url_path"'
        self.assertEqual(action1_route.mapping, {'post': 'action1'}, msg)

        msg = '@detail_route should use url with detail lookup and "url_path" value'
        self.assertEqual(action1_route.url, u'^{prefix}/{lookup}/action-one{trailing_slash}$', msg)

    def test_list_route(self):
        class BasicViewSet(viewsets.ViewSet):
            @action(detail=False)
            def action1(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_route = self.get_dynamic_route_by_def_name('action1', routes)

        msg = '@list_route should map methods to def name'
        self.assertEqual(action1_route.mapping, {'get': 'action1'}, msg)

        msg = '@list_route should use url in list scope'
        self.assertEqual(action1_route.url, u'^{prefix}/action1{trailing_slash}$', msg)

    def test_list_route__with_methods(self):
        class BasicViewSet(viewsets.ViewSet):
            @action(detail=False, methods=['post'])
            def action1(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_route = self.get_dynamic_route_by_def_name('action1', routes)

        msg = '@list_route should map methods to def name'
        self.assertEqual(action1_route.mapping, {'post': 'action1'}, msg)

        msg = '@list_route should use url in list scope'
        self.assertEqual(action1_route.url, u'^{prefix}/action1{trailing_slash}$', msg)

    def test_list_route__with_methods__and__with_url_path(self):
        class BasicViewSet(viewsets.ViewSet):
            @action(detail=False, methods=['post'], url_path='action-one')
            def action1(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_route = self.get_dynamic_route_by_def_name('action1', routes)

        msg = '@list_route should map methods to "url_path"'
        self.assertEqual(action1_route.mapping, {'post': 'action1'}, msg)

        msg = '@list_route should use url in list scope with "url_path" value'
        self.assertEqual(action1_route.url, u'^{prefix}/action-one{trailing_slash}$', msg)

    def test_list_route_and_detail_route_with_exact_names(self):
        class BasicViewSet(viewsets.ViewSet):
            @action(detail=False, url_path='action-one')
            def action1(self, request, *args, **kwargs):
                pass

            @action(detail=True, url_path='action-one')
            def action1_detail(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_list_route = self.get_dynamic_route_by_def_name('action1', routes)
        action1_detail_route = self.get_dynamic_route_by_def_name('action1_detail', routes)

        self.assertEqual(action1_list_route.mapping, {'get': 'action1'})
        self.assertEqual(action1_list_route.url, u'^{prefix}/action-one{trailing_slash}$')

        self.assertEqual(action1_detail_route.mapping, {'get': 'action1_detail'})
        self.assertEqual(action1_detail_route.url, u'^{prefix}/{lookup}/action-one{trailing_slash}$')

    def test_list_route_and_detail_route_names(self):
        class BasicViewSet(viewsets.ViewSet):
            @action(detail=False)
            def action1(self, request, *args, **kwargs):
                pass

            @action(detail=True)
            def action2(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_list_route = self.get_dynamic_route_by_def_name('action1', routes)
        action2_detail_route = self.get_dynamic_route_by_def_name('action2', routes)

        self.assertEqual(action1_list_route.name, u'{basename}-action1')
        self.assertEqual(action2_detail_route.name, u'{basename}-action2')

    def test_list_route_and_detail_route_default_names__with_endpoints(self):
        class BasicViewSet(viewsets.ViewSet):
            @action(detail=False, url_path='action_one')
            def action1(self, request, *args, **kwargs):
                pass

            @action(detail=True, url_path='action-two')
            def action2(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_list_route = self.get_dynamic_route_by_def_name('action1', routes)
        action2_detail_route = self.get_dynamic_route_by_def_name('action2', routes)

        self.assertEqual(action1_list_route.name, u'{basename}-action1')
        self.assertEqual(action2_detail_route.name, u'{basename}-action2')

    def test_list_route_and_detail_route_names__with_endpoints(self):
        class BasicViewSet(viewsets.ViewSet):
            @action(detail=False, url_path='action_one', url_name='action_one')
            def action1(self, request, *args, **kwargs):
                pass

            @action(detail=True, url_path='action-two', url_name='action-two')
            def action2(self, request, *args, **kwargs):
                pass

        routes = self.router.get_routes(BasicViewSet)
        action1_list_route = self.get_dynamic_route_by_def_name('action1', routes)
        action2_detail_route = self.get_dynamic_route_by_def_name('action2', routes)

        self.assertEqual(action1_list_route.name, u'{basename}-action_one')
        self.assertEqual(action2_detail_route.name, u'{basename}-action-two')