Add TwitterAuth view tests
This commit is contained in:
parent
ef7997d3bc
commit
c5ab5dc2bd
4 changed files with 73 additions and 9 deletions
|
|
@ -44,8 +44,8 @@
|
||||||
<div class="integrations">
|
<div class="integrations">
|
||||||
<h3 class="integrations__title">Twitter</h3>
|
<h3 class="integrations__title">Twitter</h3>
|
||||||
<div class="integrations__controls">
|
<div class="integrations__controls">
|
||||||
{% if twitter_request_url %}
|
{% if twitter_auth_url %}
|
||||||
<a class="link button button--twitter" href="{{ twitter_request_url }}">
|
<a class="link button button--twitter" href="{{ twitter_auth_url }}">
|
||||||
{% trans "Authorize account" %}
|
{% trans "Authorize account" %}
|
||||||
</a>
|
</a>
|
||||||
{% else %}
|
{% else %}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
from unittest.mock import patch
|
from unittest.mock import Mock, patch
|
||||||
from urllib.parse import urlencode
|
from urllib.parse import urlencode
|
||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
|
|
||||||
|
|
@ -13,6 +13,7 @@ from newsreader.news.collection.exceptions import (
|
||||||
StreamException,
|
StreamException,
|
||||||
StreamTooManyException,
|
StreamTooManyException,
|
||||||
)
|
)
|
||||||
|
from newsreader.news.collection.twitter import TWITTER_AUTH_URL
|
||||||
|
|
||||||
|
|
||||||
class IntegrationsViewTestCase(TestCase):
|
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, "jadajadajada")
|
||||||
self.assertEquals(self.user.twitter_oauth_token_secret, "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)
|
||||||
|
|
|
||||||
|
|
@ -88,9 +88,9 @@ urlpatterns = [
|
||||||
name="reddit-revoke",
|
name="reddit-revoke",
|
||||||
),
|
),
|
||||||
path(
|
path(
|
||||||
"settings/integrations/twitter/request/",
|
"settings/integrations/twitter/auth/",
|
||||||
login_required(TwitterAuthRedirectView.as_view()),
|
login_required(TwitterAuthRedirectView.as_view()),
|
||||||
name="twitter-request",
|
name="twitter-auth",
|
||||||
),
|
),
|
||||||
path(
|
path(
|
||||||
"settings/integrations/twitter/callback/",
|
"settings/integrations/twitter/callback/",
|
||||||
|
|
|
||||||
|
|
@ -75,7 +75,7 @@ class IntegrationsView(TemplateView):
|
||||||
twitter_revoke_url = reverse_lazy("accounts:twitter-revoke")
|
twitter_revoke_url = reverse_lazy("accounts:twitter-revoke")
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"twitter_request_url": reverse_lazy("accounts:twitter-request"),
|
"twitter_auth_url": reverse_lazy("accounts:twitter-auth"),
|
||||||
"twitter_revoke_url": twitter_revoke_url,
|
"twitter_revoke_url": twitter_revoke_url,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -206,7 +206,6 @@ class TwitterRevokeRedirectView(RedirectView):
|
||||||
return super().get(request, *args, **kwargs)
|
return super().get(request, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
# TODO write tests
|
|
||||||
class TwitterAuthRedirectView(RedirectView):
|
class TwitterAuthRedirectView(RedirectView):
|
||||||
url = reverse_lazy("accounts:integrations")
|
url = reverse_lazy("accounts:integrations")
|
||||||
|
|
||||||
|
|
@ -226,8 +225,15 @@ class TwitterAuthRedirectView(RedirectView):
|
||||||
return super().get(request, *args, **kwargs)
|
return super().get(request, *args, **kwargs)
|
||||||
|
|
||||||
params = parse_qs(response.text)
|
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(
|
cache.set_many(
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue