|
2 | 2 | from __future__ import absolute_import |
3 | 3 | from __future__ import unicode_literals |
4 | 4 |
|
| 5 | +import sys |
| 6 | + |
5 | 7 | from django.test import TestCase |
6 | 8 | from django.utils import six |
7 | 9 |
|
|
11 | 13 | from django_filters.filters import BaseInFilter |
12 | 14 |
|
13 | 15 | from .testapp.models import ( |
14 | | - User, Note, Post, Person, Tag, BlogPost, |
| 16 | + Note, Post, Person, Tag, BlogPost, |
15 | 17 | ) |
16 | 18 |
|
17 | 19 | from .testapp.filters import ( |
|
24 | 26 | BlogPostOverrideFilter, |
25 | 27 | ) |
26 | 28 |
|
| 29 | +from rest_framework.views import APIView |
| 30 | +from rest_framework.test import APIRequestFactory |
| 31 | +factory = APIRequestFactory() |
| 32 | + |
| 33 | + |
| 34 | +class limit_recursion: |
| 35 | + def __init__(self): |
| 36 | + self.original_limit = sys.getrecursionlimit() |
| 37 | + |
| 38 | + def __enter__(self): |
| 39 | + sys.setrecursionlimit(100) |
| 40 | + |
| 41 | + def __exit__(self, *args): |
| 42 | + sys.setrecursionlimit(self.original_limit) |
| 43 | + |
27 | 44 |
|
28 | 45 | class LookupsFilterTests(TestCase): |
29 | 46 | """ |
@@ -429,3 +446,19 @@ def test_related_exclusion_results(self): |
429 | 446 |
|
430 | 447 | self.assertEqual(len(results), 1) |
431 | 448 | self.assertEqual(results[0], 'Post 2') |
| 449 | + |
| 450 | + def test_exclude_and_request_interaction(self): |
| 451 | + # See: https://github.com/philipn/django-rest-framework-filters/issues/171 |
| 452 | + request = APIView().initialize_request(factory.get('/?tags__name__contains!=Tag')) |
| 453 | + filterset = BlogPostFilter(request.query_params, request=request, queryset=BlogPost.objects.all()) |
| 454 | + |
| 455 | + try: |
| 456 | + with limit_recursion(): |
| 457 | + qs = filterset.qs |
| 458 | + except RuntimeError: |
| 459 | + self.fail('Recursion limit reached') |
| 460 | + |
| 461 | + results = [r.title for r in qs] |
| 462 | + |
| 463 | + self.assertEqual(len(results), 1) |
| 464 | + self.assertEqual(results[0], 'Post 2') |
0 commit comments