import urlparse
import unittest
from sgmllib import SGMLParser
+from django.conf import settings
from django.test.client import Client
from django.core.urlresolvers import reverse
self.client = Client(**client_kwargs)
super(SocialAuthTestsCase, self).__init__(*args, **kwargs)
+ def setUp(self):
+ from social_auth import backends
+ self.old_PIPELINE = backends.PIPELINE
+ backends.PIPELINE = (
+ 'social_auth.backends.pipeline.social.social_auth_user',
+ 'social_auth.backends.pipeline.associate.associate_by_email',
+ 'social_auth.backends.pipeline.user.get_username',
+ 'social_auth.backends.pipeline.user.create_user',
+ 'social_auth.backends.pipeline.social.associate_user',
+ 'social_auth.backends.pipeline.social.load_extra_data',
+ 'social_auth.backends.pipeline.user.update_user_details',
+ )
+ super(SocialAuthTestsCase, self).setUp()
+
+ def tearDown(self):
+ from social_auth import backends
+ backends.PIPELINE = self.old_PIPELINE
+ super(SocialAuthTestsCase, self).tearDown()
+
def test_backend_cache(self):
"""Ensure that the backend for the testcase gets cached."""
try:
except AttributeError:
pass
else:
+ if self.name not in settings.SOCIAL_AUTH_ENABLED_BACKENDS:
+ # this backend is not enabled (for example, google-openid/google-oauth2)
+ return
from social_auth import backends
backends.BACKENDS = {}
self.client.get(self.reverse('socialauth_begin', self.name))
- self.assertTrue(self.name in backends.BACKENDS)
+ self.assertTrue(self.name in backends.BACKENDSCACHE)
def get_content(self, url, data=None, use_cookies=False):
"""Return content for given url, if data is not None, then a POST
from social_auth.utils import setting
from social_auth.tests.base import SocialAuthTestsCase, FormParserByID
+from django.contrib.sites.models import Site
class FacebookTestCase(SocialAuthTestsCase):
SERVER_NAME = 'myapp.com'
SERVER_PORT = '8000'
+
+ def __init__(self, methodName='runTest'):
+ self.SERVER_NAME = Site.objects.get_current()
+ super(FacebookTestCase, self).__init__(methodName)
+
name = 'facebook'
def setUp(self, *args, **kwargs):
REDIRECT_RE = re.compile('window.location.replace\("(.*)"\);')
-
class FacebookTestLogin(FacebookTestCase):
def test_login_succeful(self):
- response = self.client.get(self.reverse('socialauth_begin',
- 'facebook'))
+ """
+
+ """
+ response = self.client.get('http://%s%s' % (self.SERVER_NAME, self.reverse('socialauth_begin', 'facebook')))
# social_auth must redirect to service page
self.assertEqual(response.status_code, 302)
# Open first redirect page, it contains user login form because
# we don't have cookie to send to twitter
parser = FormParserByID('login_form')
- parser.feed(self.get_content(response['Location'], use_cookies=True))
+ content = self.get_content(response['Location'], use_cookies=True)
+ parser.feed(content)
auth = {'email': self.user,
'pass': self.passwd}
# Post login form, will return authorization or redirect page
parser.values.update(auth)
- content = self.get_content(parser.action, parser.values,
+ redirect = self.get_redirect(parser.action, parser.values,
use_cookies=True)
-
# If page contains a form#login_form, then we are in the app
# authorization page because the app is not authorized yet,
# otherwise the app already gained permission and twitter sends
# a page that redirects to redirect_url
- if 'uiserver_form' in content:
+ if 'login_form' in content:
# authorization form post, returns redirect_page
- parser = FormParserByID('uiserver_form').feed(content)
+ parser = FormParserByID('login_form')
+ parser.feed(content)
self.assertTrue(parser.action)
self.assertTrue(parser.values)
parser.values.update(auth)
- redirect_page = self.get_content(parser.action, parser.values,
+ redirect = self.get_redirect(parser.action, parser.values,
use_cookies=True)
+ redirect_page = redirect.read()
else:
- redirect_page = content
+ redirect = self.get_redirect(redirect.headers['Location'],
+ use_cookies=True)
+ redirect_page = redirect.read()
+
+ if 'uiserver_form' in redirect_page:
+ # authorization form post, returns redirect_page
+ parser = FormParserByID('uiserver_form')
+ parser.feed(redirect_page)
+ self.assertTrue(parser.action)
+ self.assertTrue(parser.values)
+ parser.values.update(auth)
+ redirect = self.get_redirect(parser.action, parser.values,
+ use_cookies=True)
+
- url = REDIRECT_RE.findall(redirect_page)
- self.assertTrue(url)
- # URL comes on JS scaped, needs to be clean first, any better way?
- url = url[0].replace('\u0025', '%').replace('\\', '')
- response = self.client.get(self.make_relative(url))
+ self.assertTrue(setting('LOGIN_REDIRECT_URL') in self.make_relative(redirect.headers['Location']))