File: test_backends.py

package info (click to toggle)
djangorestframework-filters 0.10.2.post0-1
  • links: PTS
  • area: main
  • in suites: buster
  • size: 268 kB
  • sloc: python: 1,714; makefile: 5
file content (102 lines) | stat: -rw-r--r-- 4,086 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102

from rest_framework.test import APITestCase, APIRequestFactory
from rest_framework_filters import FilterSet

from .testapp import models, views

factory = APIRequestFactory()


class BackendTest(APITestCase):

    @classmethod
    def setUpTestData(cls):
        models.User.objects.create(username="user1", email="user1@example.org")
        models.User.objects.create(username="user2", email="user2@example.org")

    def test_django_filter_compatibility(self):
        response = self.client.get('/df-users/', {'username': 'user1'}, content_type='json')

        self.assertEqual(len(response.data), 1)
        self.assertEqual(response.data[0]['username'], 'user1')

    def test_filter_fields_reusability(self):
        # Ensure auto-generated FilterSet is reusable w/ filter_fields. See:
        # https://github.com/philipn/django-rest-framework-filters/issues/81

        # Ensure that the filter_fields aren't altered
        self.assertDictEqual(views.FilterFieldsUserViewSet.filter_fields, {'username': '__all__'})

        response = self.client.get('/ff-users/', {'username': 'user1'}, content_type='json')
        self.assertEqual(len(response.data), 1)
        self.assertEqual(response.data[0]['username'], 'user1')
        self.assertDictEqual(views.FilterFieldsUserViewSet.filter_fields, {'username': '__all__'})

        response = self.client.get('/ff-users/', {'username': 'user1'}, content_type='json')
        self.assertEqual(len(response.data), 1)
        self.assertEqual(response.data[0]['username'], 'user1')
        self.assertDictEqual(views.FilterFieldsUserViewSet.filter_fields, {'username': '__all__'})

    def test_backend_output_sanity(self):
        """
        Sanity check to ensure backend can at least render something without crashing.
        """
        class SimpleViewSet(views.FilterFieldsUserViewSet):
            filter_fields = ['username']

        view = SimpleViewSet(action_map={})
        backend = view.filter_backends[0]
        request = view.initialize_request(factory.get('/'))
        html = backend().to_html(request, view.get_queryset(), view)

        self.assertHTMLEqual(html, """
        <h2>Field filters</h2>
        <form class="form" action="" method="get">
            <p>
                <label for="id_username">Username:</label>
                <input id="id_username" name="username" type="text" />
            </p>
            <button type="submit" class="btn btn-primary">Submit</button>
        </form>
        """)

    def test_request_obj_is_passed(test):
        """
        Ensure that the request object is passed from the backend to the filterset.
        See: https://github.com/philipn/django-rest-framework-filters/issues/149
        """
        class RequestCheck(FilterSet):
            def __init__(self, *args, **kwargs):
                super(RequestCheck, self).__init__(*args, **kwargs)
                test.assertIsNotNone(self.request)

            class Meta:
                model = models.User
                fields = ['username']

        class ViewSet(views.FilterFieldsUserViewSet):
            filter_class = RequestCheck

        view = ViewSet(action_map={})
        backend = view.filter_backends[0]
        request = view.initialize_request(factory.get('/'))
        backend().filter_queryset(request, view.get_queryset(), view)

    def test_exclusion(self):
        class RequestCheck(FilterSet):
            class Meta:
                model = models.User
                fields = ['username']

        class ViewSet(views.FilterFieldsUserViewSet):
            filter_class = RequestCheck

        view = ViewSet(action_map={})
        backend = view.filter_backends[0]
        request = view.initialize_request(factory.get('/?username=user1'))
        qs = backend().filter_queryset(request, view.get_queryset(), view)
        self.assertEqual([u.pk for u in qs], [1])

        request = view.initialize_request(factory.get('/?username!=user1'))
        qs = backend().filter_queryset(request, view.get_queryset(), view)
        self.assertEqual([u.pk for u in qs], [2])