Add option to notify approvers about new group requests

This commit is contained in:
Erik Kalkoken
2021-11-20 01:32:20 +00:00
committed by Ariel Rin
parent 2bd2c09c23
commit 982cac8c43
8 changed files with 411 additions and 160 deletions

View File

@@ -1,31 +1,22 @@
from unittest import mock
from django.contrib.auth.models import User, Group
from django.test import TestCase
from django.contrib.auth.models import Group
from django.test import TestCase, override_settings
from allianceauth.tests.auth_utils import AuthUtils
from allianceauth.eveonline.models import (
EveCorporationInfo, EveAllianceInfo, EveCharacter
)
from ..models import GroupRequest, RequestLog
MODULE_PATH = "allianceauth.groupmanagement.models"
def create_testdata():
# clear DB
User.objects.all().delete()
Group.objects.all().delete()
EveCharacter.objects.all().delete()
EveCorporationInfo.objects.all().delete()
EveAllianceInfo.objects.all().delete()
# group 1
group = Group.objects.create(name='Superheros')
group.authgroup.description = 'Default Group'
group.authgroup.internal = False
group.authgroup.hidden = False
group.authgroup.save()
# user 1
user_1 = AuthUtils.create_user('Bruce Wayne')
AuthUtils.add_main_character_2(
@@ -37,7 +28,6 @@ def create_testdata():
)
user_1.groups.add(group)
group.authgroup.group_leaders.add(user_1)
# user 2
user_2 = AuthUtils.create_user('Clark Kent')
AuthUtils.add_main_character_2(
@@ -45,18 +35,25 @@ def create_testdata():
name='Clark Kent',
character_id=1002,
corp_id=2002,
corp_name='Wayne Technologies'
corp_name='Wayne Food'
)
return group, user_1, user_2
# user 3
user_3 = AuthUtils.create_user('Peter Parker')
AuthUtils.add_main_character_2(
user_2,
name='Peter Parker',
character_id=1003,
corp_id=2002,
corp_name='Wayne Food'
)
return group, user_1, user_2, user_3
class TestGroupRequest(TestCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.group, cls.user_1, _ = create_testdata()
cls.group, cls.user_1, cls.user_2, cls.user_3 = create_testdata()
def test_main_char(self):
group_request = GroupRequest.objects.create(
@@ -74,13 +71,85 @@ class TestGroupRequest(TestCase):
expected = 'Bruce Wayne:Superheros'
self.assertEqual(str(group_request), expected)
@override_settings(GROUPMANAGEMENT_REQUESTS_NOTIFICATION=True)
def test_should_notify_leaders_about_join_request(self):
# given
group_request = GroupRequest.objects.create(
user=self.user_2, group=self.group
)
# when
with mock.patch(MODULE_PATH + ".notify") as mock_notify:
group_request.notify_leaders()
# then
self.assertTrue(mock_notify.called)
_, kwargs = mock_notify.call_args
self.assertEqual(kwargs["user"],self.user_1)
@override_settings(GROUPMANAGEMENT_REQUESTS_NOTIFICATION=True)
def test_should_notify_leaders_about_leave_request(self):
# given
group_request = GroupRequest.objects.create(
user=self.user_2, group=self.group
)
# when
with mock.patch(MODULE_PATH + ".notify") as mock_notify:
group_request.notify_leaders()
# then
self.assertTrue(mock_notify.called)
@override_settings(GROUPMANAGEMENT_REQUESTS_NOTIFICATION=True)
def test_should_handle_notify_leaders_without_leaders(self):
# given
group = Group.objects.create(name='Dummy')
group.authgroup.internal = False
group.authgroup.hidden = False
group.authgroup.save()
group_request = GroupRequest.objects.create(
user=self.user_2, group=group
)
# when
with mock.patch(MODULE_PATH + ".notify") as mock_notify:
group_request.notify_leaders()
# then
self.assertFalse(mock_notify.called)
@override_settings(GROUPMANAGEMENT_REQUESTS_NOTIFICATION=False)
def test_should_not_notify_leaders_if_disabled(self):
# given
group_request = GroupRequest.objects.create(
user=self.user_2, group=self.group
)
# when
with mock.patch(MODULE_PATH + ".notify") as mock_notify:
group_request.notify_leaders()
# then
self.assertFalse(mock_notify.called)
@override_settings(GROUPMANAGEMENT_REQUESTS_NOTIFICATION=True)
def test_should_notify_members_of_leader_groups_about_join_request(self):
# given
child_group = Group.objects.create(name='Child')
child_group.authgroup.internal = False
child_group.authgroup.hidden = False
child_group.authgroup.save()
child_group.authgroup.group_leader_groups.add(self.group)
group_request = GroupRequest.objects.create(
user=self.user_2, group=child_group
)
# when
with mock.patch(MODULE_PATH + ".notify") as mock_notify:
group_request.notify_leaders()
# then
self.assertTrue(mock_notify.called)
_, kwargs = mock_notify.call_args
self.assertEqual(kwargs["user"],self.user_1)
class TestRequestLog(TestCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.group, cls.user_1, cls.user_2 = create_testdata()
cls.group, cls.user_1, cls.user_2, _ = create_testdata()
def test_requestor(self):
request_log = RequestLog.objects.create(
@@ -126,7 +195,7 @@ class TestRequestLog(TestCase):
group=self.group,
request_info='Clark Kent:Superheros',
request_actor=self.user_1,
action = True
action=True
)
expected = 'Accept'
self.assertEqual(request_log.action_to_str(), expected)
@@ -136,7 +205,7 @@ class TestRequestLog(TestCase):
group=self.group,
request_info='Clark Kent:Superheros',
request_actor=self.user_1,
action = False
action=False
)
expected = 'Reject'
self.assertEqual(request_log.action_to_str(), expected)
@@ -146,14 +215,13 @@ class TestRequestLog(TestCase):
group=self.group,
request_info='Clark Kent:Superheros',
request_actor=self.user_1,
action = False
action=False
)
expected = self.user_2.profile.main_character
self.assertEqual(request_log.req_char(), expected)
class TestAuthGroup(TestCase):
def test_str(self):
group = Group.objects.create(name='Superheros')
group.authgroup.description = 'Default Group'
@@ -163,3 +231,56 @@ class TestAuthGroup(TestCase):
expected = 'Superheros'
self.assertEqual(str(group.authgroup), expected)
class TestAuthGroupRequestApprovers(TestCase):
def setUp(self) -> None:
self.group, self.user_1, self.user_2, self.user_3 = create_testdata()
def test_should_return_leaders_of_main_group_only(self):
# when
leaders = self.group.authgroup.group_request_approvers()
# then
self.assertSetEqual(leaders, {self.user_1})
def test_should_return_members_of_leading_groups_only(self):
# given
parent_group = Group.objects.create(name='Parent')
parent_group.authgroup.group_leaders.add(self.user_2)
self.user_1.groups.add(parent_group)
child_group = Group.objects.create(name='Child')
child_group.authgroup.internal = False
child_group.authgroup.hidden = False
child_group.authgroup.save()
child_group.authgroup.group_leader_groups.add(parent_group)
# when
leaders = child_group.authgroup.group_request_approvers()
# then
self.assertSetEqual(leaders, {self.user_1})
def test_should_return_leaders_of_main_group_and_members_of_leading_groups(self):
# given
parent_group = Group.objects.create(name='Parent')
parent_group.authgroup.group_leaders.add(self.user_2)
self.user_1.groups.add(parent_group)
child_group = Group.objects.create(name='Child')
child_group.authgroup.internal = False
child_group.authgroup.hidden = False
child_group.authgroup.save()
child_group.authgroup.group_leaders.add(self.user_3)
child_group.authgroup.group_leader_groups.add(self.group)
# when
leaders = child_group.authgroup.group_request_approvers()
# then
self.assertSetEqual(leaders, {self.user_1, self.user_3})
def test_can_handle_group_without_leaders(self):
# given
child_group = Group.objects.create(name='Child')
child_group.authgroup.internal = False
child_group.authgroup.hidden = False
child_group.authgroup.save()
# when
leaders = child_group.authgroup.group_request_approvers()
# then
self.assertSetEqual(leaders, set())