feat(cache): add targeted server-side response caching
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
from types import SimpleNamespace
|
||||
|
||||
from django.core.cache import cache
|
||||
from django.test import TestCase
|
||||
from rest_framework.test import APITestCase
|
||||
|
||||
from apps.users.models import User
|
||||
from apps.workspaces.api.permissions import (
|
||||
@@ -144,3 +146,46 @@ class WorkspacePermissionTests(TestCase):
|
||||
object(),
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
class WorkspaceMembershipCacheTests(APITestCase):
|
||||
@classmethod
|
||||
def setUpTestData(cls):
|
||||
cls.owner = User.objects.create_user(mobile="09127770031", password="secret123")
|
||||
cls.member = User.objects.create_user(mobile="09127770032", password="secret123")
|
||||
cls.workspace = Workspace.objects.create(name="Membership Cache", owner=cls.owner)
|
||||
cls.membership = WorkspaceMembership.objects.create(
|
||||
workspace=cls.workspace,
|
||||
user=cls.member,
|
||||
role=WorkspaceMembership.Role.MEMBER,
|
||||
is_active=True,
|
||||
)
|
||||
|
||||
def setUp(self):
|
||||
cache.clear()
|
||||
self.client.force_authenticate(user=self.owner)
|
||||
|
||||
def test_membership_list_cache_invalidates_after_membership_save(self):
|
||||
params = {"workspace": str(self.workspace.id)}
|
||||
|
||||
first_response = self.client.get("/api/workspace-memberships/", params)
|
||||
self.assertEqual(first_response.status_code, 200)
|
||||
target = next(item for item in first_response.data["items"] if item["id"] == str(self.membership.id))
|
||||
self.assertEqual(target["role"], WorkspaceMembership.Role.MEMBER)
|
||||
|
||||
WorkspaceMembership.objects.filter(id=self.membership.id).update(role=WorkspaceMembership.Role.GUEST)
|
||||
|
||||
cached_response = self.client.get("/api/workspace-memberships/", params)
|
||||
self.assertEqual(cached_response.status_code, 200)
|
||||
target = next(item for item in cached_response.data["items"] if item["id"] == str(self.membership.id))
|
||||
self.assertEqual(target["role"], WorkspaceMembership.Role.MEMBER)
|
||||
|
||||
self.membership.refresh_from_db()
|
||||
self.membership.is_active = False
|
||||
self.membership.save(update_fields=["is_active"])
|
||||
|
||||
fresh_response = self.client.get("/api/workspace-memberships/", params)
|
||||
self.assertEqual(fresh_response.status_code, 200)
|
||||
target = next(item for item in fresh_response.data["items"] if item["id"] == str(self.membership.id))
|
||||
self.assertEqual(target["role"], WorkspaceMembership.Role.GUEST)
|
||||
self.assertFalse(target["is_active"])
|
||||
|
||||
Reference in New Issue
Block a user