Merge lp:~robru/friends/twitter-retweet into lp:friends

Proposed by Robert Bruce Park
Status: Merged
Approved by: Ken VanDine
Approved revision: 190
Merged at revision: 189
Proposed branch: lp:~robru/friends/twitter-retweet
Merge into: lp:friends
Diff against target: 159 lines (+67/-9)
5 files modified
friends/protocols/twitter.py (+16/-1)
friends/tests/data/twitter-retweet.dat (+1/-0)
friends/tests/mocks.py (+1/-0)
friends/tests/test_identica.py (+3/-2)
friends/tests/test_twitter.py (+46/-6)
To merge this branch: bzr merge lp:~robru/friends/twitter-retweet
Reviewer Review Type Date Requested Status
Ken VanDine Approve
PS Jenkins bot (community) continuous-integration Approve
Review via email: mp+158724@code.launchpad.net

Commit message

Fix Twitter.retweet (LP: #1168427)

Description of the change

Fixes Twitter.retweet method, which wasn't supplying sender name / avatar correctly due to the information being missing from twitter.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

FAILED: Continuous integration, rev:189
http://jenkins.qa.ubuntu.com/job/friends-ci/28/
Executed test runs:
    FAILURE: http://jenkins.qa.ubuntu.com/job/friends-raring-amd64-ci/28/console

Click here to trigger a rebuild:
http://s-jenkins:8080/job/friends-ci/28/rebuild

review: Needs Fixing (continuous-integration)
lp:~robru/friends/twitter-retweet updated
190. By Robert Bruce Park

Add twitter-retweet.dat data file.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

PASSED: Continuous integration, rev:190
http://jenkins.qa.ubuntu.com/job/friends-ci/29/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/friends-raring-amd64-ci/29

Click here to trigger a rebuild:
http://s-jenkins:8080/job/friends-ci/29/rebuild

review: Approve (continuous-integration)
Revision history for this message
Ken VanDine (ken-vandine) wrote :

Great!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'friends/protocols/twitter.py'
--- friends/protocols/twitter.py 2013-04-03 03:47:39 +0000
+++ friends/protocols/twitter.py 2013-04-12 22:22:26 +0000
@@ -78,6 +78,11 @@
78 self._account.secret_token = authdata.get('TokenSecret')78 self._account.secret_token = authdata.get('TokenSecret')
79 self._account.user_id = authdata.get('UserId')79 self._account.user_id = authdata.get('UserId')
80 self._account.user_name = authdata.get('ScreenName')80 self._account.user_name = authdata.get('ScreenName')
81 user = self._showuser(self._account.user_id)
82 self._account.user_full_name = user.get('name', '')
83 self._account.avatar_url = (user.get('profile_image_url_https') or
84 user.get('profile_image_url') or
85 '')
8186
82 def _get_url(self, url, data=None):87 def _get_url(self, url, data=None):
83 """Access the Twitter API with correct OAuth signed headers."""88 """Access the Twitter API with correct OAuth signed headers."""
@@ -284,6 +289,15 @@
284 """Republish somebody else's tweet with your name on it."""289 """Republish somebody else's tweet with your name on it."""
285 url = self._retweet.format(message_id)290 url = self._retweet.format(message_id)
286 tweet = self._get_url(url, dict(trim_user='true'))291 tweet = self._get_url(url, dict(trim_user='true'))
292 user = tweet.get('user', {}) or tweet.get('sender', {})
293
294 # Fill in the blanks...
295 user.update(
296 name=self._account.user_full_name,
297 screen_name=self._account.user_name,
298 profile_image_url=self._account.avatar_url,
299 )
300
287 return self._publish_tweet(tweet)301 return self._publish_tweet(tweet)
288302
289# https://dev.twitter.com/docs/api/1.1/post/friendships/destroy303# https://dev.twitter.com/docs/api/1.1/post/friendships/destroy
@@ -356,7 +370,8 @@
356# https://dev.twitter.com/docs/api/1.1/get/users/show370# https://dev.twitter.com/docs/api/1.1/get/users/show
357 def _showuser(self, uid):371 def _showuser(self, uid):
358 """Get all the information about a twitter user."""372 """Get all the information about a twitter user."""
359 url = self._api_base.format(endpoint="users/show") + "?user_id={}".format(uid)373 url = self._api_base.format(
374 endpoint='users/show') + '?user_id={}'.format(uid)
360 return self._get_url(url)375 return self._get_url(url)
361376
362 def _create_contact(self, userdata):377 def _create_contact(self, userdata):
363378
=== added file 'friends/tests/data/twitter-retweet.dat'
--- friends/tests/data/twitter-retweet.dat 1970-01-01 00:00:00 +0000
+++ friends/tests/data/twitter-retweet.dat 2013-04-12 22:22:26 +0000
@@ -0,0 +1,1 @@
1{"place":null,"user":{"id_str":"836242932","id":836242932},"retweet_count":6,"created_at":"Fri Apr 12 20:23:14 +0000 2013","geo":null,"contributors":null,"retweeted":true,"id_str":"322807141108944896","coordinates":null,"truncated":false,"retweeted_status":{"place":null,"user":{"id_str":"45840709","id":45840709},"retweet_count":6,"created_at":"Fri Apr 12 16:52:59 +0000 2013","geo":null,"contributors":null,"retweeted":true,"id_str":"322754231591387136","coordinates":null,"truncated":false,"in_reply_to_status_id":null,"in_reply_to_screen_name":null,"possibly_sensitive":false,"favorited":false,"text":"Reading 'Core utility apps visual exploration' at Design http:\/\/t.co\/36tT53C37n","in_reply_to_status_id_str":null,"source":"\u003Ca href=\"http:\/\/twitter.com\/tweetbutton\" rel=\"nofollow\"\u003ETweet Button\u003C\/a\u003E","id":322754231591387136,"in_reply_to_user_id_str":null,"entities":{"hashtags":[],"user_mentions":[],"urls":[{"url":"http:\/\/t.co\/36tT53C37n","display_url":"design.canonical.com\/2013\/04\/core-u\u2026","indices":[57,79],"expanded_url":"http:\/\/design.canonical.com\/2013\/04\/core-utility-apps-visual-exploration\/"}]},"in_reply_to_user_id":null},"in_reply_to_status_id":null,"in_reply_to_screen_name":null,"possibly_sensitive":false,"favorited":false,"text":"RT @ubuntudesigners: Reading 'Core utility apps visual exploration' at Design http:\/\/t.co\/36tT53C37n","in_reply_to_status_id_str":null,"source":"\u003Ca href=\"http:\/\/www.ubuntu.com\" rel=\"nofollow\"\u003EUbuntu Online Accounts\u003C\/a\u003E","id":322807141108944896,"in_reply_to_user_id_str":null,"entities":{"hashtags":[],"user_mentions":[{"name":"Ubuntu Designers","screen_name":"ubuntudesigners","id_str":"45840709","indices":[3,19],"id":45840709}],"urls":[{"url":"http:\/\/t.co\/36tT53C37n","display_url":"design.canonical.com\/2013\/04\/core-u\u2026","indices":[78,100],"expanded_url":"http:\/\/design.canonical.com\/2013\/04\/core-utility-apps-visual-exploration\/"}]},"in_reply_to_user_id":null}
02
=== modified file 'friends/tests/mocks.py'
--- friends/tests/mocks.py 2013-04-05 01:02:42 +0000
+++ friends/tests/mocks.py 2013-04-12 22:22:26 +0000
@@ -119,6 +119,7 @@
119 def __init__(self, service=None, account_id=88):119 def __init__(self, service=None, account_id=88):
120 self.access_token = None120 self.access_token = None
121 self.secret_token = None121 self.secret_token = None
122 self.avatar_url = None
122 self.user_full_name = None123 self.user_full_name = None
123 self.user_name = None124 self.user_name = None
124 self.user_id = None125 self.user_id = None
125126
=== modified file 'friends/tests/test_identica.py'
--- friends/tests/test_identica.py 2013-04-03 03:47:39 +0000
+++ friends/tests/test_identica.py 2013-04-12 22:22:26 +0000
@@ -169,12 +169,13 @@
169 dict(trim_user='true'))169 dict(trim_user='true'))
170170
171 def test_retweet(self):171 def test_retweet(self):
172 get_url = self.protocol._get_url = mock.Mock(return_value='tweet')172 tweet=dict(tweet='twit')
173 get_url = self.protocol._get_url = mock.Mock(return_value=tweet)
173 publish = self.protocol._publish_tweet = mock.Mock()174 publish = self.protocol._publish_tweet = mock.Mock()
174175
175 self.protocol.retweet('1234')176 self.protocol.retweet('1234')
176177
177 publish.assert_called_with('tweet')178 publish.assert_called_with(tweet)
178 get_url.assert_called_with(179 get_url.assert_called_with(
179 'http://identi.ca/api/statuses/retweet/1234.json',180 'http://identi.ca/api/statuses/retweet/1234.json',
180 dict(trim_user='true'))181 dict(trim_user='true'))
181182
=== modified file 'friends/tests/test_twitter.py'
--- friends/tests/test_twitter.py 2013-04-02 21:46:47 +0000
+++ friends/tests/test_twitter.py 2013-04-12 22:22:26 +0000
@@ -69,12 +69,17 @@
69 @mock.patch('friends.utils.authentication.Authentication.login',69 @mock.patch('friends.utils.authentication.Authentication.login',
70 return_value=dict(AccessToken='some clever fake data',70 return_value=dict(AccessToken='some clever fake data',
71 TokenSecret='sssssshhh!',71 TokenSecret='sssssshhh!',
72 UserId='rickygervais',72 UserId='1234',
73 ScreenName='Ricky Gervais'))73 ScreenName='stephenfry'))
74 @mock.patch('friends.protocols.twitter.Twitter._showuser',
75 return_value=dict(name='Stephen Fry',
76 profile_image_url='http://example.com/me.jpg'))
74 def test_successful_authentication(self, *mocks):77 def test_successful_authentication(self, *mocks):
75 self.assertTrue(self.protocol._login())78 self.assertTrue(self.protocol._login())
76 self.assertEqual(self.account.user_name, 'Ricky Gervais')79 self.assertEqual(self.account.avatar_url, 'http://example.com/me.jpg')
77 self.assertEqual(self.account.user_id, 'rickygervais')80 self.assertEqual(self.account.user_full_name, 'Stephen Fry')
81 self.assertEqual(self.account.user_name, 'stephenfry')
82 self.assertEqual(self.account.user_id, '1234')
78 self.assertEqual(self.account.access_token, 'some clever fake data')83 self.assertEqual(self.account.access_token, 'some clever fake data')
79 self.assertEqual(self.account.secret_token, 'sssssshhh!')84 self.assertEqual(self.account.secret_token, 'sssssshhh!')
8085
@@ -440,17 +445,52 @@
440 dict(trim_user='true'))445 dict(trim_user='true'))
441446
442 def test_retweet(self):447 def test_retweet(self):
443 get_url = self.protocol._get_url = mock.Mock(return_value='tweet')448 tweet = dict(tweet='twit')
449 get_url = self.protocol._get_url = mock.Mock(return_value=tweet)
444 publish = self.protocol._publish_tweet = mock.Mock(450 publish = self.protocol._publish_tweet = mock.Mock(
445 return_value='tweet permalink')451 return_value='tweet permalink')
446452
447 self.assertEqual(self.protocol.retweet('1234'), 'tweet permalink')453 self.assertEqual(self.protocol.retweet('1234'), 'tweet permalink')
448454
449 publish.assert_called_with('tweet')455 publish.assert_called_with(tweet)
450 get_url.assert_called_with(456 get_url.assert_called_with(
451 'https://api.twitter.com/1.1/statuses/retweet/1234.json',457 'https://api.twitter.com/1.1/statuses/retweet/1234.json',
452 dict(trim_user='true'))458 dict(trim_user='true'))
453459
460 @mock.patch('friends.utils.base.Model', TestModel)
461 @mock.patch('friends.utils.http.Soup.Message',
462 FakeSoupMessage('friends.tests.data', 'twitter-retweet.dat'))
463 @mock.patch('friends.protocols.twitter.Twitter._login',
464 return_value=True)
465 @mock.patch('friends.utils.base._seen_ids', {})
466 def test_retweet_with_data(self, *mocks):
467 self.account.access_token = 'access'
468 self.account.secret_token = 'secret'
469 self.account.user_name = 'some_guy'
470 self.account.user_full_name = 'Guy Man'
471 self.account.avatar_url = 'http://example.com/me.jpg'
472 self.account.auth.parameters = dict(
473 ConsumerKey='key',
474 ConsumerSecret='secret')
475 self.assertEqual(0, TestModel.get_n_rows())
476 self.assertEqual(
477 self.protocol.retweet('240558470661799936'),
478 'https://twitter.com/some_guy/status/322807141108944896')
479 self.assertEqual(1, TestModel.get_n_rows())
480
481 expected_row = [
482 'twitter', 88, '322807141108944896',
483 'messages', 'Guy Man', '836242932', 'some_guy', True,
484 '2013-04-12T20:23:14Z', 'RT @ubuntudesigners: Reading \'Core utility'
485 ' apps visual exploration\' at Design <a href="http://t.co/'
486 '36tT53C37n">http://t.co/36tT53C37n</a>',
487 GLib.get_user_cache_dir() +
488 '/friends/avatars/6e8af1e6860da04a6f42cb1e6934e191f7c38c6d',
489 'https://twitter.com/some_guy/status/322807141108944896',
490 0, False, '', '', '', '', '', '', '', 0.0, 0.0,
491 ]
492 self.assertEqual(list(TestModel.get_row(0)), expected_row)
493
454 def test_unfollow(self):494 def test_unfollow(self):
455 get_url = self.protocol._get_url = mock.Mock()495 get_url = self.protocol._get_url = mock.Mock()
456496

Subscribers

People subscribed via source and target branches