comparison tests/test_silos_twitter.py @ 4:c199bd681e4e

Twitter API accepts direct URLs for media.
author Ludovic Chabant <ludovic@chabant.com>
date Sun, 29 Jul 2018 14:27:24 -0700
parents 27543b2e73b9
children a921cc2306bc
comparison
equal deleted inserted replaced
3:98687befb7bf 4:c199bd681e4e
1 import pytest 1 import pytest
2 from .mockutil import mock_urllib
3 2
4 3
5 def test_one_article(cli, feedutil, tweetmock): 4 def test_one_article(cli, feedutil, tweetmock):
6 feed = cli.createTempFeed(feedutil.makeFeed( 5 feed = cli.createTempFeed(feedutil.makeFeed(
7 """<h1 class="p-name">A new article</h1> 6 """<h1 class="p-name">A new article</h1>
16 tweetmock.installTokens(cli, 'test') 15 tweetmock.installTokens(cli, 'test')
17 16
18 ctx, _ = cli.run('process', feed) 17 ctx, _ = cli.run('process', feed)
19 assert ctx.cache.wasPosted('test', 'https://example.org/a-new-article') 18 assert ctx.cache.wasPosted('test', 'https://example.org/a-new-article')
20 toot = ctx.silos[0].client.tweets[0] 19 toot = ctx.silos[0].client.tweets[0]
21 assert toot == ('A new article https://example.org/a-new-article', None) 20 assert toot == ('A new article https://example.org/a-new-article', [])
22 21
23 22
24 def test_one_micropost(cli, feedutil, tweetmock): 23 def test_one_micropost(cli, feedutil, tweetmock):
25 feed = cli.createTempFeed(feedutil.makeFeed( 24 feed = cli.createTempFeed(feedutil.makeFeed(
26 """<p class="p-name">This is a quick update.</p> 25 """<p class="p-name">This is a quick update.</p>
31 tweetmock.installTokens(cli, 'test') 30 tweetmock.installTokens(cli, 'test')
32 31
33 ctx, _ = cli.run('process', feed) 32 ctx, _ = cli.run('process', feed)
34 assert ctx.cache.wasPosted('test', '/01234.html') 33 assert ctx.cache.wasPosted('test', '/01234.html')
35 toot = ctx.silos[0].client.tweets[0] 34 toot = ctx.silos[0].client.tweets[0]
36 assert toot == ("This is a quick update.", None) 35 assert toot == ("This is a quick update.", [])
37 36
38 37
39 def test_one_micropost_with_one_photo(cli, feedutil, tweetmock, monkeypatch): 38 def test_one_micropost_with_one_photo(cli, feedutil, tweetmock, monkeypatch):
40 feed = cli.createTempFeed(feedutil.makeFeed( 39 feed = cli.createTempFeed(feedutil.makeFeed(
41 """<p class="p-name">This is a quick photo update.</p> 40 """<p class="p-name">This is a quick photo update.</p>
46 )) 45 ))
47 46
48 cli.appendSiloConfig('test', 'twitter', url='/blah') 47 cli.appendSiloConfig('test', 'twitter', url='/blah')
49 tweetmock.installTokens(cli, 'test') 48 tweetmock.installTokens(cli, 'test')
50 49
51 with monkeypatch.context() as m: 50 ctx, _ = cli.run('process', feed)
52 import silorider.silos.twitter
53 mock_urllib(m)
54 m.setattr(silorider.silos.twitter.TwitterSilo, '_media_callback',
55 _patched_media_callback)
56 ctx, _ = cli.run('process', feed)
57 51
58 assert ctx.cache.wasPosted('test', '/01234.html') 52 assert ctx.cache.wasPosted('test', '/01234.html')
59 media = ctx.silos[0].client.media[0]
60 assert media == ('/retrieved/fullimg.jpg', 1)
61 toot = ctx.silos[0].client.tweets[0] 53 toot = ctx.silos[0].client.tweets[0]
62 assert toot == ("This is a quick photo update.", [1]) 54 assert toot == ("This is a quick photo update.", ['/fullimg.jpg'])
63 55
64 56
65 def test_one_micropost_with_two_photos(cli, feedutil, tweetmock, monkeypatch): 57 def test_one_micropost_with_two_photos(cli, feedutil, tweetmock, monkeypatch):
66 feed = cli.createTempFeed(feedutil.makeFeed( 58 feed = cli.createTempFeed(feedutil.makeFeed(
67 """<p class="p-name">This is a photo update with 2 photos.</p> 59 """<p class="p-name">This is a photo update with 2 photos.</p>
73 )) 65 ))
74 66
75 cli.appendSiloConfig('test', 'twitter', url='/blah') 67 cli.appendSiloConfig('test', 'twitter', url='/blah')
76 tweetmock.installTokens(cli, 'test') 68 tweetmock.installTokens(cli, 'test')
77 69
78 with monkeypatch.context() as m: 70 ctx, _ = cli.run('process', feed)
79 import silorider.silos.twitter
80 mock_urllib(m)
81 m.setattr(silorider.silos.twitter.TwitterSilo, '_media_callback',
82 _patched_media_callback)
83 ctx, _ = cli.run('process', feed)
84 71
85 assert ctx.cache.wasPosted('test', '/01234.html') 72 assert ctx.cache.wasPosted('test', '/01234.html')
86 media = ctx.silos[0].client.media[0]
87 assert media == ('/retrieved/fullimg1.jpg', 1)
88 media = ctx.silos[0].client.media[1]
89 assert media == ('/retrieved/fullimg2.jpg', 2)
90 toot = ctx.silos[0].client.tweets[0] 73 toot = ctx.silos[0].client.tweets[0]
91 assert toot == ("This is a photo update with 2 photos.", [1, 2]) 74 assert toot == ("This is a photo update with 2 photos.",
92 75 ['/fullimg1.jpg', '/fullimg2.jpg'])
93
94 def _patched_media_callback(self, tmpfile, mt):
95 return self.client.UploadMediaChunked(tmpfile)
96 76
97 77
98 @pytest.fixture(scope='session') 78 @pytest.fixture(scope='session')
99 def tweetmock(): 79 def tweetmock():
100 from silorider.silos.twitter import TwitterSilo 80 from silorider.silos.twitter import TwitterSilo
109 assert consumer_secret == 'TEST_CLIENT_SECRET' 89 assert consumer_secret == 'TEST_CLIENT_SECRET'
110 assert access_token_key == 'TEST_ACCESS_KEY' 90 assert access_token_key == 'TEST_ACCESS_KEY'
111 assert access_token_secret == 'TEST_ACCESS_SECRET' 91 assert access_token_secret == 'TEST_ACCESS_SECRET'
112 92
113 self.tweets = [] 93 self.tweets = []
114 self.media = []
115 self.next_mid = 1
116 94
117 def PostUpdate(self, tweet, media=None): 95 def PostUpdate(self, tweet, media=None):
118 self.tweets.append((tweet, media)) 96 self.tweets.append((tweet, media))
119
120 def UploadMediaChunked(self, filename):
121 mid = self.next_mid
122 self.next_mid += 1
123 self.media.append((filename, mid))
124 return mid
125 97
126 98
127 class TwitterMockUtil: 99 class TwitterMockUtil:
128 def installTokens(self, cli, silo_name): 100 def installTokens(self, cli, silo_name):
129 def do_install_tokens(ctx): 101 def do_install_tokens(ctx):