diff --git a/tools/comms/twitter/client.py b/tools/comms/twitter/client.py index bde685107..7be59ae96 100644 --- a/tools/comms/twitter/client.py +++ b/tools/comms/twitter/client.py @@ -373,7 +373,11 @@ def get_user_posts( return None, [], None params = {**self._tweet_params(), "exclude": "retweets"} tweets, meta, includes = self._paged( - f"/users/{user['user_id']}/tweets", "data", limit, params + f"/users/{user['user_id']}/tweets", + "data", + limit, + params, + min_page_size=5, ) return user, [self._normalize_tweet(tweet, includes) for tweet in tweets], meta diff --git a/tools/comms/twitter/test_client.py b/tools/comms/twitter/test_client.py index eb06d035e..24e07cd02 100644 --- a/tools/comms/twitter/test_client.py +++ b/tools/comms/twitter/test_client.py @@ -112,10 +112,36 @@ def test_timeline_uses_specific_user_posts_endpoint() -> None: assert tweets[0]["screen_name"] == "ada" assert client.requests[0][0] == "/users/by/username/ada" assert client.requests[1][0] == "/users/10/tweets" - assert client.requests[1][1]["max_results"] == 1 + assert client.requests[1][1]["max_results"] == 5 assert client.requests[1][1]["pagination_token"] is None +def test_timeline_uses_minimum_page_size_for_one_item_remainder() -> None: + first_page = [ + {"id": str(tweet_id), "author_id": "10", "text": f"post {tweet_id}"} + for tweet_id in range(1, 60) + ] + client = StubXClient( + [ + {"data": {"id": "10", "username": "ada", "name": "Ada"}}, + {"data": first_page, "meta": {"next_token": "next-page"}}, + { + "data": [{"id": "60", "author_id": "10", "text": "post 60"}], + "meta": {}, + }, + ] + ) + + _, tweets, meta = client.get_timeline("ada", limit=60) + + assert len(tweets) == 60 + assert tweets[-1]["tweet_id"] == "60" + assert meta == {"result_count": 60} + assert client.requests[1][1]["max_results"] == 60 + assert client.requests[2][1]["max_results"] == 5 + assert client.requests[2][1]["pagination_token"] == "next-page" + + def test_user_posts_keeps_authored_posts_endpoint() -> None: client = StubXClient( [