From 977f04052526bfe625c602dfefebfc966a3b4e03 Mon Sep 17 00:00:00 2001 From: "Hassan D. M. Sambo" Date: Fri, 7 Feb 2025 07:14:12 -0500 Subject: [PATCH 1/2] #4637 Updated logic to prevent error 500 --- backend/dissemination/test_views.py | 68 +++++++++++++++++++++++++++++ backend/dissemination/views.py | 4 +- 2 files changed, 70 insertions(+), 2 deletions(-) diff --git a/backend/dissemination/test_views.py b/backend/dissemination/test_views.py index f537e66d43..4b06d6e0e5 100644 --- a/backend/dissemination/test_views.py +++ b/backend/dissemination/test_views.py @@ -927,3 +927,71 @@ def test_many_results_returns_file(self, mock_prepare_workbook_for_download): ) self.assertEqual(response.content, b"fake file content") + + +class PageHandlingTests(TestCase): + """Test cases for ensuring page handling logic in AdvancedSearch and Search views""" + + def setUp(self): + """Set up test client and sample form data""" + self.client = Client() + self.advanced_search_url = reverse("dissemination:AdvancedSearch") + self.basic_search_url = reverse("dissemination:Search") + + self.valid_post_data = { + "audit_year": ["2023"], + "limit": "10", + "order_by": "name", + "order_direction": "asc", + "page": "1", + } + + @patch("dissemination.views.run_search") + def test_advanced_search_post_page_too_high(self, mock_run_search): + """Ensure page resets to 1 when the requested page is greater than available pages""" + mock_run_search.return_value.count.return_value = ( + 5 # Mock result count (only 1 page available) + ) + + invalid_data = self.valid_post_data.copy() + invalid_data["page"] = "100" # Too high + + response = self.client.post(self.advanced_search_url, invalid_data) + self.assertEqual(response.status_code, 200) + self.assertEqual(response.context["page"], 1) # Should reset to 1 + + @patch("dissemination.views.run_search") + def test_advanced_search_post_page_zero(self, mock_run_search): + """Ensure page resets to 1 when the requested page is zero""" + mock_run_search.return_value.count.return_value = 5 + + invalid_data = self.valid_post_data.copy() + invalid_data["page"] = "0" + + response = self.client.post(self.advanced_search_url, invalid_data) + self.assertEqual(response.status_code, 200) + self.assertEqual(response.context["page"], 1) # Should reset to 1 + + @patch("dissemination.views.run_search") + def test_advanced_search_post_page_empty(self, mock_run_search): + """Ensure page defaults to 1 when no page is provided""" + mock_run_search.return_value.count.return_value = 5 + + invalid_data = self.valid_post_data.copy() + invalid_data["page"] = "" + + response = self.client.post(self.advanced_search_url, invalid_data) + self.assertEqual(response.status_code, 200) + self.assertEqual(response.context["page"], 1) # Should default to 1 + + @patch("dissemination.views.run_search") + def test_advanced_search_post_valid_page(self, mock_run_search): + """Ensure valid page number remains unchanged""" + mock_run_search.return_value.count.return_value = 20 # Multiple pages exist + + valid_data = self.valid_post_data.copy() + valid_data["page"] = "2" # Valid page + + response = self.client.post(self.advanced_search_url, valid_data) + self.assertEqual(response.status_code, 200) + self.assertEqual(response.context["page"], 2) # Should remain 2 diff --git a/backend/dissemination/views.py b/backend/dissemination/views.py index 5049a6bbaa..b5cf58dd7a 100644 --- a/backend/dissemination/views.py +++ b/backend/dissemination/views.py @@ -214,7 +214,7 @@ def post(self, request, *args, **kwargs): # Reset page to one if the page number surpasses how many pages there actually are page = form_data["page"] ceiling = math.ceil(results_count / form_data["limit"]) - if page > ceiling: + if page > ceiling or page < 1 or not page: page = 1 logger.info(f"TOTAL: results_count: [{results_count}]") @@ -321,7 +321,7 @@ def post(self, request, *args, **kwargs): # Reset page to one if the page number surpasses how many pages there actually are page = form_data["page"] ceiling = math.ceil(results_count / form_data["limit"]) - if page > ceiling: + if page > ceiling or page < 1 or not page: page = 1 logger.info(f"TOTAL: results_count: [{results_count}]") From f47c1b04d5ded251a8a94d32878be413d8e5f63d Mon Sep 17 00:00:00 2001 From: "Hassan D. M. Sambo" Date: Fri, 7 Feb 2025 11:29:48 -0500 Subject: [PATCH 2/2] Code improvement --- backend/dissemination/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/dissemination/views.py b/backend/dissemination/views.py index b5cf58dd7a..359ec7903f 100644 --- a/backend/dissemination/views.py +++ b/backend/dissemination/views.py @@ -214,7 +214,7 @@ def post(self, request, *args, **kwargs): # Reset page to one if the page number surpasses how many pages there actually are page = form_data["page"] ceiling = math.ceil(results_count / form_data["limit"]) - if page > ceiling or page < 1 or not page: + if not page or page > ceiling or page < 1: page = 1 logger.info(f"TOTAL: results_count: [{results_count}]") @@ -321,7 +321,7 @@ def post(self, request, *args, **kwargs): # Reset page to one if the page number surpasses how many pages there actually are page = form_data["page"] ceiling = math.ceil(results_count / form_data["limit"]) - if page > ceiling or page < 1 or not page: + if not page or page > ceiling or page < 1: page = 1 logger.info(f"TOTAL: results_count: [{results_count}]")