Twitter (Tweets) Log Posting Details (#539)

This commit is contained in:
Chris Caron 2022-03-10 20:59:40 -05:00 committed by GitHub
parent 2a81899e6e
commit 908f2c1e27
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 116 additions and 11 deletions

View File

@ -419,11 +419,36 @@ class NotifyTwitter(NotifyBase):
if not postokay:
# Track our error
has_error = True
errors = []
try:
errors = ['Error Code {}: {}'.format(
e.get('code', 'unk'), e.get('message'))
for e in response['errors']]
except (KeyError, TypeError):
pass
for error in errors:
self.logger.debug(
'Tweet [%.2d/%.2d] Details: %s',
no, len(payloads), error)
continue
try:
url = 'https://twitter.com/{}/status/{}'.format(
response['user']['screen_name'],
response['id_str'])
except (KeyError, TypeError):
url = 'unknown'
self.logger.debug(
'Tweet [%.2d/%.2d] Details: %s', no, len(payloads), url)
self.logger.info(
'Sent [{:02d}/{:02d}] Twitter notification as public tweet.'
.format(no, len(payloads)))
'Sent [%.2d/%.2d] Twitter notification as public tweet.',
no, len(payloads))
return not has_error
@ -691,6 +716,15 @@ class NotifyTwitter(NotifyBase):
timeout=self.request_timeout,
)
try:
content = loads(r.content)
except (AttributeError, TypeError, ValueError):
# ValueError = r.content is Unparsable
# TypeError = r.content is None
# AttributeError = r is None
content = {}
if r.status_code != requests.codes.ok:
# We had a problem
status_str = \
@ -710,15 +744,6 @@ class NotifyTwitter(NotifyBase):
# Mark our failure
return (False, content)
try:
content = loads(r.content)
except (AttributeError, TypeError, ValueError):
# ValueError = r.content is Unparsable
# TypeError = r.content is None
# AttributeError = r is None
content = {}
try:
# Capture rate limiting if possible
self.ratelimit_remaining = \

View File

@ -723,6 +723,86 @@ def test_plugin_twitter_tweet_attachments(mock_get, mock_post):
assert mock_post.call_args_list[1][0][0] == \
'https://api.twitter.com/1.1/statuses/update.json'
# Update our good response to have more details in it
good_tweet_response_obj = {
'screen_name': screen_name,
'id': 9876,
# needed for additional logging
'id_str': '12345',
'user': {
'screen_name': screen_name,
}
}
good_tweet_response.content = dumps(good_tweet_response_obj)
mock_get.reset_mock()
mock_post.reset_mock()
mock_post.side_effect = [good_media_response, good_tweet_response]
mock_get.return_value = good_tweet_response
# instantiate our object
obj = Apprise.instantiate(twitter_url)
# Send our notification (again); this time there willb e more tweet logging
assert obj.notify(
body='body', title='title', notify_type=NotifyType.INFO,
attach=attach) is True
# Test our call count
assert mock_get.call_count == 0
assert mock_post.call_count == 2
assert mock_post.call_args_list[0][0][0] == \
'https://upload.twitter.com/1.1/media/upload.json'
assert mock_post.call_args_list[1][0][0] == \
'https://api.twitter.com/1.1/statuses/update.json'
mock_get.reset_mock()
mock_post.reset_mock()
mock_post.side_effect = [good_media_response, bad_media_response]
# instantiate our object
obj = Apprise.instantiate(twitter_url)
# Our notification will fail now since our tweet will error out
assert obj.notify(
body='body', title='title', notify_type=NotifyType.INFO,
attach=attach) is False
# Test our call count
assert mock_get.call_count == 0
assert mock_post.call_count == 2
assert mock_post.call_args_list[0][0][0] == \
'https://upload.twitter.com/1.1/media/upload.json'
assert mock_post.call_args_list[1][0][0] == \
'https://api.twitter.com/1.1/statuses/update.json'
mock_get.reset_mock()
mock_post.reset_mock()
bad_media_response.content = ''
mock_post.side_effect = [good_media_response, bad_media_response]
# instantiate our object
obj = Apprise.instantiate(twitter_url)
# Our notification will fail now since our tweet will error out
# This is the same test as above, except our error response isn't parseable
assert obj.notify(
body='body', title='title', notify_type=NotifyType.INFO,
attach=attach) is False
# Test our call count
assert mock_get.call_count == 0
assert mock_post.call_count == 2
assert mock_post.call_args_list[0][0][0] == \
'https://upload.twitter.com/1.1/media/upload.json'
assert mock_post.call_args_list[1][0][0] == \
'https://api.twitter.com/1.1/statuses/update.json'
mock_get.reset_mock()
mock_post.reset_mock()