Add TwitterAuth view tests

This commit is contained in:
Sonny Bakker 2020-09-25 21:23:27 +02:00
parent ef7997d3bc
commit c5ab5dc2bd
4 changed files with 73 additions and 9 deletions

View file

@ -44,8 +44,8 @@
<div class="integrations">
<h3 class="integrations__title">Twitter</h3>
<div class="integrations__controls">
{% if twitter_request_url %}
<a class="link button button--twitter" href="{{ twitter_request_url }}">
{% if twitter_auth_url %}
<a class="link button button--twitter" href="{{ twitter_auth_url }}">
{% trans "Authorize account" %}
</a>
{% else %}

View file

@ -1,4 +1,4 @@
from unittest.mock import patch
from unittest.mock import Mock, patch
from urllib.parse import urlencode
from uuid import uuid4
@ -13,6 +13,7 @@ from newsreader.news.collection.exceptions import (
StreamException,
StreamTooManyException,
)
from newsreader.news.collection.twitter import TWITTER_AUTH_URL
class IntegrationsViewTestCase(TestCase):
@ -326,3 +327,60 @@ class TwitterRevokeRedirectView(TestCase):
self.assertEquals(self.user.twitter_oauth_token, "jadajadajada")
self.assertEquals(self.user.twitter_oauth_token_secret, "jadajadajada")
class TwitterAuthRedirectViewTestCase(TestCase):
def setUp(self):
self.user = UserFactory(email="test@test.nl", password="test")
self.client.force_login(self.user)
self.patch = patch("newsreader.accounts.views.integrations.post")
self.mocked_post = self.patch.start()
def tearDown(self):
cache.clear()
def test_simple(self):
self.mocked_post.return_value = Mock(
text="oauth_token=foo&oauth_token_secret=bar"
)
response = self.client.get(reverse("accounts:twitter-auth"))
self.assertRedirects(
response,
f"{TWITTER_AUTH_URL}/?oauth_token=foo",
fetch_redirect_response=False,
)
cached_token = cache.get(f"twitter-{self.user.email}-token")
cached_secret = cache.get(f"twitter-{self.user.email}-secret")
self.assertEquals(cached_token, "foo")
self.assertEquals(cached_secret, "bar")
def test_stream_exception(self):
self.mocked_post.side_effect = StreamException
response = self.client.get(reverse("accounts:twitter-auth"))
self.assertRedirects(response, reverse("accounts:integrations"))
cached_token = cache.get(f"twitter-{self.user.email}-token")
cached_secret = cache.get(f"twitter-{self.user.email}-secret")
self.assertIsNone(cached_token)
self.assertIsNone(cached_secret)
def test_unexpected_contents(self):
self.mocked_post.return_value = Mock(text="foo=bar&oauth_token_secret=bar")
response = self.client.get(reverse("accounts:twitter-auth"))
self.assertRedirects(response, reverse("accounts:integrations"))
cached_token = cache.get(f"twitter-{self.user.email}-token")
cached_secret = cache.get(f"twitter-{self.user.email}-secret")
self.assertIsNone(cached_token)
self.assertIsNone(cached_secret)

View file

@ -88,9 +88,9 @@ urlpatterns = [
name="reddit-revoke",
),
path(
"settings/integrations/twitter/request/",
"settings/integrations/twitter/auth/",
login_required(TwitterAuthRedirectView.as_view()),
name="twitter-request",
name="twitter-auth",
),
path(
"settings/integrations/twitter/callback/",

View file

@ -75,7 +75,7 @@ class IntegrationsView(TemplateView):
twitter_revoke_url = reverse_lazy("accounts:twitter-revoke")
return {
"twitter_request_url": reverse_lazy("accounts:twitter-request"),
"twitter_auth_url": reverse_lazy("accounts:twitter-auth"),
"twitter_revoke_url": twitter_revoke_url,
}
@ -206,7 +206,6 @@ class TwitterRevokeRedirectView(RedirectView):
return super().get(request, *args, **kwargs)
# TODO write tests
class TwitterAuthRedirectView(RedirectView):
url = reverse_lazy("accounts:integrations")
@ -226,8 +225,15 @@ class TwitterAuthRedirectView(RedirectView):
return super().get(request, *args, **kwargs)
params = parse_qs(response.text)
request_oauth_token = params.get("oauth_token")[0]
request_oauth_secret = params.get("oauth_token_secret")[0]
try:
request_oauth_token = params["oauth_token"][0]
request_oauth_secret = params["oauth_token_secret"][0]
except KeyError:
logger.exception("No credentials found in response")
messages.error(request, _("Unable to retrieve initial Twitter token"))
return super().get(request, *args, **kwargs)
cache.set_many(
{