From 2bb77d9bf81aa9de84d259309c2b452fcbb84552 Mon Sep 17 00:00:00 2001 From: Tim Rogers Date: Sun, 11 Aug 2024 13:01:48 -0500 Subject: [PATCH 1/2] Updated search view to trim leading and trailing whitespace for author, book, and list query values --- bookwyrm/views/search.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/bookwyrm/views/search.py b/bookwyrm/views/search.py index 13695a7d4..95845db64 100644 --- a/bookwyrm/views/search.py +++ b/bookwyrm/views/search.py @@ -53,7 +53,7 @@ class Search(View): def api_book_search(request): """Return books via API response""" - query = request.GET.get("q") + query = request.GET.get("q").strip() query = isbn_check_and_format(query) min_confidence = request.GET.get("min_confidence", 0) # only return local book results via json so we don't cascade @@ -65,7 +65,7 @@ def api_book_search(request): def book_search(request): """the real business is elsewhere""" - query = request.GET.get("q") + query = request.GET.get("q").strip() # check if query is isbn query = isbn_check_and_format(query) min_confidence = request.GET.get("min_confidence", 0) @@ -123,8 +123,7 @@ def author_search(request): def user_search(request): """user search: search for a user""" viewer = request.user - query = request.GET.get("q") - query = query.strip() + query = request.GET.get("q").strip() data = {"type": "user", "query": query} # use webfinger for mastodon style account@domain.com username to load the user if @@ -162,7 +161,7 @@ def user_search(request): def list_search(request): """any relevent lists?""" - query = request.GET.get("q") + query = request.GET.get("q").strip() data = {"query": query, "type": "list"} results = ( models.List.privacy_filter( From f68e33ffc6b10488823fa06cd6d41a3c9aa46fd2 Mon Sep 17 00:00:00 2001 From: Tim Rogers Date: Sun, 11 Aug 2024 14:02:24 -0500 Subject: [PATCH 2/2] Added additional test cases for searches with leading and trailing whitespace --- bookwyrm/tests/views/test_search.py | 43 +++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/bookwyrm/tests/views/test_search.py b/bookwyrm/tests/views/test_search.py index 6c7e41cf3..3b3e78e17 100644 --- a/bookwyrm/tests/views/test_search.py +++ b/bookwyrm/tests/views/test_search.py @@ -103,6 +103,20 @@ class Views(TestCase): connector_results = response.context_data["remote_results"] self.assertEqual(connector_results[0]["results"][0].title, "Mock Book") + def test_search_books_extra_whitespace(self): + """just the search page""" + view = views.Search.as_view() + request = self.factory.get("", {"q": " Test Book ", "remote": False}) + request.user = self.local_user + with patch("bookwyrm.views.search.is_api_request") as is_api: + is_api.return_value = False + response = view(request) + self.assertIsInstance(response, TemplateResponse) + validate_html(response.render()) + + local_results = response.context_data["results"] + self.assertEqual(local_results[0].title, "Test Book") + def test_search_book_anonymous(self): """Don't search remote for logged out user""" view = views.Search.as_view() @@ -150,6 +164,17 @@ class Views(TestCase): validate_html(response.render()) self.assertEqual(response.context_data["results"][0], self.local_user) + def test_search_users_extra_whitespace(self): + """searches remote connectors""" + view = views.Search.as_view() + request = self.factory.get("", {"q": " mouse ", "type": "user"}) + request.user = self.local_user + response = view(request) + + self.assertIsInstance(response, TemplateResponse) + validate_html(response.render()) + self.assertEqual(response.context_data["results"][0], self.local_user) + def test_search_users_logged_out(self): """searches remote connectors""" view = views.Search.as_view() @@ -181,3 +206,21 @@ class Views(TestCase): self.assertIsInstance(response, TemplateResponse) validate_html(response.render()) self.assertEqual(response.context_data["results"][0], booklist) + + def test_search_lists_extra_whitespace(self): + """searches remote connectors""" + with ( + patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"), + patch("bookwyrm.lists_stream.remove_list_task.delay"), + ): + booklist = models.List.objects.create( + user=self.local_user, name="test list" + ) + view = views.Search.as_view() + request = self.factory.get("", {"q": " test ", "type": "list"}) + request.user = self.local_user + response = view(request) + + self.assertIsInstance(response, TemplateResponse) + validate_html(response.render()) + self.assertEqual(response.context_data["results"][0], booklist)