diff --git a/scripts/lib/bird_x.py b/scripts/lib/bird_x.py index 9ab906d..efd0a0b 100644 --- a/scripts/lib/bird_x.py +++ b/scripts/lib/bird_x.py @@ -460,7 +460,7 @@ def parse_bird_response(response: Dict[str, Any], query: str = "") -> List[Dict[ "url": url, "author_handle": author_handle.lstrip("@"), "date": date, - "engagement": engagement, + "engagement": engagement if any(v is not None for v in engagement.values()) else None, "why_relevant": "", # Bird doesn't provide relevance explanations "relevance": _compute_relevance(query, str(tweet.get("text", ""))) if query else 0.7, } diff --git a/tests/test_bird_x.py b/tests/test_bird_x.py index f85708c..c436908 100644 --- a/tests/test_bird_x.py +++ b/tests/test_bird_x.py @@ -175,7 +175,7 @@ class TestVendoredBirdRuntime(unittest.TestCase): } ] items = parse_bird_response(tweets, "test query") - self.assertIsNone(items[0]["engagement"]["likes"]) + self.assertIsNone(items[0]["engagement"]) def test_fallback_to_second_key(self): tweets = [ @@ -203,6 +203,32 @@ class TestVendoredBirdRuntime(unittest.TestCase): items = parse_bird_response(tweets, "test query") self.assertEqual(0, items[0]["engagement"]["likes"]) + def test_engagement_none_when_all_fields_missing(self): + """All-None engagement dict should become None, not propagate.""" + tweets = [ + { + "id": "1", + "text": "test", + "permanent_url": "https://x.com/u/status/1", + } + ] + items = parse_bird_response(tweets, "test query") + self.assertIsNone(items[0]["engagement"]) + + def test_engagement_preserved_when_any_field_present(self): + """Engagement dict kept when at least one metric exists.""" + tweets = [ + { + "id": "1", + "text": "test", + "permanent_url": "https://x.com/u/status/1", + "likeCount": 5, + } + ] + items = parse_bird_response(tweets, "test query") + self.assertIsNotNone(items[0]["engagement"]) + self.assertEqual(5, items[0]["engagement"]["likes"]) + if __name__ == "__main__": unittest.main()