feat(cache): add targeted server-side response caching
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
from decimal import Decimal
|
||||
|
||||
from django.core.cache import cache
|
||||
from django.test import TestCase
|
||||
from rest_framework.test import APITestCase
|
||||
|
||||
@@ -53,6 +54,9 @@ class WorkspaceRateTests(APITestCase):
|
||||
symbol="EUR",
|
||||
)
|
||||
|
||||
def setUp(self):
|
||||
cache.clear()
|
||||
|
||||
def test_resolve_rate_uses_workspace_user_rate(self):
|
||||
WorkspaceUserRate.objects.create(
|
||||
workspace=self.workspace,
|
||||
@@ -122,6 +126,72 @@ class WorkspaceRateTests(APITestCase):
|
||||
|
||||
self.assertEqual(response.status_code, 403)
|
||||
|
||||
def test_workspace_user_rates_cache_invalidates_after_rate_save(self):
|
||||
rate = WorkspaceUserRate.objects.create(
|
||||
workspace=self.workspace,
|
||||
user=self.member,
|
||||
hourly_rate=Decimal("30.00"),
|
||||
currency="USD",
|
||||
effective_from=self.workspace.created_at,
|
||||
is_active=True,
|
||||
)
|
||||
self.client.force_authenticate(user=self.admin)
|
||||
|
||||
first_response = self.client.get(
|
||||
"/api/workspace-user-rates/",
|
||||
{"workspace": str(self.workspace.id)},
|
||||
)
|
||||
self.assertEqual(first_response.status_code, 200)
|
||||
self.assertEqual(first_response.data["items"][0]["hourly_rate"], "30.00")
|
||||
|
||||
WorkspaceUserRate.objects.filter(id=rate.id).update(hourly_rate=Decimal("45.00"))
|
||||
|
||||
cached_response = self.client.get(
|
||||
"/api/workspace-user-rates/",
|
||||
{"workspace": str(self.workspace.id)},
|
||||
)
|
||||
self.assertEqual(cached_response.status_code, 200)
|
||||
self.assertEqual(cached_response.data["items"][0]["hourly_rate"], "30.00")
|
||||
|
||||
rate.refresh_from_db()
|
||||
rate.currency = "EUR"
|
||||
rate.save(update_fields=["currency"])
|
||||
|
||||
fresh_response = self.client.get(
|
||||
"/api/workspace-user-rates/",
|
||||
{"workspace": str(self.workspace.id)},
|
||||
)
|
||||
self.assertEqual(fresh_response.status_code, 200)
|
||||
self.assertEqual(fresh_response.data["items"][0]["hourly_rate"], "45.00")
|
||||
self.assertEqual(fresh_response.data["items"][0]["currency"], "EUR")
|
||||
|
||||
def test_price_unit_cache_invalidates_after_price_unit_create(self):
|
||||
self.client.force_authenticate(user=self.owner)
|
||||
|
||||
first_response = self.client.get("/api/price-units/")
|
||||
self.assertEqual(first_response.status_code, 200)
|
||||
self.assertEqual(first_response.data[0]["name"], "Euro")
|
||||
self.assertEqual(len(first_response.data), 2)
|
||||
|
||||
PriceUnit.objects.filter(code="EUR").update(name="Updated Euro")
|
||||
|
||||
cached_response = self.client.get("/api/price-units/")
|
||||
self.assertEqual(cached_response.status_code, 200)
|
||||
self.assertEqual(cached_response.data[0]["name"], "Euro")
|
||||
|
||||
PriceUnit.objects.create(
|
||||
code="GBP",
|
||||
name="British Pound",
|
||||
local_name="Pound",
|
||||
symbol="£",
|
||||
)
|
||||
|
||||
fresh_response = self.client.get("/api/price-units/")
|
||||
self.assertEqual(fresh_response.status_code, 200)
|
||||
self.assertEqual(len(fresh_response.data), 3)
|
||||
euro_row = next(item for item in fresh_response.data if item["code"] == "EUR")
|
||||
self.assertEqual(euro_row["name"], "Updated Euro")
|
||||
|
||||
|
||||
class WorkspaceRateServiceTests(TestCase):
|
||||
@classmethod
|
||||
|
||||
Reference in New Issue
Block a user