2017-11-30 15:28:35 +01:00
|
|
|
import typing
|
2017-05-04 17:49:18 +02:00
|
|
|
from unittest import mock
|
|
|
|
|
|
|
|
import responses
|
|
|
|
|
|
|
|
from pillar.tests import AbstractPillarTest, TEST_EMAIL_ADDRESS
|
|
|
|
|
|
|
|
|
|
|
|
# The OAuth lib doesn't use requests, so we can't use responses to mock it.
|
|
|
|
# Instead, we use unittest.mock for that.
|
|
|
|
|
|
|
|
|
|
|
|
class RoleUpdatingTest(AbstractPillarTest):
|
|
|
|
def setUp(self):
|
|
|
|
super().setUp()
|
|
|
|
|
|
|
|
with self.app.test_request_context():
|
|
|
|
self.create_standard_groups()
|
|
|
|
|
2017-12-21 12:59:32 +01:00
|
|
|
from pillar.api.blender_cloud import subscription as sub
|
|
|
|
self.user_subs_signal_calls = []
|
|
|
|
sub.user_subscription_updated.connect(self._user_subs_signal)
|
|
|
|
|
|
|
|
def _user_subs_signal(self, sender, **kwargs):
|
|
|
|
self.user_subs_signal_calls.append((sender, kwargs))
|
|
|
|
|
2017-05-04 17:49:18 +02:00
|
|
|
def _setup_testcase(self, mocked_fetch_blenderid_user, *,
|
2017-11-30 15:28:35 +01:00
|
|
|
bid_roles: typing.Set[str]):
|
2017-05-04 17:49:18 +02:00
|
|
|
import urllib.parse
|
2017-11-30 15:28:35 +01:00
|
|
|
|
|
|
|
# The Store API endpoint should not be called upon any more.
|
2017-05-04 17:49:18 +02:00
|
|
|
url = '%s?blenderid=%s' % (self.app.config['EXTERNAL_SUBSCRIPTIONS_MANAGEMENT_SERVER'],
|
|
|
|
urllib.parse.quote(TEST_EMAIL_ADDRESS))
|
|
|
|
responses.add('GET', url,
|
2017-11-30 15:28:35 +01:00
|
|
|
status=500,
|
2017-05-04 17:49:18 +02:00
|
|
|
match_querystring=True)
|
2017-11-30 15:28:35 +01:00
|
|
|
|
2017-05-04 17:49:18 +02:00
|
|
|
self.mock_blenderid_validate_happy()
|
|
|
|
mocked_fetch_blenderid_user.return_value = {
|
|
|
|
'email': TEST_EMAIL_ADDRESS,
|
|
|
|
'full_name': 'dr. Sybren A. St\u00fcvel',
|
|
|
|
'id': 5555,
|
|
|
|
'roles': {
|
|
|
|
'admin': True,
|
|
|
|
'bfct_trainer': False,
|
|
|
|
'conference_speaker': True,
|
|
|
|
'network_member': True
|
|
|
|
}
|
|
|
|
}
|
2017-11-30 15:28:35 +01:00
|
|
|
for role in bid_roles:
|
|
|
|
mocked_fetch_blenderid_user.return_value['roles'][role] = True
|
2017-05-04 17:49:18 +02:00
|
|
|
|
|
|
|
@responses.activate
|
|
|
|
@mock.patch('pillar.api.blender_id.fetch_blenderid_user')
|
|
|
|
def test_store_api_role_grant_subscriber(self, mocked_fetch_blenderid_user):
|
|
|
|
self._setup_testcase(mocked_fetch_blenderid_user,
|
2017-11-30 15:28:35 +01:00
|
|
|
bid_roles={'cloud_subscriber', 'cloud_has_subscription'})
|
2017-05-04 17:49:18 +02:00
|
|
|
|
|
|
|
self.get('/api/bcloud/update-subscription', auth_token='my-happy-token',
|
|
|
|
expected_status=204)
|
|
|
|
user_info = self.get('/api/users/me', auth_token='my-happy-token').json()
|
2017-11-30 15:28:35 +01:00
|
|
|
self.assertEqual({'subscriber', 'has_subscription'}, set(user_info['roles']))
|
2017-05-04 17:49:18 +02:00
|
|
|
|
2017-12-21 12:59:32 +01:00
|
|
|
# Check the signals
|
|
|
|
self.assertEqual(1, len(self.user_subs_signal_calls))
|
|
|
|
sender, kwargs = self.user_subs_signal_calls[0]
|
|
|
|
self.assertEqual({'revoke_roles': set(), 'grant_roles': {'subscriber', 'has_subscription'}},
|
|
|
|
kwargs)
|
|
|
|
|
2017-05-04 17:49:18 +02:00
|
|
|
@responses.activate
|
|
|
|
@mock.patch('pillar.api.blender_id.fetch_blenderid_user')
|
|
|
|
def test_store_api_role_revoke_subscriber(self, mocked_fetch_blenderid_user):
|
|
|
|
self._setup_testcase(mocked_fetch_blenderid_user,
|
2017-11-30 15:28:35 +01:00
|
|
|
bid_roles={'conference_speaker'})
|
2017-05-04 17:49:18 +02:00
|
|
|
|
|
|
|
# Make sure this user is currently known as a subcriber.
|
2017-12-21 12:59:32 +01:00
|
|
|
self.create_user(roles={'subscriber', 'has_subscription'}, token='my-happy-token')
|
2017-05-04 17:49:18 +02:00
|
|
|
user_info = self.get('/api/users/me', auth_token='my-happy-token').json()
|
2017-12-21 12:59:32 +01:00
|
|
|
self.assertEqual({'subscriber', 'has_subscription'}, set(user_info['roles']))
|
2017-05-04 17:49:18 +02:00
|
|
|
|
|
|
|
# And after updating, it shouldn't be.
|
|
|
|
self.get('/api/bcloud/update-subscription', auth_token='my-happy-token',
|
|
|
|
expected_status=204)
|
|
|
|
user_info = self.get('/api/users/me', auth_token='my-happy-token').json()
|
|
|
|
self.assertEqual([], user_info['roles'])
|
|
|
|
|
2017-12-21 12:59:32 +01:00
|
|
|
self.assertEqual(1, len(self.user_subs_signal_calls))
|
|
|
|
sender, kwargs = self.user_subs_signal_calls[0]
|
|
|
|
self.assertEqual({'revoke_roles': {'subscriber', 'has_subscription'}, 'grant_roles': set()},
|
|
|
|
kwargs)
|
|
|
|
|
2017-05-04 17:49:18 +02:00
|
|
|
@responses.activate
|
|
|
|
@mock.patch('pillar.api.blender_id.fetch_blenderid_user')
|
|
|
|
def test_bid_api_grant_demo(self, mocked_fetch_blenderid_user):
|
|
|
|
self._setup_testcase(mocked_fetch_blenderid_user,
|
2017-11-30 15:28:35 +01:00
|
|
|
bid_roles={'cloud_demo'})
|
2017-05-04 17:49:18 +02:00
|
|
|
|
|
|
|
self.get('/api/bcloud/update-subscription', auth_token='my-happy-token',
|
|
|
|
expected_status=204)
|
|
|
|
|
|
|
|
user_info = self.get('/api/users/me', auth_token='my-happy-token').json()
|
|
|
|
self.assertEqual(['demo'], user_info['roles'])
|
|
|
|
|
2017-12-21 12:59:32 +01:00
|
|
|
self.assertEqual(1, len(self.user_subs_signal_calls))
|
|
|
|
sender, kwargs = self.user_subs_signal_calls[0]
|
|
|
|
self.assertEqual({'revoke_roles': set(), 'grant_roles': {'demo'}}, kwargs)
|
|
|
|
|
2017-05-04 17:49:18 +02:00
|
|
|
@responses.activate
|
|
|
|
@mock.patch('pillar.api.blender_id.fetch_blenderid_user')
|
2017-11-30 15:28:35 +01:00
|
|
|
def test_bid_api_role_revoke_demo(self, mocked_fetch_blenderid_user):
|
2017-05-04 17:49:18 +02:00
|
|
|
self._setup_testcase(mocked_fetch_blenderid_user,
|
2017-11-30 15:28:35 +01:00
|
|
|
bid_roles={'conference_speaker'})
|
2017-05-04 17:49:18 +02:00
|
|
|
|
|
|
|
# Make sure this user is currently known as demo user.
|
|
|
|
self.create_user(roles={'demo'}, token='my-happy-token')
|
|
|
|
user_info = self.get('/api/users/me', auth_token='my-happy-token').json()
|
|
|
|
self.assertEqual(['demo'], user_info['roles'])
|
|
|
|
|
|
|
|
# And after updating, it shouldn't be.
|
|
|
|
self.get('/api/bcloud/update-subscription', auth_token='my-happy-token',
|
|
|
|
expected_status=204)
|
|
|
|
user_info = self.get('/api/users/me', auth_token='my-happy-token').json()
|
|
|
|
self.assertEqual([], user_info['roles'])
|
2017-12-21 12:59:32 +01:00
|
|
|
|
|
|
|
self.assertEqual(1, len(self.user_subs_signal_calls))
|
|
|
|
sender, kwargs = self.user_subs_signal_calls[0]
|
|
|
|
self.assertEqual({'revoke_roles': {'demo'}, 'grant_roles': set()}, kwargs)
|