diff --git a/rest_auth/test_settings.py b/rest_auth/test_settings.py index 3d5e270..2fcc1e3 100644 --- a/rest_auth/test_settings.py +++ b/rest_auth/test_settings.py @@ -36,6 +36,18 @@ MIDDLEWARE_CLASSES = [ 'django.contrib.messages.middleware.MessageMiddleware' ] +TEMPLATE_CONTEXT_PROCESSORS = [ + 'django.contrib.auth.context_processors.auth', + 'django.core.context_processors.debug', + 'django.core.context_processors.media', + 'django.core.context_processors.request', + 'django.contrib.messages.context_processors.messages', + 'django.core.context_processors.static', + + "allauth.account.context_processors.account", + "allauth.socialaccount.context_processors.socialaccount", +] + INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', @@ -48,6 +60,8 @@ INSTALLED_APPS = [ 'allauth', 'allauth.account', + 'allauth.socialaccount', + 'allauth.socialaccount.providers.facebook', 'rest_framework', 'rest_framework.authtoken', diff --git a/rest_auth/test_urls.py b/rest_auth/test_urls.py new file mode 100644 index 0000000..fb730a3 --- /dev/null +++ b/rest_auth/test_urls.py @@ -0,0 +1,22 @@ +from django.conf.urls import patterns, url, include +from django.views.generic import TemplateView +from django.contrib.auth.tests import urls + +from allauth.socialaccount.providers.facebook.views import FacebookOAuth2Adapter + +from .urls import urlpatterns +from .registration.views import SocialLogin + + +class FacebookLogin(SocialLogin): + adapter_class = FacebookOAuth2Adapter + +urlpatterns += patterns('', + url(r'^rest-registration/', include('registration.urls')), + url(r'^test-admin/', include(urls)), + url(r'^account-email-verification-sent/$', TemplateView.as_view(), + name='account_email_verification_sent'), + url(r'^account-confirm-email/(?P\w+)/$', TemplateView.as_view(), + name='account_confirm_email'), + url(r'^social-login/facebook/$', FacebookLogin.as_view(), name='fb_login') +) diff --git a/rest_auth/tests.py b/rest_auth/tests.py index 587bca4..b18f3ee 100644 --- a/rest_auth/tests.py +++ b/rest_auth/tests.py @@ -9,8 +9,11 @@ from django.contrib.auth.models import User from django.contrib.auth import get_user_model from django.core import mail from django.test.utils import override_settings +from django.contrib.sites.models import Site + +from allauth.socialaccount.models import SocialApp +import responses -from rest_framework.serializers import _resolve_model from rest_framework import status @@ -121,6 +124,8 @@ class APITestCase1(TestCase, BaseAPITestCase): - custom registration: backend defined """ + urls = 'rest_auth.test_urls' + USERNAME = 'person' PASS = 'person' EMAIL = "person1@world.com" @@ -338,3 +343,44 @@ class APITestCase1(TestCase, BaseAPITestCase): # try to login again self._login() self._logout() + + +class TestSocialAuth(TestCase, BaseAPITestCase): + + urls = 'rest_auth.test_urls' + + def setUp(self): + social_app = SocialApp.objects.create( + provider='facebook', + name='Facebook', + client_id='123123123', + secret='321321321', + ) + site = Site.objects.get_current() + social_app.sites.add(site) + self.fb_login_url = reverse('fb_login') + + @responses.activate + def test_failed_social_auth(self): + # fake response + responses.add(responses.GET, 'https://graph.facebook.com/me', + body='', status=400, content_type='application/json') + + payload = { + 'access_token': 'abc123' + } + self.post(self.fb_login_url, data=payload, status_code=400) + + @responses.activate + def test_social_auth(self): + # fake response for facebook call + resp_body = '{"id":"123123123123","first_name":"John","gender":"male","last_name":"Smith","link":"https:\\/\\/www.facebook.com\\/john.smith","locale":"en_US","name":"John Smith","timezone":2,"updated_time":"2014-08-13T10:14:38+0000","username":"john.smith","verified":true}' + responses.add(responses.GET, 'https://graph.facebook.com/me', + body=resp_body, status=200, content_type='application/json') + + payload = { + 'access_token': 'abc123' + } + + self.post(self.fb_login_url, data=payload, status_code=200) + self.assertIn('key', self.response.json.keys()) diff --git a/rest_auth/urls.py b/rest_auth/urls.py index e1907d9..64f3bb2 100644 --- a/rest_auth/urls.py +++ b/rest_auth/urls.py @@ -1,36 +1,18 @@ -from django.conf import settings -from django.conf.urls import patterns, url, include -from django.views.generic import TemplateView +from django.conf.urls import patterns, url -from rest_auth.views import Login, Logout, UserDetails, \ - PasswordChange, PasswordReset, PasswordResetConfirm +from rest_auth.views import (Login, Logout, UserDetails, PasswordChange, + PasswordReset, PasswordResetConfirm) - -urlpatterns = patterns('rest_auth.views', - # URLs that do not require a session or valid token - url(r'^password/reset/$', PasswordReset.as_view(), - name='rest_password_reset'), - url(r'^password/reset/confirm/$', - PasswordResetConfirm.as_view( - ), name='rest_password_reset_confirm'), - url(r'^login/$', Login.as_view(), name='rest_login'), - - # URLs that require a user to be logged in with a valid - # session / token. - url(r'^logout/$', Logout.as_view(), name='rest_logout'), - url(r'^user/$', UserDetails.as_view(), - name='rest_user_details'), - url(r'^password/change/$', PasswordChange.as_view(), - name='rest_password_change'), - ) - -if getattr(settings, 'IS_TEST', False): - from django.contrib.auth.tests import urls - urlpatterns += patterns('', - url(r'^rest-registration/', include('registration.urls')), - url(r'^test-admin/', include(urls)), - url(r'^account-email-verification-sent/$', TemplateView.as_view(), - name='account_email_verification_sent'), - url(r'^account-confirm-email/(?P\w+)/$', TemplateView.as_view(), - name='account_confirm_email'), - ) +urlpatterns = patterns('', + # URLs that do not require a session or valid token + url(r'^password/reset/$', PasswordReset.as_view(), + name='rest_password_reset'), + url(r'^password/reset/confirm/$', PasswordResetConfirm.as_view(), + name='rest_password_reset_confirm'), + url(r'^login/$', Login.as_view(), name='rest_login'), + # URLs that require a user to be logged in with a valid session / token. + url(r'^logout/$', Logout.as_view(), name='rest_logout'), + url(r'^user/$', UserDetails.as_view(), name='rest_user_details'), + url(r'^password/change/$', PasswordChange.as_view(), + name='rest_password_change'), +) diff --git a/setup.py b/setup.py index 8bbfb04..1677ccf 100644 --- a/setup.py +++ b/setup.py @@ -31,6 +31,7 @@ setup( 'Django>=1.5.0', 'django-allauth>=0.18.0', 'djangorestframework>=2.3.13', + 'responses>=0.2.2' ], test_suite='rest_auth.runtests.runtests', include_package_data=True,