From 900773ad06ed6b3e9dc67acd76c212a5b7146824 Mon Sep 17 00:00:00 2001 From: Ryan P Kilby Date: Wed, 29 Apr 2020 03:21:42 -0700 Subject: [PATCH] Minor test improvements (#7297) * Pass data via response instead of renderer_context Instead of relying on internal implementation details to get a reference to the response or view, attach these directly to the returned response. * Remove unused method --- tests/test_decorators.py | 4 ---- tests/test_renderers.py | 14 ++++++++++++-- tests/test_request.py | 10 ++++++---- tests/test_viewsets.py | 14 +++++++++----- 4 files changed, 27 insertions(+), 15 deletions(-) diff --git a/tests/test_decorators.py b/tests/test_decorators.py index e10f0e5c5..99ba13e60 100644 --- a/tests/test_decorators.py +++ b/tests/test_decorators.py @@ -22,10 +22,6 @@ class DecoratorTestCase(TestCase): def setUp(self): self.factory = APIRequestFactory() - def _finalize_response(self, request, response, *args, **kwargs): - response.request = request - return APIView.finalize_response(self, request, response, *args, **kwargs) - def test_api_view_incorrect(self): """ If @api_view is not applied correct, we should raise an assertion. diff --git a/tests/test_renderers.py b/tests/test_renderers.py index c79c0a766..71c5fb3f6 100644 --- a/tests/test_renderers.py +++ b/tests/test_renderers.py @@ -741,6 +741,11 @@ class AdminRendererTests(TestCase): class DummyGenericViewsetLike(APIView): lookup_field = 'test' + def get(self, request): + response = Response() + response.view = self + return response + def reverse_action(view, *args, **kwargs): self.assertEqual(kwargs['kwargs']['test'], 1) return '/example/' @@ -749,7 +754,7 @@ class AdminRendererTests(TestCase): view = DummyGenericViewsetLike.as_view() request = factory.get('/') response = view(request) - view = response.renderer_context['view'] + view = response.view self.assertEqual(self.renderer.get_result_url({'test': 1}, view), '/example/') self.assertIsNone(self.renderer.get_result_url({}, view)) @@ -760,11 +765,16 @@ class AdminRendererTests(TestCase): class DummyView(APIView): lookup_field = 'test' + def get(self, request): + response = Response() + response.view = self + return response + # get the view instance instead of the view function view = DummyView.as_view() request = factory.get('/') response = view(request) - view = response.renderer_context['view'] + view = response.view self.assertIsNone(self.renderer.get_result_url({'test': 1}, view)) self.assertIsNone(self.renderer.get_result_url({}, view)) diff --git a/tests/test_request.py b/tests/test_request.py index ed1b2e867..be84fe5f9 100644 --- a/tests/test_request.py +++ b/tests/test_request.py @@ -137,7 +137,9 @@ class MockView(APIView): class EchoView(APIView): def post(self, request): - return Response(status=status.HTTP_200_OK, data=request.data) + response = Response(status=status.HTTP_200_OK, data=request.data) + response._request = request # test client sets `request` input + return response class FileUploadView(APIView): @@ -306,7 +308,7 @@ class TestHttpRequest(TestCase): `RawPostDataException` being raised. """ response = APIClient().post('/echo/', data={'a': 'b'}, format='json') - request = response.renderer_context['request'] + request = response._request # ensure that request stream was consumed by json parser assert request.content_type.startswith('application/json') @@ -325,7 +327,7 @@ class TestHttpRequest(TestCase): the duplicate stream parse exception. """ response = APIClient().post('/echo/', data={'a': 'b'}) - request = response.renderer_context['request'] + request = response._request # ensure that request stream was consumed by form parser assert request.content_type.startswith('multipart/form-data') @@ -333,7 +335,7 @@ class TestHttpRequest(TestCase): # pass same HttpRequest to view, form data set on underlying request response = EchoView.as_view()(request._request) - request = response.renderer_context['request'] + request = response._request # ensure that request stream was consumed by form parser assert request.content_type.startswith('multipart/form-data') diff --git a/tests/test_viewsets.py b/tests/test_viewsets.py index 1a621c518..465806a09 100644 --- a/tests/test_viewsets.py +++ b/tests/test_viewsets.py @@ -42,7 +42,9 @@ class ActionViewSet(GenericViewSet): return response def retrieve(self, request, *args, **kwargs): - return Response() + response = Response() + response.view = self + return response @action(detail=False) def list_action(self, request, *args, **kwargs): @@ -70,7 +72,9 @@ class ActionViewSet(GenericViewSet): class ActionNamesViewSet(GenericViewSet): def retrieve(self, request, *args, **kwargs): - return Response() + response = Response() + response.view = self + return response @action(detail=True) def unnamed_action(self, request, *args, **kwargs): @@ -209,7 +213,7 @@ class GetExtraActionUrlMapTests(TestCase): def test_list_view(self): response = self.client.get('/api/actions/') - view = response.renderer_context['view'] + view = response.view expected = OrderedDict([ ('Custom list action', 'http://testserver/api/actions/custom_list_action/'), @@ -220,7 +224,7 @@ class GetExtraActionUrlMapTests(TestCase): def test_detail_view(self): response = self.client.get('/api/actions/1/') - view = response.renderer_context['view'] + view = response.view expected = OrderedDict([ ('Custom detail action', 'http://testserver/api/actions/1/custom_detail_action/'), @@ -236,7 +240,7 @@ class GetExtraActionUrlMapTests(TestCase): def test_action_names(self): # Action 'name' and 'suffix' kwargs should be respected response = self.client.get('/api/names/1/') - view = response.renderer_context['view'] + view = response.view expected = OrderedDict([ ('Custom Name', 'http://testserver/api/names/1/named_action/'),