Skip to content

Commit 904172c

Browse files
committed
Add tests for decorators
1 parent 1b71d69 commit 904172c

File tree

3 files changed

+55
-17
lines changed

3 files changed

+55
-17
lines changed

qscache/cache/base.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def _get_cache_key(self, cache_key: Optional[str] = None) -> str:
2929
def get_cache_key(self) -> str:
3030
return self._get_cache_key(self.cache_key)
3131

32-
def _get_detail_cache_key(self, unique_identifier) -> str:
32+
def get_detail_cache_key(self, unique_identifier) -> str:
3333
detail_cache_key = f"{self.get_cache_key()}_{unique_identifier}"
3434
return detail_cache_key
3535

@@ -165,7 +165,7 @@ def get(
165165
- Cached object or None if raise_exception=False and object was not found.
166166
"""
167167
try:
168-
cache_key = self._get_detail_cache_key(unique_identifier)
168+
cache_key = self.get_detail_cache_key(unique_identifier)
169169
obj = cache.get(cache_key)
170170
if obj is not None:
171171
return obj

qscache/cache/decorators.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ def wrapper(*args, **kwargs):
2525

2626
def clear_cache_detail(
2727
manager: Type[ManagerType],
28-
field_key_identifier: str = "pk",
28+
field: str = "pk",
2929
additional_fields: Optional[List[str]] = None,
3030
):
3131
"""
@@ -38,15 +38,13 @@ def clear_cache_detail(
3838
def clear(func):
3939
def wrapper(*args, **kwargs):
4040
obj = func(*args, **kwargs)
41-
detail_key = manager._get_detail_cache_key( # noqa
42-
getattr(obj, field_key_identifier)
43-
)
41+
detail_key = manager.get_detail_cache_key(getattr(obj, field)) # noqa
4442
if additional_fields is not None:
4543
deleted_keys = [detail_key]
4644
deleted_keys.append(additional_fields)
4745
cache.delete_many(deleted_keys)
4846
else:
49-
cache.delete_many(detail_key)
47+
cache.delete(detail_key)
5048

5149
return wrapper
5250

qscache/tests/test_cache.py

Lines changed: 50 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
from django_redis import get_redis_connection
1010

11+
from qscache import clear_cache_keys, clear_cache_detail
12+
1113
from example_app.models import Example
1214
from example_app.cache import (
1315
example_cache_manager,
@@ -65,7 +67,7 @@ def test_get(self) -> None:
6567
unique_identifier=example_object.pk,
6668
filter_kwargs={"pk": example_object.pk},
6769
)
68-
detail_cache_key = example_cache_manager._get_detail_cache_key(
70+
detail_cache_key = example_cache_manager.get_detail_cache_key(
6971
unique_identifier=example_object.pk
7072
)
7173

@@ -113,7 +115,7 @@ def test_get_with_filter(self) -> None:
113115
raise_exception=False, # if raise_exception is False then we don't raise Http404 instead we return None
114116
)
115117

116-
cache_key = example_cache_manager._get_detail_cache_key(
118+
cache_key = example_cache_manager.get_detail_cache_key(
117119
unique_identifier=example_object.pk
118120
)
119121

@@ -139,7 +141,7 @@ def test_get_raise_exception(self) -> None:
139141
filter_kwargs=filter_kwargs,
140142
)
141143

142-
cache_key = example_cache_manager._get_detail_cache_key(
144+
cache_key = example_cache_manager.get_detail_cache_key(
143145
unique_identifier=example_object.pk
144146
)
145147

@@ -386,17 +388,55 @@ def test_dont_use_prefetch_related_for_list(self) -> None:
386388

387389
# 1 new query is executed because we don't prefetch_related objects in list query when use_prefetch_related_for_list is False
388390
self.assertEqual(len(connection.queries), 1)
389-
391+
390392
obj = example_cache_user_prefetch_related_manager.get(
391-
unique_identifier=example_object.pk,
393+
unique_identifier=example_object.pk,
392394
filter_kwargs={"pk": example_object.pk},
393395
)
394-
396+
395397
reset_queries()
396-
397-
398+
398399
for user in obj.users.all():
399400
first_name = user.first_name
400-
401+
401402
self.assertEqual(len(connection.queries), 0)
402-
403+
404+
def test_clear_cache_keys_decorator(self) -> None:
405+
example_list = example_cache_manager.all()
406+
407+
self.assertIn(example_cache_manager.cache_key, cache.keys("*"))
408+
409+
@clear_cache_keys(keys=[example_cache_manager.cache_key])
410+
def create_example_object() -> None:
411+
example_object = Example(
412+
title="MojixCoder", text="Mojix Coder", number=1010
413+
)
414+
example_object.save()
415+
416+
create_example_object()
417+
418+
# Cache key is removed from cache
419+
# So next time when we call .all() cache will be updated
420+
self.assertNotIn(example_cache_manager.cache_key, cache.keys("*"))
421+
422+
def test_clear_cache_detail(self) -> None:
423+
example_object = Example(title="MojixCoder", text="Mojix Coder", number=1010)
424+
example_object.save()
425+
426+
example_obj = example_cache_manager.get(
427+
unique_identifier=example_object.pk, filter_kwargs={"pk": example_object.pk}
428+
)
429+
430+
cache_key = example_cache_manager.get_detail_cache_key(example_object.pk)
431+
432+
self.assertIn(cache_key, cache.keys("*"))
433+
434+
@clear_cache_detail(manager=example_cache_manager)
435+
def update_example_object() -> Example:
436+
example_object.title = "I am updated"
437+
example_object.save()
438+
return example_object
439+
440+
update_example_object()
441+
442+
self.assertNotIn(cache_key, cache.keys("*"))

0 commit comments

Comments
 (0)