Commit c125d858 by Robert Raposa

Order skus for increased cache hits.

LEARNER-4943
parent 2da3cdb4
...@@ -563,6 +563,9 @@ class BasketCalculateViewTests(ProgramTestMixin, TestCase): ...@@ -563,6 +563,9 @@ class BasketCalculateViewTests(ProgramTestMixin, TestCase):
"""Verify a request made with the is_anonymous parameter is cached""" """Verify a request made with the is_anonymous parameter is cached"""
url_with_one_sku = self._generate_sku_url(self.products, number_of_products=1, username=None) url_with_one_sku = self._generate_sku_url(self.products, number_of_products=1, username=None)
url_with_two_skus = self._generate_sku_url(self.products, number_of_products=2, username=None) url_with_two_skus = self._generate_sku_url(self.products, number_of_products=2, username=None)
url_with_two_skus_reversed = self._generate_sku_url(
self.products, number_of_products=2, username=None, reverse_skus=True
)
expected = {'Test Succeeded': True} expected = {'Test Succeeded': True}
mock_calculate_basket.return_value = expected mock_calculate_basket.return_value = expected
...@@ -599,6 +602,14 @@ class BasketCalculateViewTests(ProgramTestMixin, TestCase): ...@@ -599,6 +602,14 @@ class BasketCalculateViewTests(ProgramTestMixin, TestCase):
self.assertTrue(mock_calculate_basket.called, msg='The cache should be missed.') self.assertTrue(mock_calculate_basket.called, msg='The cache should be missed.')
self.assertEqual(response.data, expected) self.assertEqual(response.data, expected)
mock_calculate_basket.reset_mock()
# Check that this new set of skus hits cache, even when reversed
response = self.client.get(url_with_two_skus_reversed)
self.assertEqual(response.status_code, 200)
self.assertFalse(mock_calculate_basket.called, msg='The cache should be hit.')
self.assertEqual(response.data, expected)
# Check that cache works and that log message is sent for Marketing user # Check that cache works and that log message is sent for Marketing user
# Note: This and the following checks related to it should be removed once we remove # Note: This and the following checks related to it should be removed once we remove
# reliance on the Marketing user for caching. # reliance on the Marketing user for caching.
...@@ -782,7 +793,7 @@ class BasketCalculateViewTests(ProgramTestMixin, TestCase): ...@@ -782,7 +793,7 @@ class BasketCalculateViewTests(ProgramTestMixin, TestCase):
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertEqual(response.data, expected) self.assertEqual(response.data, expected)
def _generate_sku_url(self, products, number_of_products=None, username=None): def _generate_sku_url(self, products, number_of_products=None, username=None, reverse_skus=False):
""" """
Generates the calculate basket view's url for the given products Generates the calculate basket view's url for the given products
...@@ -796,8 +807,11 @@ class BasketCalculateViewTests(ProgramTestMixin, TestCase): ...@@ -796,8 +807,11 @@ class BasketCalculateViewTests(ProgramTestMixin, TestCase):
""" """
if not number_of_products: if not number_of_products:
number_of_products = len(products) number_of_products = len(products)
sku_list = [product.stockrecords.first().partner_sku for product in products[:number_of_products]]
if reverse_skus:
sku_list = list(reversed(sku_list))
qs = urllib.urlencode( qs = urllib.urlencode(
{'sku': [product.stockrecords.first().partner_sku for product in products[:number_of_products]]}, {'sku': sku_list},
True True
) )
url = '{root}?{qs}'.format(root=self.path, qs=qs) url = '{root}?{qs}'.format(root=self.path, qs=qs)
......
...@@ -406,6 +406,7 @@ class BasketCalculateView(generics.GenericAPIView): ...@@ -406,6 +406,7 @@ class BasketCalculateView(generics.GenericAPIView):
skus = request.GET.getlist('sku') skus = request.GET.getlist('sku')
if not skus: if not skus:
return HttpResponseBadRequest(_('No SKUs provided.')) return HttpResponseBadRequest(_('No SKUs provided.'))
skus.sort()
code = request.GET.get('code', None) code = request.GET.get('code', None)
try: try:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment