11#
2- # Copyright © 2021 Ingram Micro Inc. All rights reserved.
2+ # Copyright © 2022 Ingram Micro Inc. All rights reserved.
33#
44from cachetools import LFUCache , LRUCache
55
1212import pytest
1313
1414from 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
1616
1717from tests .dj_rf .models import Book
1818
@@ -103,7 +103,7 @@ def test_filter_cls_cache(api_client, clear_cache):
103103 response = api_client .get ('{0}?{1}' .format (reverse ('book-list' ), 'title=F' ))
104104 assert response .data == [{'id' : books [0 ].pk }]
105105
106- expected_cache_key = 'tests.dj_rf.view.DRFViewSet'
106+ expected_cache_key = 'tests.dj_rf.view.DRFViewSet+tests.dj_rf.filters.BooksFilterClass '
107107 assert expected_cache_key in _FilterClassCache .CACHE
108108 cache_item_id = id (_FilterClassCache .CACHE [expected_cache_key ])
109109
@@ -117,6 +117,42 @@ def test_filter_cls_cache(api_client, clear_cache):
117117 assert _FilterClassCache .CACHE == {}
118118
119119
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+
120156@pytest .mark .django_db
121157def test_query_cache (api_client , clear_cache , django_assert_num_queries ):
122158 books = [
@@ -136,13 +172,45 @@ def test_query_cache(api_client, clear_cache, django_assert_num_queries):
136172 assert response .status_code == HTTP_200_OK
137173 assert 'id' not in response .data [0 ]
138174
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+
139190 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
146214
147215
148216@pytest .mark .django_db
0 commit comments