update tests for better coverage · pythonforysrc/python-twitter@49c265d · GitHub
Skip to content

Commit 49c265d

Browse files
committed
update tests for better coverage
1 parent 409a733 commit 49c265d

8 files changed

Lines changed: 141 additions & 68 deletions

File tree

testdata/get_retweets_of_me.json

Lines changed: 1 addition & 1 deletion

testdata/post_retweet.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"retweeted_status": {"source": "<a href=\"http://twitter.com/download/android\" rel=\"nofollow\">Twitter for Android</a>", "entities": {"hashtags": [], "symbols": [], "user_mentions": [], "urls": [{"indices": [117, 140], "expanded_url": "https://twitter.com/i/web/status/967413349473574913", "url": "https://t.co/PXKlDqrtUL", "display_url": "twitter.com/i/web/status/9\u2026"}]}, "in_reply_to_user_id_str": null, "lang": "en", "in_reply_to_status_id": null, "favorite_count": 1375, "text": "Honestly ppl shouldn't be saying anything about \"peaceful protest\" to leverage respectability politics because Stan\u2026 https://t.co/PXKlDqrtUL", "retweet_count": 678, "is_quote_status": false, "geo": null, "in_reply_to_user_id": null, "contributors": null, "id": 967413349473574913, "truncated": true, "in_reply_to_screen_name": null, "place": null, "user": {"profile_sidebar_border_color": "000000", "friends_count": 4745, "utc_offset": -25200, "notifications": false, "profile_background_color": "131516", "listed_count": 314, "time_zone": "Mountain Time (US & Canada)", "profile_background_tile": true, "name": "Dani", "entities": {"description": {"urls": [{"indices": [34, 57], "expanded_url": "http://NeverDeadNative.com", "url": "https://t.co/vVRmSfZLna", "display_url": "NeverDeadNative.com"}, {"indices": [128, 151], "expanded_url": "http://paypal.me/xodanix3", "url": "https://t.co/TtDWo5Y9Y2", "display_url": "paypal.me/xodanix3"}]}, "url": {"urls": [{"indices": [0, 23], "expanded_url": "https://www.patreon.com/Izanzanwin", "url": "https://t.co/nKRX7u0GVy", "display_url": "patreon.com/Izanzanwin"}]}}, "description": "Writer. Free Agent. Co-founder of https://t.co/vVRmSfZLna Urban Ndn (Dakota ka Wasicu), 28, UND alum. INTJ,Mother of twin boys. https://t.co/TtDWo5Y9Y2", "lang": "en", "favourites_count": 75004, "verified": false, "protected": false, "statuses_count": 179418, "profile_banner_url": "https://pbs.twimg.com/profile_banners/31653264/1496501092", "created_at": "Thu Apr 16 05:04:52 +0000 2009", "screen_name": "xodanix3", "profile_link_color": "080808", "has_extended_profile": false, "profile_background_image_url": "http://pbs.twimg.com/profile_background_images/673801111/03b3d720c6fed3d511f55bb7b18b6eae.jpeg", "geo_enabled": false, "profile_sidebar_fill_color": "EFEFEF", "id": 31653264, "is_translation_enabled": false, "profile_background_image_url_https": "https://pbs.twimg.com/profile_background_images/673801111/03b3d720c6fed3d511f55bb7b18b6eae.jpeg", "following": false, "url": "https://t.co/nKRX7u0GVy", "default_profile_image": false, "id_str": "31653264", "profile_use_background_image": true, "default_profile": false, "translator_type": "none", "is_translator": false, "location": "St Paul, MN", "profile_image_url": "http://pbs.twimg.com/profile_images/963498583797399553/5xLyN-P3_normal.jpg", "contributors_enabled": false, "followers_count": 16972, "profile_text_color": "333333", "follow_request_sent": false, "profile_image_url_https": "https://pbs.twimg.com/profile_images/963498583797399553/5xLyN-P3_normal.jpg"}, "id_str": "967413349473574913", "retweeted": true, "created_at": "Sat Feb 24 14:58:10 +0000 2018", "in_reply_to_status_id_str": null, "favorited": false, "coordinates": null}, "source": "<a href=\"http://hrhs.co.uk\" rel=\"nofollow\">psych_parse_</a>", "entities": {"hashtags": [], "symbols": [], "user_mentions": [{"id_str": "31653264", "name": "Dani", "id": 31653264, "screen_name": "xodanix3", "indices": [3, 12]}], "urls": []}, "in_reply_to_user_id_str": null, "lang": "en", "in_reply_to_status_id": null, "favorite_count": 0, "text": "RT @xodanix3: Honestly ppl shouldn't be saying anything about \"peaceful protest\" to leverage respectability politics because Standing Rock\u2026", "retweet_count": 678, "is_quote_status": false, "geo": null, "in_reply_to_user_id": null, "contributors": null, "id": 967465567773839360, "truncated": false, "in_reply_to_screen_name": null, "place": null, "user": {"profile_sidebar_border_color": "000000", "friends_count": 496, "utc_offset": -18000, "notifications": false, "profile_background_color": "FFFFFF", "listed_count": 6, "time_zone": "Eastern Time (US & Canada)", "profile_background_tile": false, "name": "Trolley Appreciator", "entities": {"description": {"urls": []}, "url": {"urls": [{"indices": [0, 23], "expanded_url": "http://iseverythingstilltheworst.com", "url": "https://t.co/wtg3XyA3vL", "display_url": "iseverythingstilltheworst.com"}]}}, "description": "these people have addresses | #botally", "lang": "en", "favourites_count": 20423, "verified": false, "protected": true, "statuses_count": 4022, "profile_banner_url": "https://pbs.twimg.com/profile_banners/372018022/1475799101", "created_at": "Sun Sep 11 23:49:28 +0000 2011", "screen_name": "__jcbl__", "profile_link_color": "EE3355", "has_extended_profile": false, "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "geo_enabled": false, "profile_sidebar_fill_color": "000000", "id": 372018022, "is_translation_enabled": false, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "following": false, "url": "https://t.co/wtg3XyA3vL", "default_profile_image": false, "id_str": "372018022", "profile_use_background_image": false, "default_profile": false, "translator_type": "none", "is_translator": false, "location": "philly", "profile_image_url": "http://pbs.twimg.com/profile_images/958783522008915969/brQwSHU7_normal.jpg", "contributors_enabled": false, "followers_count": 191, "profile_text_color": "000000", "follow_request_sent": false, "profile_image_url_https": "https://pbs.twimg.com/profile_images/958783522008915969/brQwSHU7_normal.jpg"}, "id_str": "967465567773839360", "retweeted": true, "created_at": "Sat Feb 24 18:25:40 +0000 2018", "in_reply_to_status_id_str": null, "favorited": false, "coordinates": null}

tests/test_api_30.py

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -592,7 +592,7 @@ def testGetMentions(self):
592592
resp_data = f.read()
593593
responses.add(GET, DEFAULT_URL, body=resp_data)
594594

595-
resp = self.api.GetMentions()
595+
resp = self.api.GetMentions(count=1)
596596
self.assertTrue(type(resp) is list)
597597
self.assertTrue([type(mention) is twitter.Status for mention in resp])
598598
self.assertEqual(resp[0].id, 676148312349609985)
@@ -1699,3 +1699,40 @@ def test_UploadSmallVideoUsesChunkedData(self, mocker):
16991699
assert os.path.getsize(video.name) <= 1024 * 1024
17001700
assert isinstance(resp, twitter.Status)
17011701
assert twitter.api.Api.UploadMediaChunked.called
1702+
1703+
@responses.activate
1704+
def test_post_retweet(self):
1705+
with open('testdata/post_retweet.json') as f:
1706+
resp_data = f.read()
1707+
responses.add(POST, DEFAULT_URL, body=resp_data)
1708+
resp = self.api.PostRetweet(status_id=967413349473574913, trim_user=True)
1709+
assert resp
1710+
assert resp.id == 967465567773839360
1711+
1712+
self.assertRaises(
1713+
twitter.TwitterError,
1714+
lambda: self.api.PostRetweet(status_id=0))
1715+
self.assertRaises(
1716+
twitter.TwitterError,
1717+
lambda: self.api.PostRetweet(status_id='asdf'))
1718+
1719+
@responses.activate
1720+
def test_get_retweets_of_me(self):
1721+
with open('testdata/get_retweets_of_me.json') as f:
1722+
resp_data = f.read()
1723+
responses.add(GET, DEFAULT_URL, body=resp_data)
1724+
resp = self.api.GetRetweetsOfMe(
1725+
count=1,
1726+
since_id=0,
1727+
max_id=100,
1728+
trim_user=True,
1729+
include_entities=True,
1730+
include_user_entities=True)
1731+
assert resp
1732+
1733+
self.assertRaises(
1734+
twitter.TwitterError,
1735+
lambda: self.api.GetRetweetsOfMe(count=200))
1736+
self.assertRaises(
1737+
twitter.TwitterError,
1738+
lambda: self.api.GetRetweetsOfMe(count='asdf'))

tests/test_direct_messages.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,20 +32,26 @@ def test_get_direct_messages():
3232
resp_data = f.read()
3333
responses.add(GET, DEFAULT_URL, body=resp_data)
3434

35-
resp = api.GetDirectMessages()
35+
resp = api.GetDirectMessages(count=1, page=1)
3636
direct_message = resp[0]
3737
assert isinstance(resp, list)
3838
assert isinstance(direct_message, twitter.DirectMessage)
3939
assert direct_message.id == 678629245946433539
4040

41+
try:
42+
resp = api.GetDirectMessages(count='asdf')
43+
assert 0
44+
except twitter.TwitterError as e:
45+
assert True
46+
4147

4248
@responses.activate
4349
def test_get_sent_direct_messages():
4450
with open('testdata/direct_messages/get_sent_direct_messages.json') as f:
4551
resp_data = f.read()
4652
responses.add(GET, DEFAULT_URL, body=resp_data)
4753

48-
resp = api.GetSentDirectMessages()
54+
resp = api.GetSentDirectMessages(count=1, page=1)
4955
direct_message = resp[0]
5056
assert isinstance(resp, list)
5157
assert isinstance(direct_message, twitter.DirectMessage)

tests/test_twitter_utils.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
parse_media_file
1010
)
1111

12+
from twitter import twitter_utils as utils
13+
1214

1315
class ApiTest(unittest.TestCase):
1416

@@ -90,3 +92,24 @@ def test_calc_expected_status_length_with_wide_unicode(self):
9092
status = "……"
9193
len_status = calc_expected_status_length(status)
9294
assert len_status == 4
95+
96+
def test_parse_args(self):
97+
user = twitter.User(screen_name='__jcbl__')
98+
out = utils.parse_arg_list(user, 'screen_name')
99+
assert isinstance(out, (str, unicode))
100+
assert out == '__jcbl__'
101+
102+
users = ['__jcbl__', 'notinourselves']
103+
out = utils.parse_arg_list(users, 'screen_name')
104+
assert isinstance(out, (str, unicode))
105+
assert out == '__jcbl__,notinourselves'
106+
107+
users2 = [user] + users
108+
out = utils.parse_arg_list(users2, 'screen_name')
109+
assert isinstance(out, (str, unicode))
110+
assert out == '__jcbl__,__jcbl__,notinourselves'
111+
112+
users = '__jcbl__'
113+
out = utils.parse_arg_list(users, 'screen_name')
114+
assert isinstance(out, (str, unicode))
115+
assert out == '__jcbl__'

twitter/api.py

Lines changed: 49 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@
6363
calc_expected_status_length,
6464
is_url,
6565
parse_media_file,
66-
enf_type)
66+
enf_type,
67+
parse_arg_list)
6768

6869
from twitter.error import (
6970
TwitterError,
@@ -1713,25 +1714,20 @@ def GetRetweetsOfMe(self,
17131714
When True, the user entities will be included. [Optional]
17141715
"""
17151716
url = '%s/statuses/retweets_of_me.json' % self.base_url
1716-
parameters = {}
17171717
if count is not None:
17181718
try:
17191719
if int(count) > 100:
17201720
raise TwitterError({'message': "'count' may not be greater than 100"})
17211721
except ValueError:
17221722
raise TwitterError({'message': "'count' must be an integer"})
1723-
if count:
1724-
parameters['count'] = count
1725-
if since_id:
1726-
parameters['since_id'] = since_id
1727-
if max_id:
1728-
parameters['max_id'] = max_id
1729-
if trim_user:
1730-
parameters['trim_user'] = trim_user
1731-
if not include_entities:
1732-
parameters['include_entities'] = include_entities
1733-
if not include_user_entities:
1734-
parameters['include_user_entities'] = include_user_entities
1723+
parameters = {
1724+
'count': count,
1725+
'since_id': since_id,
1726+
'max_id': max_id,
1727+
'trim_user': bool(trim_user),
1728+
'include_entities': bool(include_entities),
1729+
'include_user_entities': bool(include_user_entities),
1730+
}
17351731

17361732
resp = self._RequestUrl(url, 'GET', data=parameters)
17371733
data = self._ParseAndCheckTwitter(resp.content.decode('utf-8'))
@@ -2815,11 +2811,13 @@ def UsersLookup(self,
28152811
if len(uids):
28162812
parameters['user_id'] = ','.join([str(u) for u in uids])
28172813
if screen_name:
2818-
parameters['screen_name'] = ','.join(screen_name)
2814+
parameters['screen_name'] = parse_arg_list(screen_name, 'screen_name')
28192815

28202816
if len(uids) > 100:
28212817
raise TwitterError("No more than 100 users may be requested per request.")
28222818

2819+
print(parameters)
2820+
28232821
resp = self._RequestUrl(url, 'GET', data=parameters)
28242822
data = self._ParseAndCheckTwitter(resp.content.decode('utf-8'))
28252823

@@ -2915,24 +2913,18 @@ def GetDirectMessages(self,
29152913
A sequence of twitter.DirectMessage instances
29162914
"""
29172915
url = '%s/direct_messages.json' % self.base_url
2918-
parameters = {}
2919-
if since_id:
2920-
parameters['since_id'] = since_id
2921-
if max_id:
2922-
parameters['max_id'] = max_id
2916+
parameters = {
2917+
'full_text': bool(full_text),
2918+
'include_entities': bool(include_entities),
2919+
'max_id': max_id,
2920+
'since_id': since_id,
2921+
'skip_status': bool(skip_status),
2922+
}
2923+
29232924
if count:
2924-
try:
2925-
parameters['count'] = int(count)
2926-
except ValueError:
2927-
raise TwitterError({'message': "count must be an integer"})
2928-
if not include_entities:
2929-
parameters['include_entities'] = 'false'
2930-
if skip_status:
2931-
parameters['skip_status'] = 1
2932-
if full_text:
2933-
parameters['full_text'] = 'true'
2925+
parameters['count'] = enf_type('count', int, count)
29342926
if page:
2935-
parameters['page'] = page
2927+
parameters['page'] = enf_type('page', int, page)
29362928

29372929
resp = self._RequestUrl(url, 'GET', data=parameters)
29382930
data = self._ParseAndCheckTwitter(resp.content.decode('utf-8'))
@@ -2952,47 +2944,43 @@ def GetSentDirectMessages(self,
29522944
"""Returns a list of the direct messages sent by the authenticating user.
29532945
29542946
Args:
2955-
since_id:
2947+
since_id (int, optional):
29562948
Returns results with an ID greater than (that is, more recent
29572949
than) the specified ID. There are limits to the number of
29582950
Tweets which can be accessed through the API. If the limit of
29592951
Tweets has occured since the since_id, the since_id will be
2960-
forced to the oldest ID available. [Optional]
2961-
max_id:
2952+
forced to the oldest ID available.
2953+
max_id (int, optional):
29622954
Returns results with an ID less than (that is, older than) or
2963-
equal to the specified ID. [Optional]
2964-
count:
2955+
equal to the specified ID.
2956+
count (int, optional):
29652957
Specifies the number of direct messages to try and retrieve, up to a
29662958
maximum of 200. The value of count is best thought of as a limit to the
29672959
number of Tweets to return because suspended or deleted content is
2968-
removed after the count has been applied. [Optional]
2969-
page:
2960+
removed after the count has been applied.
2961+
page (int, optional):
29702962
Specifies the page of results to retrieve.
29712963
Note: there are pagination limits. [Optional]
2972-
include_entities:
2964+
include_entities (bool, optional):
29732965
The entities node will be omitted when set to False.
2974-
[Optional]
29752966
return_json (bool, optional):
29762967
If True JSON data will be returned, instead of twitter.User
29772968
29782969
Returns:
29792970
A sequence of twitter.DirectMessage instances
29802971
"""
29812972
url = '%s/direct_messages/sent.json' % self.base_url
2982-
parameters = {}
2983-
if since_id:
2984-
parameters['since_id'] = since_id
2985-
if page:
2986-
parameters['page'] = page
2987-
if max_id:
2988-
parameters['max_id'] = max_id
2973+
2974+
parameters = {
2975+
'include_entities': bool(include_entities),
2976+
'max_id': max_id,
2977+
'since_id': since_id,
2978+
}
2979+
29892980
if count:
2990-
try:
2991-
parameters['count'] = int(count)
2992-
except ValueError:
2993-
raise TwitterError({'message': "count must be an integer"})
2994-
if not include_entities:
2995-
parameters['include_entities'] = 'false'
2981+
parameters['count'] = enf_type('count', int, count)
2982+
if page:
2983+
parameters['page'] = enf_type('page', int, page)
29962984

29972985
resp = self._RequestUrl(url, 'GET', data=parameters)
29982986
data = self._ParseAndCheckTwitter(resp.content.decode('utf-8'))
@@ -3543,20 +3531,17 @@ def GetMentions(self,
35433531
A sequence of twitter.Status instances, one for each mention of the user.
35443532
"""
35453533
url = '%s/statuses/mentions_timeline.json' % self.base_url
3546-
parameters = {}
3534+
3535+
parameters = {
3536+
'contributor_details': bool(contributor_details),
3537+
'include_entities': bool(include_entities),
3538+
'max_id': max_id,
3539+
'since_id': since_id,
3540+
'trim_user': bool(trim_user),
3541+
}
35473542

35483543
if count:
35493544
parameters['count'] = enf_type('count', int, count)
3550-
if since_id:
3551-
parameters['since_id'] = enf_type('since_id', int, since_id)
3552-
if max_id:
3553-
parameters['max_id'] = enf_type('max_id', int, max_id)
3554-
if trim_user:
3555-
parameters['trim_user'] = 1
3556-
if contributor_details:
3557-
parameters['contributor_details'] = 'true'
3558-
if not include_entities:
3559-
parameters['include_entities'] = 'false'
35603545

35613546
resp = self._RequestUrl(url, 'GET', data=parameters)
35623547
data = self._ParseAndCheckTwitter(resp.content.decode('utf-8'))

twitter/error.py

Lines changed: 5 additions & 0 deletions

0 commit comments

Comments
 (0)