From fa8322d54c8017c0419ac30ed7d5641304c750fe Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Fri, 11 Nov 2016 09:26:16 +0000 Subject: [PATCH] Add regression test for #4661 --- docs/api-guide/testing.md | 11 ++++++++++- tests/test_prefetch_related.py | 20 +++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/docs/api-guide/testing.md b/docs/api-guide/testing.md index 1f8c892339..de79a1e2fc 100644 --- a/docs/api-guide/testing.md +++ b/docs/api-guide/testing.md @@ -187,7 +187,12 @@ As usual CSRF validation will only apply to any session authenticated views. Th # RequestsClient REST framework also includes a client for interacting with your application -using the popular Python library, `requests`. +using the popular Python library, `requests`. This may be useful if: + +* You are expecting to interface with the API primarily from another Python service, +and want to test the service at the same level as the client will see. +* You want to write tests in such a way that they can also be run against a staging or +live environment. (See "Live tests" below.) This exposes exactly the same interface as if you were using a requests session directly. @@ -198,6 +203,10 @@ directly. Note that the requests client requires you to pass fully qualified URLs. +## `RequestsClient` and working with the database + +The `RequestsClient` class is useful if + ## Headers & Authentication Custom headers and authentication credentials can be provided in the same way diff --git a/tests/test_prefetch_related.py b/tests/test_prefetch_related.py index fc697adc1a..a9fa238eab 100644 --- a/tests/test_prefetch_related.py +++ b/tests/test_prefetch_related.py @@ -14,7 +14,7 @@ class Meta: class UserUpdate(generics.UpdateAPIView): - queryset = User.objects.all().prefetch_related('groups') + queryset = User.objects.exclude(username='exclude').prefetch_related('groups') serializer_class = UserSerializer @@ -39,3 +39,21 @@ def test_prefetch_related_updates(self): 'email': 'tom@example.com' } assert response.data == expected + + def test_prefetch_related_excluding_instance_from_original_queryset(self): + """ + Regression test for https://github.com/tomchristie/django-rest-framework/issues/4661 + """ + view = UserUpdate.as_view() + pk = self.user.pk + groups_pk = self.groups[0].pk + request = factory.put('/', {'username': 'exclude', 'groups': [groups_pk]}, format='json') + response = view(request, pk=pk) + assert User.objects.get(pk=pk).groups.count() == 1 + expected = { + 'id': pk, + 'username': 'exclude', + 'groups': [1], + 'email': 'tom@example.com' + } + assert response.data == expected