diff options
| author | toran billups | 2013-03-07 15:09:59 -0600 | 
|---|---|---|
| committer | toran billups | 2013-03-08 10:08:53 -0600 | 
| commit | 1a8f07def8094a1e34a656d83fc7bdba0efff184 (patch) | |
| tree | 2b6a3cf0f336b1723d6bd74e773b6ad56dca6cf6 /rest_framework/tests | |
| parent | 4e80541824bab0712a816716c5c63ec5623370d8 (diff) | |
| download | django-rest-framework-1a8f07def8094a1e34a656d83fc7bdba0efff184.tar.bz2 | |
GenericAPIView now applies filter_backend for list and retrieve api views
Before this commit only the MultipleObjectAPIView would apply a
filter_backend, leaving the SingleObjectAPIView to return objects you
might otherwise expect to have been filtered out.
It's worth mentioning that when a SingleObjectAPIView makes a request
for an object that should be excluded, a 404 is the expected result.
Diffstat (limited to 'rest_framework/tests')
| -rw-r--r-- | rest_framework/tests/generics.py | 75 | 
1 files changed, 75 insertions, 0 deletions
| diff --git a/rest_framework/tests/generics.py b/rest_framework/tests/generics.py index f8f2ddaa..f7093401 100644 --- a/rest_framework/tests/generics.py +++ b/rest_framework/tests/generics.py @@ -350,3 +350,78 @@ class TestM2MBrowseableAPI(TestCase):          view = ExampleView().as_view()          response = view(request).render()          self.assertEqual(response.status_code, status.HTTP_200_OK) + + +class InclusiveFilterBackend(object): +    def filter_queryset(self, request, queryset, view): +        return queryset.filter(text='foo') + + +class ExclusiveFilterBackend(object): +    def filter_queryset(self, request, queryset, view): +        return queryset.filter(text='other') + + +class TestFilterBackendAppliedToViews(TestCase): + +    def setUp(self): +        """ +        Create 3 BasicModel instances to filter on. +        """ +        items = ['foo', 'bar', 'baz'] +        for item in items: +            BasicModel(text=item).save() +        self.objects = BasicModel.objects +        self.data = [ +            {'id': obj.id, 'text': obj.text} +            for obj in self.objects.all() +        ] +        self.root_view = RootView.as_view() +        self.instance_view = InstanceView.as_view() +        self.original_root_backend = getattr(RootView, 'filter_backend') +        self.original_instance_backend = getattr(InstanceView, 'filter_backend') + +    def tearDown(self): +        setattr(RootView, 'filter_backend', self.original_root_backend) +        setattr(InstanceView, 'filter_backend', self.original_instance_backend) + +    def test_get_root_view_filters_by_name_with_filter_backend(self): +        """ +        GET requests to ListCreateAPIView should return filtered list. +        """ +        setattr(RootView, 'filter_backend', InclusiveFilterBackend) +        request = factory.get('/') +        response = self.root_view(request).render() +        self.assertEqual(response.status_code, status.HTTP_200_OK) +        self.assertEqual(len(response.data), 1) +        self.assertEqual(response.data, [{'id': 1, 'text': 'foo'}]) + +    def test_get_root_view_filters_out_all_models_with_exclusive_filter_backend(self): +        """ +        GET requests to ListCreateAPIView should return empty list when all models are filtered out. +        """ +        setattr(RootView, 'filter_backend', ExclusiveFilterBackend) +        request = factory.get('/') +        response = self.root_view(request).render() +        self.assertEqual(response.status_code, status.HTTP_200_OK) +        self.assertEqual(response.data, []) + +    def test_get_instance_view_filters_out_name_with_filter_backend(self): +        """ +        GET requests to RetrieveUpdateDestroyAPIView should raise 404 when model filtered out. +        """ +        setattr(InstanceView, 'filter_backend', ExclusiveFilterBackend) +        request = factory.get('/1') +        response = self.instance_view(request, pk=1).render() +        self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) +        self.assertEqual(response.data, {'detail': 'Not found'}) + +    def test_get_instance_view_will_return_single_object_when_filter_does_not_exclude_it(self): +        """ +        GET requests to RetrieveUpdateDestroyAPIView should return a single object when not excluded +        """ +        setattr(InstanceView, 'filter_backend', InclusiveFilterBackend) +        request = factory.get('/1') +        response = self.instance_view(request, pk=1).render() +        self.assertEqual(response.status_code, status.HTTP_200_OK) +        self.assertEqual(response.data, {'id': 1, 'text': 'foo'}) | 
