Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[#1505] Fix bug when non-sysadmins invited users to organizations
The problem was with the .user_invite() auth function. Instead of adding 'id' to the data_dict, I was adding it to the context. Fixed now. I've also changed it to require a data_dict, and a data_dict['group_id'] (as they're required anyway). While I'm at it, I rewrote the tests into the new testing style.
- Loading branch information
1 parent
e8a34ce
commit 9f80c0f
Showing
5 changed files
with
123 additions
and
81 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
'''Unit tests for ckan/logic/auth/create.py. | ||
''' | ||
|
||
import mock | ||
import nose.tools | ||
|
||
import ckan.new_tests.helpers as helpers | ||
import ckan.new_tests.factories as factories | ||
import ckan.model | ||
import ckan.logic | ||
|
||
|
||
class TestUserInvite(object): | ||
|
||
def setup(self): | ||
helpers.reset_db() | ||
|
||
@mock.patch('ckan.lib.mailer.send_invite') | ||
def test_user_invite(self, send_invite): | ||
invited_user = self._invite_user_to_group() | ||
|
||
assert invited_user is not None | ||
|
||
@mock.patch('ckan.lib.mailer.send_invite') | ||
def test_user_invite_creates_pending_user(self, _): | ||
invited_user = self._invite_user_to_group() | ||
|
||
assert invited_user.is_pending() | ||
|
||
@mock.patch('ckan.lib.mailer.send_invite') | ||
def test_user_invite_creates_user_with_valid_username(self, _): | ||
email = 'user$%+abc@email.com' | ||
invited_user = self._invite_user_to_group(email) | ||
|
||
assert invited_user.name.startswith('user---abc'), invited_user | ||
|
||
@mock.patch('ckan.lib.mailer.send_invite') | ||
def test_user_invite_assigns_user_to_group_in_expected_role(self, _): | ||
role = 'admin' | ||
invited_user = self._invite_user_to_group(role=role) | ||
|
||
group_ids = invited_user.get_group_ids(capacity=role) | ||
assert len(group_ids) == 1, group_ids | ||
|
||
@mock.patch('ckan.lib.mailer.send_invite') | ||
def test_user_invite_sends_invite(self, send_invite): | ||
invited_user = self._invite_user_to_group() | ||
|
||
assert send_invite.called | ||
assert send_invite.call_args[0][0].id == invited_user.id | ||
|
||
@mock.patch('ckan.lib.mailer.send_invite') | ||
@mock.patch('random.SystemRandom') | ||
def test_user_invite_works_even_if_tried_username_already_exists(self, SystemRandom, _): | ||
SystemRandom.return_value.random.side_effect = [1000, 1000, 1000, 2000, 3000, 4000, 5000] | ||
|
||
for _ in range(3): | ||
invited_user = self._invite_user_to_group(email='same@email.com') | ||
assert invited_user is not None, invited_user | ||
|
||
@mock.patch('ckan.lib.mailer.send_invite') | ||
@nose.tools.raises(ckan.logic.ValidationError) | ||
def test_user_invite_requires_email(self, _): | ||
self._invite_user_to_group(email=None) | ||
|
||
@mock.patch('ckan.lib.mailer.send_invite') | ||
@nose.tools.raises(ckan.logic.ValidationError) | ||
def test_user_invite_requires_role(self, _): | ||
self._invite_user_to_group(role=None) | ||
|
||
@mock.patch('ckan.lib.mailer.send_invite') | ||
@nose.tools.raises(ckan.logic.ValidationError) | ||
def test_user_invite_requires_group_id(self, _): | ||
self._invite_user_to_group(group={'id': None}) | ||
|
||
def _invite_user_to_group(self, email='user@email.com', group=None, role='member'): | ||
user = factories.User() | ||
group = group or factories.Group(user=user) | ||
|
||
context = { | ||
'user': user['name'] | ||
} | ||
params = { | ||
'email': email, | ||
'group_id': group['id'], | ||
'role': role | ||
} | ||
|
||
result = helpers.call_action('user_invite', context, **params) | ||
|
||
return ckan.model.User.get(result['id']) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
'''Unit tests for ckan/logic/auth/create.py. | ||
''' | ||
|
||
import mock | ||
|
||
import ckan.new_tests.helpers as helpers | ||
import ckan.new_tests.factories as factories | ||
|
||
|
||
class TestCreate(object): | ||
def setup(self): | ||
helpers.reset_db() | ||
|
||
@mock.patch('ckan.logic.auth.create.group_member_create') | ||
def test_user_invite_prepares_data_dict_and_delegates_to_group_member_create(self, group_member_create): | ||
user = factories.User() | ||
context = { | ||
'user': user['name'], | ||
'model': None, | ||
'auth_user_obj': user | ||
} | ||
data_dict = {'group_id': 42} | ||
group_member_create_data_dict = data_dict.copy() | ||
group_member_create_data_dict['id'] = data_dict['group_id'] | ||
|
||
helpers.call_auth('user_invite', context=context, **data_dict) | ||
|
||
group_member_create.assert_called_with(context, group_member_create_data_dict) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters