This fixes a non-compliant to RFC 1178 exception raised by the Django implementation of Blender ID. The issue is debated here https://code.djangoproject.com/ticket/20264.
77 lines
2.9 KiB
Python
77 lines
2.9 KiB
Python
import responses
|
|
from pillar.tests import AbstractPillarTest
|
|
|
|
|
|
class OAuthTests(AbstractPillarTest):
|
|
def setUp(self, **kwargs):
|
|
super().setUp(**kwargs)
|
|
self.enter_app_context()
|
|
|
|
def test_providers_init(self):
|
|
from pillar.auth.oauth import OAuthSignIn, BlenderIdSignIn
|
|
|
|
oauth_provider = OAuthSignIn.get_provider('blender-id')
|
|
self.assertIsInstance(oauth_provider, BlenderIdSignIn)
|
|
self.assertEqual(oauth_provider.service.base_url, 'http://blender-id:8000/api/')
|
|
|
|
def test_provider_not_implemented(self):
|
|
from pillar.auth.oauth import OAuthSignIn, ProviderNotImplemented
|
|
|
|
with self.assertRaises(ProviderNotImplemented):
|
|
OAuthSignIn.get_provider('jonny')
|
|
|
|
def test_provider_not_configured(self):
|
|
from pillar.auth.oauth import OAuthSignIn, ProviderConfigurationMissing
|
|
|
|
# Before we start this test, the providers dict
|
|
# may not be initialized yet.
|
|
self.assertIsNone(OAuthSignIn._providers)
|
|
|
|
del self.app.config['OAUTH_CREDENTIALS']['blender-id']
|
|
with self.assertRaises(ProviderConfigurationMissing):
|
|
OAuthSignIn.get_provider('blender-id')
|
|
|
|
def test_provider_authorize(self):
|
|
from pillar.auth.oauth import OAuthSignIn
|
|
from urllib.parse import urlparse, parse_qsl
|
|
oauth_provider = OAuthSignIn.get_provider('blender-id')
|
|
r = oauth_provider.authorize()
|
|
self.assertEqual(r.status_code, 302)
|
|
url_parts = list(urlparse(r.location))
|
|
# Get the query arguments as a dict
|
|
query = dict(parse_qsl(url_parts[4]))
|
|
self.assertEqual(query['client_id'], oauth_provider.service.client_id)
|
|
|
|
@responses.activate
|
|
def test_provider_callback_happy(self):
|
|
from pillar.auth.oauth import OAuthSignIn
|
|
|
|
responses.add(responses.POST, 'http://blender-id:8000/oauth/token',
|
|
json={'access_token': 'successful-token'},
|
|
status=200)
|
|
|
|
responses.add(responses.GET, 'http://blender-id:8000/api/user',
|
|
json={'id': '7',
|
|
'email': 'harry@blender.org'},
|
|
status=200)
|
|
|
|
oauth_provider = OAuthSignIn.get_provider('blender-id')
|
|
|
|
with self.app.test_request_context('/oauth/blender-id/authorized?code=123'):
|
|
# We override the call to blender-id
|
|
cb = oauth_provider.callback()
|
|
self.assertEqual(cb.id, '7')
|
|
self.assertEqual(cb.email, 'harry@blender.org')
|
|
|
|
@responses.activate
|
|
def test_provider_callback_missing_code(self):
|
|
from pillar.auth.oauth import OAuthSignIn, OAuthCodeNotProvided
|
|
|
|
oauth_provider = OAuthSignIn.get_provider('blender-id')
|
|
|
|
# Check exception when the 'code' argument is not returned
|
|
with self.assertRaises(OAuthCodeNotProvided):
|
|
with self.app.test_request_context('/oauth/blender-id/authorized'):
|
|
oauth_provider.callback()
|
|
|