@@ -350,3 +350,78 @@ def test_m2m_in_browseable_api(self):
350
350
view = ExampleView ().as_view ()
351
351
response = view (request ).render ()
352
352
self .assertEqual (response .status_code , status .HTTP_200_OK )
353
+
354
+
355
+ class InclusiveFilterBackend (object ):
356
+ def filter_queryset (self , request , queryset , view ):
357
+ return queryset .filter (text = 'foo' )
358
+
359
+
360
+ class ExclusiveFilterBackend (object ):
361
+ def filter_queryset (self , request , queryset , view ):
362
+ return queryset .filter (text = 'other' )
363
+
364
+
365
+ class TestFilterBackendAppliedToViews (TestCase ):
366
+
367
+ def setUp (self ):
368
+ """
369
+ Create 3 BasicModel instances to filter on.
370
+ """
371
+ items = ['foo' , 'bar' , 'baz' ]
372
+ for item in items :
373
+ BasicModel (text = item ).save ()
374
+ self .objects = BasicModel .objects
375
+
10000
self .data = [
376
+ {'id' : obj .id , 'text' : obj .text }
377
+ for obj in self .objects .all ()
378
+ ]
379
+ self .root_view = RootView .as_view ()
380
+ self .instance_view = InstanceView .as_view ()
381
+ self .original_root_backend = getattr (RootView , 'filter_backend' )
382
+ self .original_instance_backend = getattr (InstanceView , 'filter_backend' )
383
+
384
+ def tearDown (self ):
385
+ setattr (RootView , 'filter_backend' , self .original_root_backend )
386
+ setattr (InstanceView , 'filter_backend' , self .original_instance_backend )
387
+
388
+ def test_get_root_view_filters_by_name_with_filter_backend (self ):
389
+ """
390
+ GET requests to ListCreateAPIView should return filtered list.
391
+ """
392
+ setattr (RootView , 'filter_backend' , InclusiveFilterBackend )
393
+ request = factory .get ('/' )
394
+ response = self .root_view (request ).render ()
395
+ self .assertEqual (response .status_code , status .HTTP_200_OK )
396
+ self .assertEqual (len (response .data ), 1 )
397
+ self .assertEqual (response .data , [{'id' : 1 , 'text' : 'foo' }])
398
+
399
+ def test_get_root_view_filters_out_all_models_with_exclusive_filter_backend (self ):
400
+ """
401
+ GET requests to ListCreateAPIView should return empty list when all models are filtered out.
402
+ """
403
+ setattr (RootView , 'filter_backend' , ExclusiveFilterBackend )
404
+ request = factory .get ('/' )
405
+ response = self .root_view (request ).render ()
406
+ self .assertEqual (response .status_code , status .HTTP_200_OK )
407
+ self .assertEqual (response .data , [])
408
+
409
+ def test_get_instance_view_filters_out_name_with_filter_backend (self ):
410
+ """
411
+ GET requests to RetrieveUpdateDestroyAPIView should raise 404 when model filtered out.
412
+ """
413
+ setattr (InstanceView , 'filter_backend' , ExclusiveFilterBackend )
414
+ request = factory .get ('/1' )
415
+ response = self .instance_view (request , pk = 1 ).render ()
416
+ self .assertEqual (response .status_code , status .HTTP_404_NOT_FOUND )
417
+ self .assertEqual (response .data , {'detail' : 'Not found' })
418
+
419
+ def test_get_instance_view_will_return_single_object_when_filter_does_not_exclude_it (self ):
420
+ """
421
+ GET requests to RetrieveUpdateDestroyAPIView should return a single object when not excluded
422
+ """
423
+ setattr (InstanceView , 'filter_backend' , InclusiveFilterBackend )
424
+ request = factory .get ('/1' )
425
+ response = self .instance_view (request , pk = 1 ).render ()
426
+ self .assertEqual (response .status_code , status .HTTP_200_OK )
427
+ self .assertEqual (response .data , {'id' : 1 , 'text' : 'foo' })
0 commit comments