diff --git a/tests/browsable_api/auth_urls.py b/tests/browsable_api/auth_urls.py index bce7dcf91..098a99acc 100644 --- a/tests/browsable_api/auth_urls.py +++ b/tests/browsable_api/auth_urls.py @@ -1,10 +1,17 @@ from __future__ import unicode_literals from django.conf.urls import patterns, url, include +from rest_framework import routers -from .views import MockView +from .views import MockView, FooViewSet, BarViewSet + +router = routers.SimpleRouter() +router.register(r'foo', FooViewSet) +router.register(r'bar', BarViewSet) urlpatterns = patterns( '', (r'^$', MockView.as_view()), + url(r'^', include(router.urls)), + url(r'^bar/(?P\d+)/$', BarViewSet, name='bar-list'), url(r'^auth/', include('rest_framework.urls', namespace='rest_framework')), ) diff --git a/tests/browsable_api/test_browsable_api.py b/tests/browsable_api/test_browsable_api.py index 5f2647838..31907f84e 100644 --- a/tests/browsable_api/test_browsable_api.py +++ b/tests/browsable_api/test_browsable_api.py @@ -3,6 +3,7 @@ from django.contrib.auth.models import User from django.test import TestCase from rest_framework.test import APIClient +from .models import Foo, Bar class DropdownWithAuthTests(TestCase): @@ -16,6 +17,8 @@ class DropdownWithAuthTests(TestCase): self.email = 'lennon@thebeatles.com' self.password = 'password' self.user = User.objects.create_user(self.username, self.email, self.password) + foo = Foo.objects.create(name='Foo') + Bar.objects.create(foo=foo) def tearDown(self): self.client.logout() @@ -25,6 +28,13 @@ class DropdownWithAuthTests(TestCase): response = self.client.get('/') self.assertContains(response, 'john') + def test_bug_2455_clone_request(self): + self.client.login(username=self.username, password=self.password) + json_response = self.client.get('/foo/1/?format=json') + self.assertEqual(json_response.status_code, 200) + browsable_api_response = self.client.get('/foo/1/') + self.assertEqual(browsable_api_response.status_code, 200) + def test_logout_shown_when_logged_in(self): self.client.login(username=self.username, password=self.password) response = self.client.get('/') diff --git a/tests/browsable_api/views.py b/tests/browsable_api/views.py index 000f4e804..f06f7c40a 100644 --- a/tests/browsable_api/views.py +++ b/tests/browsable_api/views.py @@ -1,9 +1,14 @@ from __future__ import unicode_literals from rest_framework.views import APIView +from rest_framework.viewsets import ModelViewSet from rest_framework import authentication from rest_framework import renderers from rest_framework.response import Response +from rest_framework.renderers import BrowsableAPIRenderer, JSONRenderer +from rest_framework.versioning import NamespaceVersioning +from .models import Foo, Bar +from .serializers import FooSerializer, BarSerializer class MockView(APIView): @@ -13,3 +18,25 @@ class MockView(APIView): def get(self, request): return Response({'a': 1, 'b': 2, 'c': 3}) + + +class SerializerClassMixin(object): + def get_serializer_class(self): + # Get base name of serializer + self.request.version + return self.serializer_class + + +class FooViewSet(SerializerClassMixin, ModelViewSet): + versioning_class = NamespaceVersioning + model = Foo + queryset = Foo.objects.all() + serializer_class = FooSerializer + renderer_classes = (BrowsableAPIRenderer, JSONRenderer) + + +class BarViewSet(SerializerClassMixin, ModelViewSet): + model = Bar + queryset = Bar.objects.all() + serializer_class = BarSerializer + renderer_classes = (BrowsableAPIRenderer, )