review: fix selftext key path + break on RedditRateLimitError

This commit is contained in:
Trevin Chow
2026-05-16 23:37:00 -07:00
parent 791c0a57a0
commit e2d9d705f6
2 changed files with 53 additions and 1 deletions
+7 -1
View File
@@ -260,6 +260,7 @@ def _enrich_reddit_items(items: list[dict]) -> list[dict]:
get Reddit content via web-search URLs. get Reddit content via web-search URLs.
""" """
from . import reddit_enrich from . import reddit_enrich
from .reddit_enrich import RedditRateLimitError
for item in items: for item in items:
url = item.get("url", "") url = item.get("url", "")
@@ -270,7 +271,8 @@ def _enrich_reddit_items(items: list[dict]) -> list[dict]:
if not thread_data: if not thread_data:
continue continue
parsed = reddit_enrich.parse_thread_data(thread_data) parsed = reddit_enrich.parse_thread_data(thread_data)
selftext = parsed.get("selftext", "") # selftext lives under parsed["submission"], not at the top level
selftext = (parsed.get("submission") or {}).get("selftext", "")
if selftext: if selftext:
item["snippet"] = selftext[:2000] item["snippet"] = selftext[:2000]
comments = parsed.get("comments", []) comments = parsed.get("comments", [])
@@ -281,6 +283,10 @@ def _enrich_reddit_items(items: list[dict]) -> list[dict]:
for c in top[:5] for c in top[:5]
] ]
item["enriched_via"] = "reddit_json_api" item["enriched_via"] = "reddit_json_api"
except RedditRateLimitError as exc:
# Stop iterating to avoid flooding more 429s
sys.stderr.write(f"[Web] Reddit rate-limited, halting enrichment: {exc}\n")
break
except Exception as exc: except Exception as exc:
sys.stderr.write(f"[Web] Reddit enrichment failed for {url}: {exc}\n") sys.stderr.write(f"[Web] Reddit enrichment failed for {url}: {exc}\n")
return items return items
+46
View File
@@ -227,5 +227,51 @@ class RedditEnrichmentGateTests(unittest.TestCase):
enrich_mock.assert_called_once() enrich_mock.assert_called_once()
class RedditEnrichItemsTests(unittest.TestCase):
"""Direct tests for `_enrich_reddit_items` covering the selftext key path
and the RedditRateLimitError early-exit behavior.
"""
def test_selftext_under_submission_populates_snippet(self):
from lib import reddit_enrich
item = {
"url": "https://www.reddit.com/r/python/comments/abc/title/",
"snippet": "original",
}
parsed = {
"submission": {"selftext": "thread body content"},
"comments": [],
}
with patch.object(reddit_enrich, "fetch_thread_data", return_value={"raw": True}), \
patch.object(reddit_enrich, "parse_thread_data", return_value=parsed):
result = grounding._enrich_reddit_items([item])
self.assertEqual("thread body content", result[0]["snippet"])
self.assertEqual("reddit_json_api", result[0]["enriched_via"])
def test_rate_limit_error_halts_iteration(self):
from lib import reddit_enrich
item1 = {"url": "https://www.reddit.com/r/python/comments/aaa/x/"}
item2 = {"url": "https://www.reddit.com/r/python/comments/bbb/y/"}
def fake_fetch(url, *args, **kwargs):
raise reddit_enrich.RedditRateLimitError(f"429 for {url}")
captured_stderr: list[str] = []
with patch.object(reddit_enrich, "fetch_thread_data", side_effect=fake_fetch) as fetch_mock, \
patch("lib.grounding.sys.stderr.write", side_effect=lambda s: captured_stderr.append(s)):
grounding._enrich_reddit_items([item1, item2])
# Only the first item should have triggered a fetch attempt
self.assertEqual(1, fetch_mock.call_count)
# A stderr message about the rate-limit halt should have been emitted
self.assertTrue(
any("rate-limited" in msg.lower() or "rate limited" in msg.lower() for msg in captured_stderr),
msg=f"Expected a rate-limit stderr message, got: {captured_stderr!r}",
)
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() unittest.main()