diff --git a/products/tests.py b/products/tests.py index 07fbb63..fd40f26 100644 --- a/products/tests.py +++ b/products/tests.py @@ -526,15 +526,15 @@ class ProductSearchTest(TestCase): def test_anon_user_can_filter_shipping_cost_true(self): expected_instances = [ - self.factory(tags="lunares/rojos", category='zapatos', description="zapatos verdes", shipping_cost=None), self.factory(tags="colores/rojos, tono/brillante", shipping_cost=100.00), self.factory(tags="lunares/azules", description="zapatos rojos", shipping_cost=12.00), - self.factory(tags="lunares/rojos", description="zapatos", shipping_cost=0.00), self.factory(attributes='"zapatos de campo", tono/oscuro', shipping_cost=9.00), ] unexpected_instances = [ self.factory(description="chanclas"), self.factory(tags="azules"), + self.factory(tags="lunares/rojos", category='zapatos', description="zapatos verdes", shipping_cost=None), + self.factory(tags="lunares/rojos", description="zapatos", shipping_cost=0.00), ] query_string = quote("zapatos rojos") @@ -546,19 +546,16 @@ class ProductSearchTest(TestCase): self.assertEqual(response.status_code, 200) # load response data payload = response.json() - self.assertEquals(len(payload['products']), 3) + self.assertEquals(len(payload['products']), len(expected_instances)) def test_anon_user_can_filter_shipping_cost_false(self): expected_instances = [ self.factory(tags="lunares/rojos", category='zapatos', description="zapatos verdes", shipping_cost=None), - self.factory(tags="colores/rojos, tono/brillante", shipping_cost=100.00), - self.factory(tags="lunares/azules", description="zapatos rojos", shipping_cost=12.00), self.factory(tags="lunares/rojos", description="zapatos", shipping_cost=0.00), - self.factory(attributes='"zapatos de campo", tono/oscuro', shipping_cost=9.00), ] unexpected_instances = [ - self.factory(description="chanclas"), - self.factory(tags="azules"), + self.factory(description="chanclas", shipping_cost=100.00), + self.factory(tags="azules", shipping_cost=10.00), ] query_string = quote("zapatos rojos") @@ -571,19 +568,17 @@ class ProductSearchTest(TestCase): self.assertEqual(response.status_code, 200) # load response data payload = response.json() - self.assertEquals(len(payload['products']), 2) + self.assertEquals(len(payload['products']), len(expected_instances)) def test_anon_user_can_filter_discount_true(self): expected_instances = [ - self.factory(tags="lunares/rojos", category='zapatos', description="zapatos verdes", discount=None), self.factory(tags="colores/rojos, tono/brillante", discount=100.00), self.factory(tags="lunares/azules", description="zapatos rojos", discount=12.00), - self.factory(tags="lunares/rojos", description="zapatos", discount=0.00), self.factory(attributes='"zapatos de campo", tono/oscuro', discount=9.00), ] unexpected_instances = [ - self.factory(description="chanclas"), - self.factory(tags="azules"), + self.factory(description="chanclas", discount=0.00), + self.factory(tags="lunares/rojos", category='zapatos', description="zapatos verdes", discount=None), ] query_string = quote("zapatos rojos") @@ -595,19 +590,17 @@ class ProductSearchTest(TestCase): self.assertEqual(response.status_code, 200) # load response data payload = response.json() - self.assertEquals(len(payload['products']), 3) + self.assertEquals(len(payload['products']), len(expected_instances)) def test_anon_user_can_filter_discount_false(self): expected_instances = [ self.factory(tags="lunares/rojos", category='zapatos', description="zapatos verdes", discount=None), - self.factory(tags="colores/rojos, tono/brillante", discount=100.00), - self.factory(tags="lunares/azules", description="zapatos rojos", discount=12.00), + self.factory(tags="lunares/azules", description="zapatos rojos", discount=0.00), self.factory(tags="lunares/rojos", description="zapatos", discount=0.00), - self.factory(attributes='"zapatos de campo", tono/oscuro', discount=9.00), ] unexpected_instances = [ - self.factory(description="chanclas"), - self.factory(tags="azules"), + self.factory(description="chanclas", discount=100.00), + self.factory(tags="azules", discount=9.00), ] query_string = quote("zapatos rojos") @@ -619,7 +612,7 @@ class ProductSearchTest(TestCase): self.assertEqual(response.status_code, 200) # load response data payload = response.json() - self.assertEquals(len(payload['products']), 2) + self.assertEquals(len(payload['products']), len(expected_instances)) def test_anon_user_can_search_empty_string(self): expected_instances = [ @@ -628,8 +621,6 @@ class ProductSearchTest(TestCase): self.factory(tags="lunares/azules", description="zapatos rojos", discount=12.00), self.factory(tags="lunares/rojos", description="zapatos", discount=0.00), self.factory(attributes='"zapatos de campo", tono/oscuro', discount=9.00), - ] - unexpected_instances = [ self.factory(description="chanclas"), self.factory(tags="azules"), ] @@ -643,7 +634,29 @@ class ProductSearchTest(TestCase): self.assertEqual(response.status_code, 200) # load response data payload = response.json() - self.assertEquals(len(payload['products']), len(expected_instances) + len(unexpected_instances)) + self.assertEquals(len(payload['products']), len(expected_instances)) + + def test_anon_user_can_filter_by_category(self): + expected_instances = [ + self.factory(tags="lunares/rojos", category='ropa', description="zapatos verdes", discount=None), + self.factory(tags="lunares/rojos", category="ropa", discount=0.00), + self.factory(attributes='"zapatos de campo", tono/oscuro', category="ropa", discount=9.00), + ] + unexpected_instances = [ + self.factory(description="chanclas", tags='rojos'), + self.factory(tags="zapatos/azules", category="deporte", description='rojos', discount=12.00), + ] + + query_string = quote("zapatos rojos") + # discount=true + url = f"{self.endpoint}?query_string={query_string}&category=ropa" + # send in request + response = self.client.get(url) + # check response + self.assertEqual(response.status_code, 200) + # load response data + payload = response.json() + self.assertEquals(len(payload['products']), len(expected_instances)) class MyProductsViewTest(APITestCase): diff --git a/products/utils.py b/products/utils.py index 3511021..0cfc28c 100644 --- a/products/utils.py +++ b/products/utils.py @@ -125,7 +125,7 @@ def find_related_products_v3(keyword): return set(products_qs) -def find_related_products_v6(keyword, shipping_cost=None, discount=None): +def find_related_products_v6(keyword, shipping_cost=None, discount=None, category=None): """ Ranked product search @@ -143,6 +143,10 @@ def find_related_products_v6(keyword, shipping_cost=None, discount=None): rank=SearchRank(vector, query) ).filter(rank__gt=0.05) # removed order_by because its lost in casting + # filter by category + if category is not None: + products_qs = products_qs.filter(category=category) + # filter for shipping cost if shipping_cost is True: # only instances with shipping costs diff --git a/products/views.py b/products/views.py index 262070a..96d34bd 100644 --- a/products/views.py +++ b/products/views.py @@ -152,6 +152,7 @@ def product_search(request): - offset: where to start counting results [OPTIONAL] - shipping_cost: true/false """ + # capture query params query_string = request.GET.get('query_string', None) limit = request.GET.get('limit', None) offset = request.GET.get('offset', None) @@ -171,6 +172,7 @@ def product_search(request): discount = False else: discount = None + category = request.GET.get('category', None) if query_string is None: return Response({"errors": {"details": "No query string to parse"}}) @@ -187,7 +189,7 @@ def product_search(request): # split query string into single words chunks = query_string.split(' ') for chunk in chunks: - product_set = find_related_products_v6(chunk, shipping_cost, discount) + product_set = find_related_products_v6(chunk, shipping_cost, discount, category) # add to result set result_set.update(product_set) # TODO: add search for entire phrase ???