From 8d0dbc8092a754e1f0f7d80d93506072556f35a2 Mon Sep 17 00:00:00 2001 From: Raphaël Barrois Date: Fri, 13 Mar 2015 01:07:20 +0100 Subject: Fix lookup_url_kwarg handling in viewsets. The ``lookup_url_kwarg`` is intended to set the name of a field in the URL regexps when using custom ``lookup_field``, but the routers ignore it altogether. --- tests/test_routers.py | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'tests') diff --git a/tests/test_routers.py b/tests/test_routers.py index 08c58ec7..19eeb868 100644 --- a/tests/test_routers.py +++ b/tests/test_routers.py @@ -32,6 +32,13 @@ class NoteViewSet(viewsets.ModelViewSet): lookup_field = 'uuid' +class KWargedNoteViewSet(viewsets.ModelViewSet): + queryset = RouterTestModel.objects.all() + serializer_class = NoteSerializer + lookup_field = 'text__contains' + lookup_url_kwarg = 'text' + + class MockViewSet(viewsets.ModelViewSet): queryset = None serializer_class = None @@ -40,6 +47,9 @@ class MockViewSet(viewsets.ModelViewSet): notes_router = SimpleRouter() notes_router.register(r'notes', NoteViewSet) +kwarged_notes_router = SimpleRouter() +kwarged_notes_router.register(r'notes', KWargedNoteViewSet) + namespaced_router = DefaultRouter() namespaced_router.register(r'example', MockViewSet, base_name='example') @@ -47,6 +57,7 @@ urlpatterns = [ url(r'^non-namespaced/', include(namespaced_router.urls)), url(r'^namespaced/', include(namespaced_router.urls, namespace='example')), url(r'^example/', include(notes_router.urls)), + url(r'^example2/', include(kwarged_notes_router.urls)), ] @@ -177,6 +188,33 @@ class TestLookupValueRegex(TestCase): self.assertEqual(expected[idx], self.urls[idx].regex.pattern) +class TestLookupUrlKwargs(TestCase): + """ + Ensure the router honors lookup_url_kwarg. + + Setup a deep lookup_field, but map it to a simple URL kwarg. + """ + urls = 'tests.test_routers' + + def setUp(self): + RouterTestModel.objects.create(uuid='123', text='foo bar') + + def test_custom_lookup_url_kwarg_route(self): + detail_route = kwarged_notes_router.urls[-1] + detail_url_pattern = detail_route.regex.pattern + self.assertIn('^notes/(?P', detail_url_pattern) + + def test_retrieve_lookup_url_kwarg_detail_view(self): + response = self.client.get('/example2/notes/fo/') + self.assertEqual( + response.data, + { + "url": "http://testserver/example/notes/123/", + "uuid": "123", "text": "foo bar" + } + ) + + class TestTrailingSlashIncluded(TestCase): def setUp(self): class NoteViewSet(viewsets.ModelViewSet): -- cgit v1.2.3 From 76ede5beda74c1bb224f038d635ab586416bfca8 Mon Sep 17 00:00:00 2001 From: José Padilla Date: Sat, 14 Mar 2015 15:54:11 -0400 Subject: Simplify test settings --- tests/conftest.py | 7 ------- 1 file changed, 7 deletions(-) (limited to 'tests') diff --git a/tests/conftest.py b/tests/conftest.py index 44ed070b..03b4e328 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -18,7 +18,6 @@ def pytest_configure(): MIDDLEWARE_CLASSES=( 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', ), @@ -27,7 +26,6 @@ def pytest_configure(): 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', - 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', @@ -35,12 +33,7 @@ def pytest_configure(): 'tests', ), PASSWORD_HASHERS=( - 'django.contrib.auth.hashers.SHA1PasswordHasher', - 'django.contrib.auth.hashers.PBKDF2PasswordHasher', - 'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher', - 'django.contrib.auth.hashers.BCryptPasswordHasher', 'django.contrib.auth.hashers.MD5PasswordHasher', - 'django.contrib.auth.hashers.CryptPasswordHasher', ), ) -- cgit v1.2.3