mirror of
https://gitlab.com/allianceauth/allianceauth.git
synced 2025-07-14 06:50:15 +02:00
Begin fixing tests.
Use custom django-navhelper
This commit is contained in:
parent
26405985a2
commit
f0f1b21226
@ -4,8 +4,7 @@ from django.db.models.signals import m2m_changed, pre_save
|
|||||||
from django.contrib.auth.models import User, Group
|
from django.contrib.auth.models import User, Group
|
||||||
from services.signals import m2m_changed_user_groups, pre_save_user
|
from services.signals import m2m_changed_user_groups, pre_save_user
|
||||||
from services.signals import m2m_changed_group_permissions, m2m_changed_user_permissions, m2m_changed_state_permissions
|
from services.signals import m2m_changed_group_permissions, m2m_changed_user_permissions, m2m_changed_state_permissions
|
||||||
from authentication.models import UserProfile, State
|
from authentication.models import UserProfile, State, CharacterOwnership
|
||||||
|
|
||||||
from eveonline.models import EveCharacter
|
from eveonline.models import EveCharacter
|
||||||
|
|
||||||
|
|
||||||
@ -26,14 +25,6 @@ class AuthUtils:
|
|||||||
cls.connect_signals()
|
cls.connect_signals()
|
||||||
return user
|
return user
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def create_member(cls, username):
|
|
||||||
return cls.create_user(username, disconnect_signals=True)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def create_blue(cls, username):
|
|
||||||
return cls.create_user(username, disconnect_signals=True)
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def disconnect_signals(cls):
|
def disconnect_signals(cls):
|
||||||
m2m_changed.disconnect(m2m_changed_user_groups, sender=User.groups.through)
|
m2m_changed.disconnect(m2m_changed_user_groups, sender=User.groups.through)
|
||||||
@ -61,8 +52,6 @@ class AuthUtils:
|
|||||||
corporation_ticker=corp_ticker,
|
corporation_ticker=corp_ticker,
|
||||||
alliance_id=alliance_id,
|
alliance_id=alliance_id,
|
||||||
alliance_name=alliance_name,
|
alliance_name=alliance_name,
|
||||||
api_id='1234',
|
|
||||||
user=user
|
|
||||||
)
|
)
|
||||||
UserProfile.objects.update_or_create(user=user, defaults={'main_character': char})
|
UserProfile.objects.update_or_create(user=user, defaults={'main_character': char})
|
||||||
|
|
||||||
@ -77,3 +66,7 @@ class AuthUtils:
|
|||||||
|
|
||||||
if disconnect_signals:
|
if disconnect_signals:
|
||||||
cls.connect_signals()
|
cls.connect_signals()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def add_permissions_to_state(cls, perms, states, disconnect_signals=True):
|
||||||
|
return cls.add_permissions_to_groups(perms, states, disconnect_signals=disconnect_signals)
|
@ -72,6 +72,8 @@ class UserProfile(models.Model):
|
|||||||
notify(self.user, _('State Changed'),
|
notify(self.user, _('State Changed'),
|
||||||
_('Your user state has been changed to %(state)s') % ({'state': state}),
|
_('Your user state has been changed to %(state)s') % ({'state': state}),
|
||||||
'info')
|
'info')
|
||||||
|
from authentication.signals import state_changed
|
||||||
|
state_changed.send(sender=self.__class__, user=self.user, state=self.state)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return str(self.user)
|
return str(self.user)
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
from django.db.models.signals import post_save, pre_delete, m2m_changed
|
from django.db.models.signals import post_save, pre_delete, m2m_changed
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from django.dispatch import receiver
|
from django.dispatch import receiver, Signal
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from authentication.models import CharacterOwnership, UserProfile, get_guest_state, State
|
from authentication.models import CharacterOwnership, UserProfile, get_guest_state, State
|
||||||
from services.tasks import validate_services
|
|
||||||
from esi.models import Token
|
from esi.models import Token
|
||||||
from eveonline.managers import EveManager
|
from eveonline.managers import EveManager
|
||||||
from eveonline.models import EveCharacter
|
from eveonline.models import EveCharacter
|
||||||
@ -13,6 +12,9 @@ import logging
|
|||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
state_changed = Signal(providing_args=['user', 'state'])
|
||||||
|
|
||||||
|
|
||||||
def trigger_state_check(state):
|
def trigger_state_check(state):
|
||||||
# evaluate all current members to ensure they still have access
|
# evaluate all current members to ensure they still have access
|
||||||
for profile in state.userprofile_set.all():
|
for profile in state.userprofile_set.all():
|
||||||
@ -57,8 +59,6 @@ def reassess_on_profile_save(sender, instance, created, *args, **kwargs):
|
|||||||
update_fields = kwargs.pop('update_fields', []) or []
|
update_fields = kwargs.pop('update_fields', []) or []
|
||||||
if 'state' not in update_fields:
|
if 'state' not in update_fields:
|
||||||
instance.assign_state()
|
instance.assign_state()
|
||||||
# TODO: how do we prevent running this twice on profile state change?
|
|
||||||
validate_services(instance.user)
|
|
||||||
|
|
||||||
|
|
||||||
@receiver(post_save, sender=User)
|
@receiver(post_save, sender=User)
|
||||||
|
@ -113,7 +113,7 @@
|
|||||||
|
|
||||||
{% if perms.corputils.view_corp_corpstats or perms.corputils.view_alliance_corpstats or perms.corputils.view_blue_corpstats %}
|
{% if perms.corputils.view_corp_corpstats or perms.corputils.view_alliance_corpstats or perms.corputils.view_blue_corpstats %}
|
||||||
<li>
|
<li>
|
||||||
<a class="{% navactive request 'corputils:view corputils:search' %}" href="{% url 'corputils:view' %}">
|
<a class="{% navactive request 'corputils:' %}" href="{% url 'corputils:view' %}">
|
||||||
<i class="fa fa-share-alt fa-fw grayiconecolor"></i>{% trans " Corporation Stats" %}
|
<i class="fa fa-share-alt fa-fw grayiconecolor"></i>{% trans " Corporation Stats" %}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
0
authentication/tests/__init__.py
Normal file
0
authentication/tests/__init__.py
Normal file
51
authentication/tests/test_ownership.py
Normal file
51
authentication/tests/test_ownership.py
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Py3
|
||||||
|
from unittest import mock
|
||||||
|
except ImportError:
|
||||||
|
# Py2
|
||||||
|
import mock
|
||||||
|
|
||||||
|
from django.test import TestCase
|
||||||
|
from alliance_auth.tests.auth_utils import AuthUtils
|
||||||
|
from authentication.models import State, get_guest_state
|
||||||
|
from eveonline.models import EveCharacter, EveCorporationInfo, EveAllianceInfo
|
||||||
|
|
||||||
|
|
||||||
|
class StateTestCase(TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.user = AuthUtils.create_user('test_user', disconnect_signals=True)
|
||||||
|
AuthUtils.add_main_character(self.user, 'Test Character', '1', corp_id='1', alliance_id='1',
|
||||||
|
corp_name='Test Corp', alliance_name='Test Alliance')
|
||||||
|
self.guest_state = get_guest_state()
|
||||||
|
self.test_character = EveCharacter.objects.get(character_id='1')
|
||||||
|
self.test_corporation = EveCorporationInfo.objects.create(corporation_id='1', corporation_name='Test Corp',
|
||||||
|
corporation_ticker='TEST', member_count=1)
|
||||||
|
self.test_alliance = EveAllianceInfo.objects.create(alliance_id='1', alliance_name='Test Alliance',
|
||||||
|
alliance_ticker='TEST', executor_corp_id='1')
|
||||||
|
self.member_state = State.objects.create(
|
||||||
|
name='Test Member',
|
||||||
|
priority=150,
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_state_assignment_on_character_change(self):
|
||||||
|
self.member_state.member_characters.add(self.test_character)
|
||||||
|
self.assertEquals(self.user.profile.state, self.member_state)
|
||||||
|
|
||||||
|
self.member_state.member_characters.remove(self.test_character)
|
||||||
|
self.assertEquals(self.user.profile.state, self.guest_state)
|
||||||
|
|
||||||
|
def test_state_assignment_on_corporation_change(self):
|
||||||
|
self.member_state.member_corporations.add(self.test_corporation)
|
||||||
|
self.assertEquals(self.user.profile.state, self.member_state)
|
||||||
|
|
||||||
|
self.member_state.member_corporations.remove(self.test_corporation)
|
||||||
|
self.assertEquals(self.user.profile.state, self.guest_state)
|
||||||
|
|
||||||
|
def test_state_assignment_on_alliance_addition(self):
|
||||||
|
self.member_state.member_alliances.add(self.test_alliance)
|
||||||
|
self.assertEquals(self.user.profile.state, self.member_state)
|
||||||
|
|
||||||
|
self.member_state.member_alliances.remove(self.test_alliance)
|
||||||
|
self.assertEquals(self.user.profile.state, self.guest_state)
|
@ -13,11 +13,11 @@ redis
|
|||||||
# Django Stuff #
|
# Django Stuff #
|
||||||
django>=1.10,<2.0
|
django>=1.10,<2.0
|
||||||
django-bootstrap-form
|
django-bootstrap-form
|
||||||
django-navhelper
|
|
||||||
django-bootstrap-pagination
|
django-bootstrap-pagination
|
||||||
django-redis>=4.4
|
django-redis>=4.4
|
||||||
django-registration
|
django-registration
|
||||||
django-sortedm2m
|
django-sortedm2m
|
||||||
|
git+https://github.com/adarnof/django-navhelper
|
||||||
|
|
||||||
# awating release for fix to celery/django-celery#447
|
# awating release for fix to celery/django-celery#447
|
||||||
# django-celery
|
# django-celery
|
||||||
|
@ -11,7 +11,8 @@ from django.dispatch import receiver
|
|||||||
|
|
||||||
from services.hooks import ServicesHook
|
from services.hooks import ServicesHook
|
||||||
from services.tasks import disable_user
|
from services.tasks import disable_user
|
||||||
from authentication.models import State
|
from authentication.models import State, UserProfile
|
||||||
|
from authentication.signals import state_changed
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -122,6 +123,19 @@ def m2m_changed_state_permissions(sender, instance, action, pk_set, *args, **kwa
|
|||||||
logger.debug("Permission change for state {} was not service permission, ignoring".format(instance))
|
logger.debug("Permission change for state {} was not service permission, ignoring".format(instance))
|
||||||
|
|
||||||
|
|
||||||
|
@receiver(state_changed, sender=UserProfile)
|
||||||
|
def check_service_accounts_state_changed(sender, user, state, **kwargs):
|
||||||
|
logger.debug("Received state_changed from %s to state %s" % (user, state))
|
||||||
|
service_perms = [svc.access_perm for svc in ServicesHook.get_services()]
|
||||||
|
state_perms = ["{}.{}".format(perm.natural_key()[1], perm.natural_key()[0]) for perm in state.permissions.all()]
|
||||||
|
for perm in service_perms:
|
||||||
|
if perm not in state_perms:
|
||||||
|
for svc in ServicesHook.get_services():
|
||||||
|
if svc.access_perm == perm:
|
||||||
|
logger.debug("User %s new state %s does not have service %s permission. Checking account." % (user, state, svc))
|
||||||
|
svc.validate_user(user)
|
||||||
|
|
||||||
|
|
||||||
@receiver(pre_delete, sender=User)
|
@receiver(pre_delete, sender=User)
|
||||||
def pre_delete_user(sender, instance, *args, **kwargs):
|
def pre_delete_user(sender, instance, *args, **kwargs):
|
||||||
logger.debug("Received pre_delete from %s" % instance)
|
logger.debug("Received pre_delete from %s" % instance)
|
||||||
|
@ -9,13 +9,13 @@ except ImportError:
|
|||||||
|
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.contrib.auth.models import Group, Permission
|
from django.contrib.auth.models import Group, Permission
|
||||||
|
|
||||||
from alliance_auth.tests.auth_utils import AuthUtils
|
from alliance_auth.tests.auth_utils import AuthUtils
|
||||||
|
from authentication.models import State
|
||||||
|
|
||||||
|
|
||||||
class ServicesSignalsTestCase(TestCase):
|
class ServicesSignalsTestCase(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.member = AuthUtils.create_member('auth_member')
|
self.member = AuthUtils.create_user('auth_member', disconnect_signals=True)
|
||||||
self.none_user = AuthUtils.create_user('none_user', disconnect_signals=True)
|
self.none_user = AuthUtils.create_user('none_user', disconnect_signals=True)
|
||||||
|
|
||||||
@mock.patch('services.signals.transaction')
|
@mock.patch('services.signals.transaction')
|
||||||
@ -50,7 +50,6 @@ class ServicesSignalsTestCase(TestCase):
|
|||||||
args, kwargs = svc.validate_user.call_args
|
args, kwargs = svc.validate_user.call_args
|
||||||
self.assertEqual(self.member, args[0])
|
self.assertEqual(self.member, args[0])
|
||||||
|
|
||||||
|
|
||||||
@mock.patch('services.signals.disable_user')
|
@mock.patch('services.signals.disable_user')
|
||||||
def test_pre_delete_user(self, disable_user):
|
def test_pre_delete_user(self, disable_user):
|
||||||
|
|
||||||
@ -75,26 +74,6 @@ class ServicesSignalsTestCase(TestCase):
|
|||||||
args, kwargs = disable_user.call_args
|
args, kwargs = disable_user.call_args
|
||||||
self.assertEqual(self.member, args[0])
|
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])
|
|
||||||
|
|
||||||
@mock.patch('services.signals.transaction')
|
@mock.patch('services.signals.transaction')
|
||||||
@mock.patch('services.signals.ServicesHook')
|
@mock.patch('services.signals.ServicesHook')
|
||||||
def test_m2m_changed_group_permissions(self, services_hook, transaction):
|
def test_m2m_changed_group_permissions(self, services_hook, transaction):
|
||||||
@ -153,3 +132,58 @@ class ServicesSignalsTestCase(TestCase):
|
|||||||
self.assertTrue(svc.validate_user.called)
|
self.assertTrue(svc.validate_user.called)
|
||||||
args, kwargs = svc.validate_user.call_args
|
args, kwargs = svc.validate_user.call_args
|
||||||
self.assertEqual(self.member, args[0])
|
self.assertEqual(self.member, args[0])
|
||||||
|
|
||||||
|
@mock.patch('services.signals.transaction')
|
||||||
|
@mock.patch('services.signals.ServicesHook')
|
||||||
|
def test_m2m_changed_user_state_permissions(self, services_hook, transaction):
|
||||||
|
from django.contrib.contenttypes.models import ContentType
|
||||||
|
svc = mock.Mock()
|
||||||
|
svc.validate_user.return_value = None
|
||||||
|
svc.access_perm = 'auth.access_testsvc'
|
||||||
|
|
||||||
|
services_hook.get_services.return_value = [svc]
|
||||||
|
|
||||||
|
# Overload transaction.on_commit so everything happens synchronously
|
||||||
|
transaction.on_commit = lambda fn: fn()
|
||||||
|
|
||||||
|
AuthUtils.disconnect_signals()
|
||||||
|
test_state = State.objects.create(name="Test state", priority=150)
|
||||||
|
self.member.profile.state = test_state
|
||||||
|
self.member.profile.save()
|
||||||
|
AuthUtils.connect_signals()
|
||||||
|
|
||||||
|
ct = ContentType.objects.get(app_label='auth', model='permission')
|
||||||
|
perm = Permission.objects.create(name="Test perm", codename="access_testsvc", content_type=ct)
|
||||||
|
test_state.permissions.add(perm)
|
||||||
|
|
||||||
|
# Act, should trigger m2m change
|
||||||
|
test_state.permissions.remove(perm)
|
||||||
|
|
||||||
|
# Assert
|
||||||
|
self.assertTrue(services_hook.get_services.called)
|
||||||
|
|
||||||
|
self.assertTrue(svc.validate_user.called)
|
||||||
|
args, kwargs = svc.validate_user.call_args
|
||||||
|
self.assertEqual(self.member, args[0])
|
||||||
|
|
||||||
|
@mock.patch('services.signals.ServicesHook')
|
||||||
|
def test_state_changed_services_valudation(self, services_hook):
|
||||||
|
"""
|
||||||
|
Test a user changing state has service accounts validated
|
||||||
|
"""
|
||||||
|
svc = mock.Mock()
|
||||||
|
svc.validate_user.return_value = None
|
||||||
|
svc.access_perm = 'auth.access_testsvc'
|
||||||
|
|
||||||
|
services_hook.get_services.return_value = [svc]
|
||||||
|
|
||||||
|
test_state = State.objects.create(name="Test state", priority=150, public=True)
|
||||||
|
self.member.profile.state = test_state
|
||||||
|
self.member.profile.save()
|
||||||
|
|
||||||
|
# Assert
|
||||||
|
self.assertTrue(services_hook.get_services.called)
|
||||||
|
|
||||||
|
self.assertTrue(svc.validate_user.called)
|
||||||
|
args, kwargs = svc.validate_user.call_args
|
||||||
|
self.assertEqual(self.member, args[0])
|
Loading…
x
Reference in New Issue
Block a user