diff --git a/src/research_handler.py b/src/research_handler.py index aed9cb6..ce7d6de 100644 --- a/src/research_handler.py +++ b/src/research_handler.py @@ -479,6 +479,8 @@ class ResearchHandler: try: items = [] for f in findings: + if not isinstance(f, dict): + continue url = f.get("url", "") title = f.get("title", "") or "Untitled" summary = f.get("summary", "") diff --git a/tests/test_research_handler_raw_nondict.py b/tests/test_research_handler_raw_nondict.py new file mode 100644 index 0000000..69f5f87 --- /dev/null +++ b/tests/test_research_handler_raw_nondict.py @@ -0,0 +1,14 @@ +from src.research_handler import ResearchHandler + + +def test_extract_raw_findings_skips_non_dict_without_losing_all(): + # The body is wrapped in a try/except that returns [] on any error, so a + # single non-dict finding made the AttributeError from f.get swallow EVERY + # good finding (silent total data loss), not just the bad row. + findings = [ + {"url": "https://a.com", "summary": "a real and useful finding here"}, + "junk-row", + {"url": "https://b.com", "summary": "another genuine finding with detail"}, + ] + out = ResearchHandler._extract_raw_findings(findings) + assert [i["url"] for i in out] == ["https://a.com", "https://b.com"]