From 0c37943267c3e187efae0ae7ceb27629208b0991 Mon Sep 17 00:00:00 2001 From: Afonso Coutinho Date: Wed, 3 Jun 2026 05:30:19 +0100 Subject: [PATCH] fix: search service crashes on a non-dict result row (#1725) --- services/search/service.py | 2 ++ tests/test_search_service_nondict_rows.py | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 tests/test_search_service_nondict_rows.py diff --git a/services/search/service.py b/services/search/service.py index dcb662d..dab6ab6 100644 --- a/services/search/service.py +++ b/services/search/service.py @@ -73,6 +73,8 @@ class SearchService: results = [] for r in raw_results: + if not isinstance(r, dict): + continue results.append(SearchResult( url=r.get("url", ""), title=r.get("title", ""), diff --git a/tests/test_search_service_nondict_rows.py b/tests/test_search_service_nondict_rows.py new file mode 100644 index 0000000..1e1b179 --- /dev/null +++ b/tests/test_search_service_nondict_rows.py @@ -0,0 +1,23 @@ +import asyncio + +import services.search.service as svc_mod +from services.search.service import SearchService + + +def test_search_skips_non_dict_results(monkeypatch): + # comprehensive_web_search aggregates external provider + cache results; + # a malformed row (string/None) made the old loop call r.get and crash, + # losing the whole search. + async def fake_search(query, max_results=10, fetch_content=False): + return [ + {"url": "https://a.com", "title": "A", "snippet": "x"}, + "junk-row", + None, + {"url": "https://b.com", "title": "B", "snippet": "y"}, + ] + + monkeypatch.setattr(svc_mod, "comprehensive_web_search", fake_search) + svc = SearchService() + res = asyncio.run(svc.search("anything")) + assert [r.url for r in res.results] == ["https://a.com", "https://b.com"] + assert res.total == 2