139 lines
5.0 KiB
Python
139 lines
5.0 KiB
Python
import json
|
|
|
|
from django.test.client import RequestFactory
|
|
from django.test.utils import override_settings
|
|
from django.urls import reverse
|
|
|
|
from allauth.account import app_settings as account_settings
|
|
from allauth.account.models import EmailAddress
|
|
from allauth.socialaccount.models import SocialAccount
|
|
from allauth.socialaccount.tests import OAuth2TestsMixin
|
|
from allauth.tests import MockedResponse, TestCase, patch
|
|
from allauth.utils import get_user_model
|
|
|
|
from .provider import FacebookProvider
|
|
|
|
|
|
@override_settings(
|
|
SOCIALACCOUNT_AUTO_SIGNUP=True,
|
|
ACCOUNT_SIGNUP_FORM_CLASS=None,
|
|
LOGIN_REDIRECT_URL="/accounts/profile/",
|
|
ACCOUNT_EMAIL_VERIFICATION=account_settings.EmailVerificationMethod.NONE,
|
|
SOCIALACCOUNT_PROVIDERS={"facebook": {"AUTH_PARAMS": {}, "VERIFIED_EMAIL": False}},
|
|
)
|
|
class FacebookTests(OAuth2TestsMixin, TestCase):
|
|
provider_id = FacebookProvider.id
|
|
|
|
facebook_data = """
|
|
{
|
|
"id": "630595557",
|
|
"name": "Raymond Penners",
|
|
"first_name": "Raymond",
|
|
"last_name": "Penners",
|
|
"email": "raymond.penners@example.com",
|
|
"link": "https://www.facebook.com/raymond.penners",
|
|
"username": "raymond.penners",
|
|
"birthday": "07/17/1973",
|
|
"work": [
|
|
{
|
|
"employer": {
|
|
"id": "204953799537777",
|
|
"name": "IntenCT"
|
|
}
|
|
}
|
|
],
|
|
"timezone": 1,
|
|
"locale": "nl_NL",
|
|
"verified": true,
|
|
"updated_time": "2012-11-30T20:40:33+0000"
|
|
}"""
|
|
|
|
def get_mocked_response(self, data=None):
|
|
if data is None:
|
|
data = self.facebook_data
|
|
return MockedResponse(200, data)
|
|
|
|
def test_username_conflict(self):
|
|
User = get_user_model()
|
|
User.objects.create(username="raymond.penners")
|
|
self.login(self.get_mocked_response())
|
|
socialaccount = SocialAccount.objects.get(uid="630595557")
|
|
self.assertEqual(socialaccount.user.username, "raymond")
|
|
|
|
def test_username_based_on_provider(self):
|
|
self.login(self.get_mocked_response())
|
|
socialaccount = SocialAccount.objects.get(uid="630595557")
|
|
self.assertEqual(socialaccount.user.username, "raymond.penners")
|
|
|
|
def test_username_based_on_provider_with_simple_name(self):
|
|
data = '{"id": "1234567", "name": "Harvey McGillicuddy"}'
|
|
self.login(self.get_mocked_response(data=data))
|
|
socialaccount = SocialAccount.objects.get(uid="1234567")
|
|
self.assertEqual(socialaccount.user.username, "harvey")
|
|
|
|
@override_settings(
|
|
SOCIALACCOUNT_PROVIDERS={
|
|
"facebook": {
|
|
"METHOD": "js_sdk",
|
|
}
|
|
},
|
|
)
|
|
def test_media_js(self):
|
|
request = RequestFactory().get(reverse("account_login"))
|
|
request.session = {}
|
|
script = self.provider.media_js(request)
|
|
self.assertTrue('"appId": "app123id"' in script)
|
|
|
|
def test_login_by_token(self):
|
|
resp = self.client.get(reverse("account_login"))
|
|
with patch(
|
|
"allauth.socialaccount.providers.facebook.views.requests"
|
|
) as requests_mock:
|
|
mocks = [self.get_mocked_response().json()]
|
|
requests_mock.get.return_value.json = lambda: mocks.pop()
|
|
resp = self.client.post(
|
|
reverse("facebook_login_by_token"),
|
|
data={"access_token": "dummy"},
|
|
)
|
|
self.assertRedirects(
|
|
resp, "/accounts/profile/", fetch_redirect_response=False
|
|
)
|
|
|
|
@override_settings(
|
|
SOCIALACCOUNT_PROVIDERS={
|
|
"facebook": {
|
|
"METHOD": "js_sdk",
|
|
"AUTH_PARAMS": {"auth_type": "reauthenticate"},
|
|
"VERIFIED_EMAIL": False,
|
|
}
|
|
}
|
|
)
|
|
def test_login_by_token_reauthenticate(self):
|
|
resp = self.client.get(reverse("account_login"))
|
|
nonce = json.loads(resp.context["fb_data"])["loginOptions"]["auth_nonce"]
|
|
with patch(
|
|
"allauth.socialaccount.providers.facebook.views.requests"
|
|
) as requests_mock:
|
|
mocks = [self.get_mocked_response().json(), {"auth_nonce": nonce}]
|
|
requests_mock.get.return_value.json = lambda: mocks.pop()
|
|
resp = self.client.post(
|
|
reverse("facebook_login_by_token"),
|
|
data={"access_token": "dummy"},
|
|
)
|
|
self.assertRedirects(
|
|
resp, "/accounts/profile/", fetch_redirect_response=False
|
|
)
|
|
|
|
@override_settings(SOCIALACCOUNT_PROVIDERS={"facebook": {"VERIFIED_EMAIL": True}})
|
|
def test_login_verified(self):
|
|
emailaddress = self._login_verified()
|
|
self.assertTrue(emailaddress.verified)
|
|
|
|
def test_login_unverified(self):
|
|
emailaddress = self._login_verified()
|
|
self.assertFalse(emailaddress.verified)
|
|
|
|
def _login_verified(self):
|
|
self.login(self.get_mocked_response())
|
|
return EmailAddress.objects.get(email="raymond.penners@example.com")
|