Update twitter error handling

This commit is contained in:
Sonny Bakker 2021-09-25 10:39:43 +02:00
parent f5b708aafe
commit 53aa8da2dd
6 changed files with 122 additions and 84 deletions

View file

@ -206,6 +206,7 @@ simple_mock_parsed = {
"updated": "Sun, 12 Jul 2020 17:21:20 GMT",
"updated_parsed": struct_time((2020, 7, 12, 17, 21, 20, 6, 194, 0)),
},
"headers": {},
"namespaces": {
"": "http://www.w3.org/2005/Atom",
"content": "http://purl.org/rss/1.0/modules/content/",

View file

@ -193,3 +193,35 @@ class TwitterClientTestCase(TestCase):
self.assertIsNone(user.twitter_oauth_token)
self.assertIsNone(user.twitter_oauth_token_secret)
def test_client_does_not_reset_token(self):
"""
The user's token and refresh token should not be reset when an generic
exception is caught
"""
user = UserFactory(
twitter_oauth_token=str(uuid4()), twitter_oauth_token_secret=str(uuid4())
)
timeline = TwitterTimelineFactory(user=user)
response = Mock(json=lambda: {"errors": [{"code": 100}]})
self.mocked_read.side_effect = StreamException(
message="Generic message", response=response
)
with TwitterClient([timeline]) as client:
for data, stream in client:
with self.subTest(data=data, stream=stream):
self.assertIsNone(data)
self.assertIsNone(stream)
self.assertEquals(stream.rule.error, "")
self.assertEquals(stream.rule.succeeded, False)
self.mocked_read.assert_called()
user.refresh_from_db()
timeline.refresh_from_db()
self.assertIsNotNone(user.twitter_oauth_token)
self.assertIsNotNone(user.twitter_oauth_token_secret)

View file

@ -250,39 +250,41 @@ class TwitterClient(PostClient):
try:
response_data = e.response.json()
except JSONDecodeError:
logger.exception("Could not parse json for request")
continue
if "errors" in response_data:
errors = response_data["errors"]
token_expired = any(error["code"] == 89 for error in errors)
try:
import sentry_sdk
if token_expired:
try:
import sentry_sdk
with sentry_sdk.push_scope() as scope:
scope.set_extra("content", response_data)
sentry_sdk.capture_message(
"Twitter authentication credentials reset"
)
except ImportError:
pass
with sentry_sdk.push_scope() as scope:
scope.set_extra("content", response_data)
sentry_sdk.capture_message(
"Twitter authentication credentials reset"
)
except ImportError:
pass
stream.rule.user.twitter_oauth_token = None
stream.rule.user.twitter_oauth_token_secret = None
stream.rule.user.save()
stream.rule.user.twitter_oauth_token = None
stream.rule.user.twitter_oauth_token_secret = None
stream.rule.user.save()
message = _(
"Your Twitter account credentials have expired. Re-authenticate in"
" the settings page to keep retrieving Twitter specific information"
" from your account."
)
message = _(
"Your Twitter account credentials have expired. Re-authenticate in"
" the settings page to keep retrieving Twitter specific information"
" from your account."
)
send_mail(
"Twitter account needs re-authentication",
message,
None,
[stream.rule.user.email],
)
send_mail(
"Twitter account needs re-authentication",
message,
None,
[stream.rule.user.email],
)
continue
finally: