1
1
#
2
- # Copyright © 2021 Ingram Micro Inc. All rights reserved.
2
+ # Copyright © 2022 Ingram Micro Inc. All rights reserved.
3
3
#
4
4
from cachetools import LFUCache , LRUCache
5
5
12
12
import pytest
13
13
14
14
from rest_framework .reverse import reverse
15
- from rest_framework .status import HTTP_200_OK
15
+ from rest_framework .status import HTTP_200_OK , HTTP_404_NOT_FOUND
16
16
17
17
from tests .dj_rf .models import Book
18
18
@@ -103,7 +103,7 @@ def test_filter_cls_cache(api_client, clear_cache):
103
103
response = api_client .get ('{0}?{1}' .format (reverse ('book-list' ), 'title=F' ))
104
104
assert response .data == [{'id' : books [0 ].pk }]
105
105
106
- expected_cache_key = 'tests.dj_rf.view.DRFViewSet'
106
+ expected_cache_key = 'tests.dj_rf.view.DRFViewSet+tests.dj_rf.filters.BooksFilterClass '
107
107
assert expected_cache_key in _FilterClassCache .CACHE
108
108
cache_item_id = id (_FilterClassCache .CACHE [expected_cache_key ])
109
109
@@ -117,6 +117,42 @@ def test_filter_cls_cache(api_client, clear_cache):
117
117
assert _FilterClassCache .CACHE == {}
118
118
119
119
120
+ @pytest .mark .django_db
121
+ def test_dynamic_filter_cls_cache (api_client , clear_cache ):
122
+ books = [
123
+ Book .objects .create (title = 'F' ),
124
+ Book .objects .create (title = 'G' ),
125
+ ]
126
+
127
+ list_cache_key = '{0}+{1}' .format (
128
+ 'tests.dj_rf.view.DynamicFilterClsViewSet' ,
129
+ 'tests.dj_rf.filters.SelectBooksFilterClass' ,
130
+ )
131
+ detail_cache_key = '{0}+{1}' .format (
132
+ 'tests.dj_rf.view.DynamicFilterClsViewSet' ,
133
+ 'tests.dj_rf.filters.SelectDetailedBooksFilterClass' ,
134
+ )
135
+
136
+ assert _FilterClassCache .CACHE == {}
137
+
138
+ api_client .get ('{0}?{1}' .format (reverse ('dynamicfiltercls-list' ), 'title=F' ))
139
+ assert list_cache_key in _FilterClassCache .CACHE
140
+
141
+ list_cache_item_id = id (_FilterClassCache .CACHE [list_cache_key ])
142
+ api_client .get ('{0}?{1}' .format (reverse ('dynamicfiltercls-list' ), 'title=G' ))
143
+ assert len (_FilterClassCache .CACHE ) == 1
144
+ assert id (_FilterClassCache .CACHE [list_cache_key ]) == list_cache_item_id
145
+
146
+ api_client .get (reverse ('dynamicfiltercls-detail' , [books [0 ].pk ]))
147
+ assert len (_FilterClassCache .CACHE ) == 2
148
+ assert detail_cache_key in _FilterClassCache .CACHE
149
+
150
+ detail_cache_item_id = id (_FilterClassCache .CACHE [detail_cache_key ])
151
+ api_client .get (reverse ('dynamicfiltercls-detail' , [books [1 ].pk ]))
152
+ assert len (_FilterClassCache .CACHE ) == 2
153
+ assert id (_FilterClassCache .CACHE [detail_cache_key ]) == detail_cache_item_id
154
+
155
+
120
156
@pytest .mark .django_db
121
157
def test_query_cache (api_client , clear_cache , django_assert_num_queries ):
122
158
books = [
@@ -136,13 +172,45 @@ def test_query_cache(api_client, clear_cache, django_assert_num_queries):
136
172
assert response .status_code == HTTP_200_OK
137
173
assert 'id' not in response .data [0 ]
138
174
175
+ response = api_client .get ('{0}?{1}' .format (reverse ('dynamicfiltercls-list' ), 'title=F' ))
176
+ assert response .data [0 ]['id' ] == books [0 ].pk
177
+
178
+ response = api_client .get (reverse ('dynamicfiltercls-list' ) + '?select(author)' )
179
+ assert len (response .data ) == 2
180
+
181
+ response = api_client .get ('{0}?{1}' .format (reverse ('dynamicfiltercls-list' ), 'title=X' ))
182
+ assert response .data == []
183
+
184
+ response = api_client .get (reverse ('dynamicfiltercls-detail' , [books [0 ].pk ]))
185
+ assert response .data ['id' ] == books [0 ].pk
186
+
187
+ response = api_client .get (reverse ('dynamicfiltercls-detail' , ['non-exists' ]))
188
+ assert response .status_code == HTTP_404_NOT_FOUND
189
+
139
190
caches = RQLFilterBackend ._CACHES
140
- assert isinstance (caches ['tests.dj_rf.view.DRFViewSet' ], LFUCache )
141
- assert caches ['tests.dj_rf.view.DRFViewSet' ].currsize == 2
142
- assert caches ['tests.dj_rf.view.DRFViewSet' ].maxsize == 20
143
- assert isinstance (caches ['tests.dj_rf.view.SelectViewSet' ], LRUCache )
144
- assert caches ['tests.dj_rf.view.SelectViewSet' ].currsize == 1
145
- assert caches ['tests.dj_rf.view.SelectViewSet' ].maxsize == 100
191
+ cache = caches ['tests.dj_rf.view.DRFViewSet+tests.dj_rf.filters.BooksFilterClass' ]
192
+ assert isinstance (cache , LFUCache )
193
+ assert cache .currsize == 2
194
+ assert cache .maxsize == 20
195
+
196
+ cache = caches ['tests.dj_rf.view.SelectViewSet+tests.dj_rf.filters.SelectBooksFilterClass' ]
197
+ assert isinstance (cache , LRUCache )
198
+ assert cache .currsize == 1
199
+ assert cache .maxsize == 100
200
+
201
+ cache = caches [
202
+ 'tests.dj_rf.view.DynamicFilterClsViewSet'
203
+ '+tests.dj_rf.filters.SelectBooksFilterClass'
204
+ ]
205
+ assert isinstance (cache , LRUCache )
206
+ assert cache .currsize == 3
207
+
208
+ cache = caches [
209
+ 'tests.dj_rf.view.DynamicFilterClsViewSet'
210
+ '+tests.dj_rf.filters.SelectDetailedBooksFilterClass'
211
+ ]
212
+ assert isinstance (cache , LRUCache )
213
+ assert cache .currsize == 1
146
214
147
215
148
216
@pytest .mark .django_db
0 commit comments