From f79d54c7528247e802a86bb5bdc67b46cb40f1bd Mon Sep 17 00:00:00 2001 From: heinzel Date: Sun, 26 Feb 2023 20:25:56 +0100 Subject: [PATCH] Added tests for dav_events.roles --- dav_events/tests/generic.py | 28 ++++-- dav_events/tests/test_apps.py | 1 + dav_events/tests/test_emails.py | 10 +-- dav_events/tests/test_roles.py | 128 +++++++++++++++++++++++++++ dav_events/tests/test_screenshots.py | 32 ++++--- 5 files changed, 171 insertions(+), 28 deletions(-) create mode 100644 dav_events/tests/test_roles.py diff --git a/dav_events/tests/generic.py b/dav_events/tests/generic.py index f12a516..d10b92e 100644 --- a/dav_events/tests/generic.py +++ b/dav_events/tests/generic.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals import datetime import json +import logging import os from django.apps import apps from django.contrib.auth import get_user_model @@ -12,21 +13,30 @@ from ..models.eventstatus import EventStatus class RoleMixin: - def create_user_for_role(self, role_name, password, first_name, last_name): - group = Group(name=role_name) - group.save() + def create_user_for_role(self, role_name, first_name, last_name, password='password'): + app_config = apps.get_app_config('dav_events') + var_name = 'groups_{}'.format(role_name) + if hasattr(app_config.settings, var_name): + # There are groups configured for this role. + # Use the first group name of the configured groups. + group_name = getattr(app_config.settings, var_name)[0] + else: + # There are no groups configured for this role. + # Configure one. + group_name = role_name + setting_name = 'groups_{}'.format(role_name) + setattr(app_config.settings, setting_name, [group_name]) + + # Make sure the configured group exists. + group = Group.objects.get_or_create(name=group_name)[0] user_model = get_user_model() - email = '{}@localhost'.format(role_name) - user_name = email + number = user_model.objects.all().count() + 1 + user_name = 'user{}-{}@localhost'.format(number, role_name) user = user_model.objects.create_user(username=user_name, password=password, email=user_name, first_name=first_name, last_name=last_name) user.groups.add(group) - setting_name = 'groups_{}'.format(role_name) - app_config = apps.get_app_config('dav_events') - setattr(app_config.settings, setting_name, [role_name]) - return user diff --git a/dav_events/tests/test_apps.py b/dav_events/tests/test_apps.py index 80180f5..443ab7d 100644 --- a/dav_events/tests/test_apps.py +++ b/dav_events/tests/test_apps.py @@ -10,6 +10,7 @@ class TestCase(AppsTestCase): AppSetting('enable_email_on_status_update', bool), AppSetting('enable_email_on_update', bool), AppSetting('groups_manager_super', list), + AppSetting('groups_manager_f', list), AppSetting('groups_manager_w', list), AppSetting('groups_manager_s', list), AppSetting('groups_manager_m', list), diff --git a/dav_events/tests/test_emails.py b/dav_events/tests/test_emails.py index f17fb42..91e9200 100644 --- a/dav_events/tests/test_emails.py +++ b/dav_events/tests/test_emails.py @@ -176,11 +176,11 @@ class EmailTestCase(EmailTestMixin, RoleMixin, EventMixin, TestCase): self.event = self.create_event_by_model(event_data) self.trainer = self.event.owner - self.manager_super = self.create_user_for_role('manager_super', 'password', 'Touren', 'Referent') - self.manager_w = self.create_user_for_role('manager_w', 'password', 'Bereichsleiter', 'Wandern') - self.manager_s = self.create_user_for_role('manager_s', 'password', 'Bereichsleiter', 'Ski') - self.publisher_web = self.create_user_for_role('publisher_web', 'password', 'Joomla', 'Redakteur') - self.publisher_facebook = self.create_user_for_role('publisher_facebook', 'password', 'Facebook', 'Redakteur') + self.manager_super = self.create_user_for_role('manager_super', 'Touren', 'Referent') + self.manager_w = self.create_user_for_role('manager_w', 'Bereichsleiter', 'Wandern') + self.manager_s = self.create_user_for_role('manager_s', 'Bereichsleiter', 'Ski') + self.publisher_web = self.create_user_for_role('publisher_web', 'Joomla', 'Redakteur') + self.publisher_facebook = self.create_user_for_role('publisher_facebook', 'Facebook', 'Redakteur') model = get_user_model() self.recipient = model.objects.create_user(username='recipient@example.com', diff --git a/dav_events/tests/test_roles.py b/dav_events/tests/test_roles.py new file mode 100644 index 0000000..321fa41 --- /dev/null +++ b/dav_events/tests/test_roles.py @@ -0,0 +1,128 @@ +from django.apps import apps +from django.contrib.auth import get_user_model +from django.contrib.auth.models import Group +from django.test import TestCase + +from ..roles import get_system_user, get_ghost_user, get_group_members +from ..roles import get_group_names_by_role, get_users_by_role, has_role + +from .generic import RoleMixin + + +class RolesTestCase(RoleMixin, TestCase): + def test_get_system_user(self): + u = get_system_user() + self.assertIsInstance(u, get_user_model()) + self.assertEqual(u.username, '-system-') + self.assertIsNotNone(u.pk) + + def test_get_ghost_user(self): + u = get_ghost_user() + self.assertIsInstance(u, get_user_model()) + self.assertEqual(u.username, '-deleted-') + self.assertIsNotNone(u.pk) + + def test_group_members(self): + # Create some groups + g1 = Group(name='gruppe1') + g1.save() + g2 = Group(name='gruppe2') + g2.save() + + # Create some users and add them to groups + user_model = get_user_model() + u1 = user_model(username='user1') + u1.save() + g1.user_set.add(u1) + u2 = user_model(username='user2') + u2.save() + g1.user_set.add(u2) + u3 = user_model(username='user3') + u3.save() + g2.user_set.add(u3) + + # Create a user, that will belong to no group + u4 = user_model(username='user4') + u4.save() + + # Check results of get_group_members + self.assertSequenceEqual(get_group_members('gruppe1'), [u1, u2]) + self.assertSequenceEqual(get_group_members('gruppe2'), [u3]) + with self.assertRaises(Group.DoesNotExist): + get_group_members('gruppe3') + self.assertSequenceEqual(get_group_members('gruppe3', ignore_missing=True), []) + + def test_get_group_names_by_role_default_config(self): + test_data = [ + ('publisher_print', ['Redaktion_KA-Alpin']), + ('publisher_web', ['Redaktion_Joomla']), + ('publisher_facebook', ['Redaktion_Facebook']), + ('manager_w', ['Bereichsleiter_Wandern', 'Tourenreferenten']), + ('manager_s', ['Bereichsleiter_Ski', 'Tourenreferenten']), + ('manager_m', ['Bereichsleiter_MTB', 'Tourenreferenten']), + ('manager_k', ['Bereichsleiter_Klettern', 'Tourenreferenten']), + ('manager_b', ['Bereichsleiter_Bergsteigen', 'Tourenreferenten']), + ('manager_super', ['Tourenreferenten']), + ('publisher', ['Redaktion_KA-Alpin', 'Redaktion_Joomla', 'Redaktion_Facebook']), + ('manager', ['Bereichsleiter_Wandern', 'Bereichsleiter_Ski', 'Bereichsleiter_MTB', + 'Bereichsleiter_Klettern', 'Bereichsleiter_Bergsteigen', 'Tourenreferenten']), + ('office', ['Geschaeftsstelle']), + ] + for role, expected_group_names in test_data: + group_names = get_group_names_by_role(role) + self.assertEqual(len(group_names), len(expected_group_names)) + for name in group_names: + self.assertIn(name, expected_group_names) + + def get_group_names_by_role_adhoc_config(self): + role_name = 'manager_w' + super_role_name = 'manager_super' + role_groups = ['group1', 'group2'] + super_role_groups = ['group3', 'group4'] + + role_setting = 'groups_{}'.format(role_name) + super_role_setting = 'groups_{}'.format(super_role_name) + + app_config = apps.get_app_config('dav_events') + + buf_role_setting = getattr(app_config.settings, role_setting) + buf_super_role_setting = getattr(app_config.settings, super_role_setting) + + setattr(app_config.settings, role_setting, role_groups) + setattr(app_config.settings, super_role_setting, super_role_groups) + + expected_groups = role_groups + super_role_groups + self.assertSequenceEqual(get_group_names_by_role(role_name), expected_groups) + + setattr(app_config.settings, role_setting, buf_role_setting) + setattr(app_config.settings, super_role_setting, buf_super_role_setting) + + def test_get_group_names_by_role_notexist(self): + self.assertSequenceEqual(get_group_names_by_role('not_existing_test_role'), []) + + def test_get_users_by_role(self): + u1 = self.create_user_for_role('manager_super', 'Touren', 'Referent') + u2 = self.create_user_for_role('manager_super', 'Praktikant', 'Referent') + u3 = self.create_user_for_role('manager_w', 'Bereichsleiter', 'Wandern') + u4 = self.create_user_for_role('manager_w', 'Praktikant', 'Wandern') + u5 = self.create_user_for_role('manager_s', 'Bereichsleiter', 'Ski') + users = get_users_by_role('manager_w') + self.assertSequenceEqual(users, [u1, u2, u3, u4]) + + def test_has_role(self): + u1 = self.create_user_for_role('test_role1', 'User1', 'Test') + u2 = self.create_user_for_role('test_role1', 'User2', 'Test') + u3 = self.create_user_for_role('test_role2', 'User3', 'Test') + u4 = self.create_user_for_role('test_role2', 'User4', 'Test') + + g1 = u1.groups.first() + g1.user_set.add(u4) + + self.assertTrue(has_role(u1, 'test_role1')) + self.assertFalse(has_role(u1, 'test_role2')) + self.assertTrue(has_role(u2, 'test_role1')) + self.assertFalse(has_role(u2, 'test_role2')) + self.assertFalse(has_role(u3, 'test_role1')) + self.assertTrue(has_role(u3, 'test_role2')) + self.assertTrue(has_role(u4, 'test_role1')) + self.assertTrue(has_role(u4, 'test_role2')) \ No newline at end of file diff --git a/dav_events/tests/test_screenshots.py b/dav_events/tests/test_screenshots.py index a211883..78de5aa 100644 --- a/dav_events/tests/test_screenshots.py +++ b/dav_events/tests/test_screenshots.py @@ -658,20 +658,24 @@ class TestCase(SeleniumAuthMixin, RoleMixin, ScreenshotTestCase): def setUp(self): super(TestCase, self).setUp() - - password = TEST_PASSWORD - self.manager_super = self.create_user_for_role('manager_super', password, - 'Manager Super', 'Tourenreferent') - self.manager_w = self.create_user_for_role('manager_w', password, - 'Manager W', 'BereichsleiterWandern') - self.manager_s = self.create_user_for_role('manager_s', password, - 'Manager S', 'BereichsleiterSki') - self.publisher_print = self.create_user_for_role('publisher_print', password, - 'Publisher Print', 'RedaktionPrint') - self.publisher_web = self.create_user_for_role('publisher_web', password, - 'Publisher Web', 'RedaktionWeb') - self.publisher_facebook = self.create_user_for_role('publisher_facebook', password, - 'Publisher Facebook', 'RedaktionFacebook') + self.manager_super = self.create_user_for_role('manager_super', + 'Manager Super', 'Tourenreferent', + password=TEST_PASSWORD) + self.manager_w = self.create_user_for_role('manager_w', + 'Manager W', 'BereichsleiterWandern', + password=TEST_PASSWORD) + self.manager_s = self.create_user_for_role('manager_s', + 'Manager S', 'BereichsleiterSki', + password=TEST_PASSWORD) + self.publisher_print = self.create_user_for_role('publisher_print', + 'Publisher Print', 'RedaktionPrint', + password=TEST_PASSWORD) + self.publisher_web = self.create_user_for_role('publisher_web', + 'Publisher Web', 'RedaktionWeb', + password=TEST_PASSWORD) + self.publisher_facebook = self.create_user_for_role('publisher_facebook', + 'Publisher Facebook', 'RedaktionFacebook', + password=TEST_PASSWORD) def test_screenshots(self): # self.quit_selenium = False