From 8290081365e665352544c2254e94b8b509cf00d7 Mon Sep 17 00:00:00 2001 From: ErikKalkoken Date: Thu, 20 Feb 2020 15:29:54 +0100 Subject: [PATCH] Fix missing import bug in UserAdmin, StateAdmin, add tests for those cases --- allianceauth/authentication/admin.py | 6 +- allianceauth/authentication/tests/__init__.py | 11 + .../authentication/tests/test_admin.py | 369 +++++++++++------- allianceauth/groupmanagement/admin.py | 22 +- .../groupmanagement/tests/__init__.py | 11 + .../groupmanagement/tests/test_admin.py | 13 +- 6 files changed, 282 insertions(+), 150 deletions(-) diff --git a/allianceauth/authentication/admin.py b/allianceauth/authentication/admin.py index 0393168e..653e89b3 100644 --- a/allianceauth/authentication/admin.py +++ b/allianceauth/authentication/admin.py @@ -18,14 +18,14 @@ from django.utils.text import slugify from allianceauth.authentication.models import State, get_guest_state,\ CharacterOwnership, UserProfile, OwnershipRecord from allianceauth.hooks import get_hooks -from allianceauth.eveonline.models import EveCharacter, EveCorporationInfo +from allianceauth.eveonline.models import EveCharacter, EveCorporationInfo,\ + EveAllianceInfo from allianceauth.eveonline.tasks import update_character from .app_settings import AUTHENTICATION_ADMIN_USERS_MAX_GROUPS, \ AUTHENTICATION_ADMIN_USERS_MAX_CHARS if 'allianceauth.eveonline.autogroups' in settings.INSTALLED_APPS: - _has_auto_groups = True - from allianceauth.eveonline.autogroups.models import * + _has_auto_groups = True else: _has_auto_groups = False diff --git a/allianceauth/authentication/tests/__init__.py b/allianceauth/authentication/tests/__init__.py index e69de29b..c886d262 100644 --- a/allianceauth/authentication/tests/__init__.py +++ b/allianceauth/authentication/tests/__init__.py @@ -0,0 +1,11 @@ +from django.urls import reverse + + +def get_admin_change_view_url(obj: object) -> str: + return reverse( + 'admin:{}_{}_change'.format( + obj._meta.app_label, + type(obj).__name__.lower() + ), + args=(obj.pk,) + ) \ No newline at end of file diff --git a/allianceauth/authentication/tests/test_admin.py b/allianceauth/authentication/tests/test_admin.py index 2c048c23..22663a30 100644 --- a/allianceauth/authentication/tests/test_admin.py +++ b/allianceauth/authentication/tests/test_admin.py @@ -4,23 +4,30 @@ from django.conf import settings from django.contrib import admin from django.contrib.admin.sites import AdminSite from django.contrib.auth.models import User as BaseUser, Group -from django.test import TestCase, RequestFactory +from django.test import TestCase, RequestFactory, Client -from allianceauth.authentication.models import CharacterOwnership, State +from allianceauth.authentication.models import CharacterOwnership, State, \ + OwnershipRecord from allianceauth.eveonline.models import ( EveCharacter, EveCorporationInfo, EveAllianceInfo ) +from allianceauth.tests.auth_utils import AuthUtils from ..admin import ( - BaseUserAdmin, + BaseUserAdmin, + CharacterOwnershipAdmin, + PermissionAdmin, + StateAdmin, MainCorporationsFilter, MainAllianceFilter, + OwnershipRecordAdmin, User, UserAdmin, user_main_organization, user_profile_pic, - user_username, + user_username, ) +from . import get_admin_change_view_url if 'allianceauth.eveonline.autogroups' in settings.INSTALLED_APPS: _has_auto_groups = True @@ -31,151 +38,232 @@ else: MODULE_PATH = 'allianceauth.authentication.admin' -class MockRequest(object): - +class MockRequest(object): def __init__(self, user=None): self.user = user +def create_test_data(): + # groups + group_1 = Group.objects.create( + name='Group 1' + ) + group_2 = Group.objects.create( + name='Group 2' + ) + + # user 1 - corp and alliance, normal user + character_1 = EveCharacter.objects.create( + character_id='1001', + character_name='Bruce Wayne', + corporation_id='2001', + corporation_name='Wayne Technologies', + corporation_ticker='WT', + alliance_id='3001', + alliance_name='Wayne Enterprises', + alliance_ticker='WE', + ) + character_1a = EveCharacter.objects.create( + character_id='1002', + character_name='Batman', + corporation_id='2001', + corporation_name='Wayne Technologies', + corporation_ticker='WT', + alliance_id='3001', + alliance_name='Wayne Enterprises', + alliance_ticker='WE', + ) + alliance = EveAllianceInfo.objects.create( + alliance_id='3001', + alliance_name='Wayne Enterprises', + alliance_ticker='WE', + executor_corp_id='2001' + ) + EveCorporationInfo.objects.create( + corporation_id='2001', + corporation_name='Wayne Technologies', + corporation_ticker='WT', + member_count=42, + alliance=alliance + ) + user_1 = User.objects.create_user( + character_1.character_name.replace(' ', '_'), + 'abc@example.com', + 'password' + ) + CharacterOwnership.objects.create( + character=character_1, + owner_hash='x1' + character_1.character_name, + user=user_1 + ) + CharacterOwnership.objects.create( + character=character_1a, + owner_hash='x1' + character_1a.character_name, + user=user_1 + ) + user_1.profile.main_character = character_1 + user_1.profile.save() + user_1.groups.add(group_1) + + # user 2 - corp only, staff + character_2 = EveCharacter.objects.create( + character_id=1003, + character_name='Clark Kent', + corporation_id=2002, + corporation_name='Daily Planet', + corporation_ticker='DP', + alliance_id=None + ) + EveCorporationInfo.objects.create( + corporation_id=2002, + corporation_name='Daily Plane', + corporation_ticker='DP', + member_count=99, + alliance=None + ) + user_2 = User.objects.create_user( + character_2.character_name.replace(' ', '_'), + 'abc@example.com', + 'password' + ) + CharacterOwnership.objects.create( + character=character_2, + owner_hash='x1' + character_2.character_name, + user=user_2 + ) + user_2.profile.main_character = character_2 + user_2.profile.save() + user_2.groups.add(group_2) + user_2.is_staff = True + user_2.save() + + # user 3 - no main, no group, superuser + character_3 = EveCharacter.objects.create( + character_id=1101, + character_name='Lex Luthor', + corporation_id=2101, + corporation_name='Lex Corp', + corporation_ticker='LC', + alliance_id=None + ) + EveCorporationInfo.objects.create( + corporation_id=2101, + corporation_name='Lex Corp', + corporation_ticker='LC', + member_count=666, + alliance=None + ) + EveAllianceInfo.objects.create( + alliance_id='3101', + alliance_name='Lex World Domination', + alliance_ticker='LWD', + executor_corp_id='' + ) + user_3 = User.objects.create_user( + character_3.character_name.replace(' ', '_'), + 'abc@example.com', + 'password' + ) + CharacterOwnership.objects.create( + character=character_3, + owner_hash='x1' + character_3.character_name, + user=user_3 + ) + user_3.is_superuser = True + user_3.save() + return user_1, user_2, user_3, group_1, group_2 + + +class TestCharacterOwnershipAdmin(TestCase): + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.user_1, _, _, _, _ = create_test_data() + + def setUp(self): + self.modeladmin = CharacterOwnershipAdmin( + model=User, admin_site=AdminSite() + ) + + def test_change_view_loads_normally(self): + User.objects.create_superuser( + username='superuser', password='secret', email='admin@example.com' + ) + c = Client() + c.login(username='superuser', password='secret') + ownership = self.user_1.character_ownerships.first() + response = c.get(get_admin_change_view_url(ownership)) + self.assertEqual(response.status_code, 200) + + +class TestOwnershipRecordAdmin(TestCase): + + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.user_1, _, _, _, _ = create_test_data() + + def setUp(self): + self.modeladmin = OwnershipRecordAdmin( + model=User, admin_site=AdminSite() + ) + + def test_change_view_loads_normally(self): + User.objects.create_superuser( + username='superuser', password='secret', email='admin@example.com' + ) + c = Client() + c.login(username='superuser', password='secret') + ownership_record = OwnershipRecord.objects\ + .filter(user=self.user_1)\ + .first() + response = c.get(get_admin_change_view_url(ownership_record)) + self.assertEqual(response.status_code, 200) + + +class TestStateAdmin(TestCase): + + @classmethod + def setUpClass(cls): + super().setUpClass() + create_test_data() + + def setUp(self): + self.modeladmin = StateAdmin( + model=User, admin_site=AdminSite() + ) + + def test_change_view_loads_normally(self): + User.objects.create_superuser( + username='superuser', password='secret', email='admin@example.com' + ) + c = Client() + c.login(username='superuser', password='secret') + + guest_state = AuthUtils.get_guest_state() + response = c.get(get_admin_change_view_url(guest_state)) + self.assertEqual(response.status_code, 200) + + member_state = AuthUtils.get_member_state() + response = c.get(get_admin_change_view_url(member_state)) + self.assertEqual(response.status_code, 200) + + class TestUserAdmin(TestCase): @classmethod def setUpClass(cls): - super().setUpClass() - - # groups - cls.group_1 = Group.objects.create( - name='Group 1' - ) - cls.group_2 = Group.objects.create( - name='Group 2' - ) - - # user 1 - corp and alliance, normal user - cls.character_1 = EveCharacter.objects.create( - character_id='1001', - character_name='Bruce Wayne', - corporation_id='2001', - corporation_name='Wayne Technologies', - corporation_ticker='WT', - alliance_id='3001', - alliance_name='Wayne Enterprises', - alliance_ticker='WE', - ) - cls.character_1a = EveCharacter.objects.create( - character_id='1002', - character_name='Batman', - corporation_id='2001', - corporation_name='Wayne Technologies', - corporation_ticker='WT', - alliance_id='3001', - alliance_name='Wayne Enterprises', - alliance_ticker='WE', - ) - alliance = EveAllianceInfo.objects.create( - alliance_id='3001', - alliance_name='Wayne Enterprises', - alliance_ticker='WE', - executor_corp_id='2001' - ) - EveCorporationInfo.objects.create( - corporation_id='2001', - corporation_name='Wayne Technologies', - corporation_ticker='WT', - member_count=42, - alliance=alliance - ) - cls.user_1 = User.objects.create_user( - cls.character_1.character_name.replace(' ', '_'), - 'abc@example.com', - 'password' - ) - CharacterOwnership.objects.create( - character=cls.character_1, - owner_hash='x1' + cls.character_1.character_name, - user=cls.user_1 - ) - CharacterOwnership.objects.create( - character=cls.character_1a, - owner_hash='x1' + cls.character_1a.character_name, - user=cls.user_1 - ) - cls.user_1.profile.main_character = cls.character_1 - cls.user_1.profile.save() - cls.user_1.groups.add(cls.group_1) - - # user 2 - corp only, staff - cls.character_2 = EveCharacter.objects.create( - character_id=1003, - character_name='Clark Kent', - corporation_id=2002, - corporation_name='Daily Planet', - corporation_ticker='DP', - alliance_id=None - ) - EveCorporationInfo.objects.create( - corporation_id=2002, - corporation_name='Daily Plane', - corporation_ticker='DP', - member_count=99, - alliance=None - ) - cls.user_2 = User.objects.create_user( - cls.character_2.character_name.replace(' ', '_'), - 'abc@example.com', - 'password' - ) - CharacterOwnership.objects.create( - character=cls.character_2, - owner_hash='x1' + cls.character_2.character_name, - user=cls.user_2 - ) - cls.user_2.profile.main_character = cls.character_2 - cls.user_2.profile.save() - cls.user_2.groups.add(cls.group_2) - cls.user_2.is_staff = True - cls.user_2.save() - - # user 3 - no main, no group, superuser - cls.character_3 = EveCharacter.objects.create( - character_id=1101, - character_name='Lex Luthor', - corporation_id=2101, - corporation_name='Lex Corp', - corporation_ticker='LC', - alliance_id=None - ) - EveCorporationInfo.objects.create( - corporation_id=2101, - corporation_name='Lex Corp', - corporation_ticker='LC', - member_count=666, - alliance=None - ) - EveAllianceInfo.objects.create( - alliance_id='3101', - alliance_name='Lex World Domination', - alliance_ticker='LWD', - executor_corp_id='' - ) - cls.user_3 = User.objects.create_user( - cls.character_3.character_name.replace(' ', '_'), - 'abc@example.com', - 'password' - ) - CharacterOwnership.objects.create( - character=cls.character_3, - owner_hash='x1' + cls.character_3.character_name, - user=cls.user_3 - ) - cls.user_3.is_superuser = True - cls.user_3.save() + super().setUpClass() + cls.user_1, cls.user_2, cls.user_3, cls.group_1, cls.group_2 = \ + create_test_data() def setUp(self): self.factory = RequestFactory() self.modeladmin = UserAdmin( model=User, admin_site=AdminSite() ) + self.character_1 = self.user_1.character_ownerships.first().character def _create_autogroups(self): """create autogroups for corps and alliances""" @@ -442,4 +530,13 @@ class TestUserAdmin(TestCase): changelist = my_modeladmin.get_changelist_instance(request) queryset = changelist.get_queryset(request) expected = [self.user_1] - self.assertSetEqual(set(queryset), set(expected)) \ No newline at end of file + self.assertSetEqual(set(queryset), set(expected)) + + def test_change_view_loads_normally(self): + User.objects.create_superuser( + username='superuser', password='secret', email='admin@example.com' + ) + c = Client() + c.login(username='superuser', password='secret') + response = c.get(get_admin_change_view_url(self.user_1)) + self.assertEqual(response.status_code, 200) diff --git a/allianceauth/groupmanagement/admin.py b/allianceauth/groupmanagement/admin.py index e9e52362..d03a4929 100644 --- a/allianceauth/groupmanagement/admin.py +++ b/allianceauth/groupmanagement/admin.py @@ -1,7 +1,7 @@ from django.conf import settings from django.contrib import admin -from django.contrib.auth.models import Group as BaseGroup +from django.contrib.auth.models import Group as BaseGroup, User from django.db.models import Count from django.db.models.functions import Lower from django.db.models.signals import pre_save, post_save, pre_delete, \ @@ -13,8 +13,7 @@ from .models import GroupRequest from . import signals if 'allianceauth.eveonline.autogroups' in settings.INSTALLED_APPS: - _has_auto_groups = True - from allianceauth.eveonline.autogroups.models import * + _has_auto_groups = True else: _has_auto_groups = False @@ -22,19 +21,24 @@ else: class AuthGroupInlineAdmin(admin.StackedInline): model = AuthGroup filter_horizontal = ('group_leaders', 'group_leader_groups', 'states',) - fields = ('description', 'group_leaders', 'group_leader_groups', 'states', 'internal', 'hidden', 'open', 'public') + fields = ( + 'description', + 'group_leaders', + 'group_leader_groups', + 'states', 'internal', + 'hidden', + 'open', + 'public' + ) verbose_name_plural = 'Auth Settings' verbose_name = '' def formfield_for_manytomany(self, db_field, request, **kwargs): """overriding this formfield to have sorted lists in the form""" if db_field.name == "group_leaders": - kwargs["queryset"] = User.objects\ - .filter(profile__state__name='Member')\ - .order_by(Lower('username')) + kwargs["queryset"] = User.objects.order_by(Lower('username')) elif db_field.name == "group_leader_groups": - kwargs["queryset"] = Group.objects\ - .order_by(Lower('name')) + kwargs["queryset"] = Group.objects.order_by(Lower('name')) return super().formfield_for_manytomany(db_field, request, **kwargs) def has_add_permission(self, request): diff --git a/allianceauth/groupmanagement/tests/__init__.py b/allianceauth/groupmanagement/tests/__init__.py index e69de29b..c886d262 100644 --- a/allianceauth/groupmanagement/tests/__init__.py +++ b/allianceauth/groupmanagement/tests/__init__.py @@ -0,0 +1,11 @@ +from django.urls import reverse + + +def get_admin_change_view_url(obj: object) -> str: + return reverse( + 'admin:{}_{}_change'.format( + obj._meta.app_label, + type(obj).__name__.lower() + ), + args=(obj.pk,) + ) \ No newline at end of file diff --git a/allianceauth/groupmanagement/tests/test_admin.py b/allianceauth/groupmanagement/tests/test_admin.py index d25779af..387eb6df 100644 --- a/allianceauth/groupmanagement/tests/test_admin.py +++ b/allianceauth/groupmanagement/tests/test_admin.py @@ -4,7 +4,7 @@ from django.conf import settings from django.contrib import admin from django.contrib.admin.sites import AdminSite from django.contrib.auth.models import User -from django.test import TestCase, RequestFactory +from django.test import TestCase, RequestFactory, Client from allianceauth.authentication.models import CharacterOwnership, State from allianceauth.eveonline.models import ( @@ -16,6 +16,7 @@ from ..admin import ( GroupAdmin, Group ) +from . import get_admin_change_view_url if 'allianceauth.eveonline.autogroups' in settings.INSTALLED_APPS: _has_auto_groups = True @@ -385,4 +386,12 @@ class TestGroupAdmin(TestCase): self.group_3 ] self.assertSetEqual(set(queryset), set(expected)) - \ No newline at end of file + + def test_change_view_loads_normally(self): + User.objects.create_superuser( + username='superuser', password='secret', email='admin@example.com' + ) + c = Client() + c.login(username='superuser', password='secret') + response = c.get(get_admin_change_view_url(self.group_1)) + self.assertEqual(response.status_code, 200) \ No newline at end of file