allianceauth/services/tests/test_signals.py
Basraah 918ecf812c Publically joinable Groups (#697)
* Add public field to AuthGroup

* Add permission for users to join non-public groups

By default this permission will be applied to the "Member" group to
maintain the current behaviour.

* Allow users to join public groups

Users without the 'groupmanagement.request_groups' permission will be
able to join groups marked as public but will not be able to see or join
any other groups.

* Prevent None state change from purging groups

Currently when a user drops from Blue or Member state all groups and
permissions are discarded. This softens that approach by not removing
public groups and creates a distinction between the two activities. An
argument could maybe be made for not removing permissions on a state
change, but that is beyond the scope of this change.

* Correct syntax for removing filtered groups

* Add unit tests for disable user and member

* Update services signals tests

* Correct mocking call

* Remove permissions checking from menu item
2017-02-11 22:03:39 -05:00

92 lines
2.8 KiB
Python

from __future__ import unicode_literals
try:
# Py3
from unittest import mock
except ImportError:
# Py2
import mock
from django.test import TestCase
from django.contrib.auth.models import Group
from alliance_auth.tests.auth_utils import AuthUtils
class ServicesSignalsTestCase(TestCase):
def setUp(self):
self.member = AuthUtils.create_member('auth_member')
self.none_user = AuthUtils.create_user('none_user', disconnect_signals=True)
@mock.patch('services.signals.transaction')
@mock.patch('services.signals.get_hooks')
def test_m2m_changed_user_groups(self, get_hooks, transaction):
"""
Test that update_groups hook function is called on user groups change
"""
svc = mock.Mock()
svc.update_groups.return_value = None
get_hooks.return_value = [lambda: svc]
# Overload transaction.on_commit so everything happens synchronously
transaction.on_commit = lambda fn: fn()
test_group = Group.objects.create(name="Test group")
# Act, should trigger m2m change
self.member.groups.add(test_group)
self.member.save()
# Assert
self.assertTrue(get_hooks.called)
args, kwargs = get_hooks.call_args
self.assertEqual('services_hook', args[0])
self.assertTrue(svc.update_groups.called)
args, kwargs = svc.update_groups.call_args
self.assertEqual(self.member, args[0])
@mock.patch('services.signals.disable_user')
def test_pre_delete_user(self, disable_user):
"""
Test that disable_member is called when a user is deleted
"""
self.none_user.delete()
self.assertTrue(disable_user.called)
args, kwargs = disable_user.call_args
self.assertEqual(self.none_user, args[0])
@mock.patch('services.signals.disable_user')
def test_pre_save_user_inactivation(self, disable_user):
"""
Test a user set inactive has disable_member called
"""
self.member.is_active = False
self.member.save() # Signal Trigger
self.assertTrue(disable_user.called)
args, kwargs = disable_user.call_args
self.assertEqual(self.member, args[0])
@mock.patch('services.signals.set_state')
def test_pre_save_user_activation(self, set_state):
"""
Test a user set inactive has disable_member called
"""
# Arrange, set user inactive first
self.member.is_active = False
self.member.save() # Signal Trigger (but not the one we want)
set_state.reset_mock()
# Act
self.member.is_active = True
self.member.save() # Signal Trigger
# Assert
self.assertTrue(set_state.called)
args, kwargs = set_state.call_args
self.assertEqual(self.member, args[0])