From 3c90868338b4d33c19aea1e8458cdc76d771feae Mon Sep 17 00:00:00 2001 From: Adarnof Date: Fri, 11 Aug 2017 17:34:43 -0400 Subject: [PATCH] Correct available states query for character models missing field data Ensure state_changed signals are sent Speed up authentication unit tests Add authentication unit test for state public availability change --- authentication/managers.py | 11 +++-- authentication/signals.py | 2 + authentication/tests.py | 96 +++++++++++++++++++++++--------------- 3 files changed, 67 insertions(+), 42 deletions(-) diff --git a/authentication/managers.py b/authentication/managers.py index 882f363f..4dc9631b 100755 --- a/authentication/managers.py +++ b/authentication/managers.py @@ -8,10 +8,13 @@ logger = logging.getLogger(__name__) def available_states_query(character): - query = Q(member_characters__character_id=character.character_id) - query |= Q(member_corporations__corporation_id=character.corporation_id) - query |= Q(member_alliances__alliance_id=character.alliance_id) - query |= Q(public=True) + query = Q(public=True) + if character.character_id: + query |= Q(member_characters__character_id=character.character_id) + if character.corporation_id: + query |= Q(member_corporations__corporation_id=character.corporation_id) + if character.alliance_id: + query |= Q(member_alliances__alliance_id=character.alliance_id) return query diff --git a/authentication/signals.py b/authentication/signals.py index 1b836ad3..3fba1f35 100644 --- a/authentication/signals.py +++ b/authentication/signals.py @@ -26,6 +26,7 @@ def trigger_state_check(state): if state.available_to_user(profile.user): profile.state = state profile.save(update_fields=['state']) + state_changed.send(sender=state.__class__, user=profile.user, state=state) @receiver(m2m_changed, sender=State.member_characters.through) @@ -60,6 +61,7 @@ def state_deleted(sender, instance, *args, **kwargs): else: profile.state = get_guest_state() profile.save(update_fields=['state']) + state_changed.send(sender=State, user=profile.user, state=profile.state) # Is there a smarter way to intercept pre_save with a diff main_character or state? diff --git a/authentication/tests.py b/authentication/tests.py index 5d2b70ca..75e8dd19 100644 --- a/authentication/tests.py +++ b/authentication/tests.py @@ -17,33 +17,34 @@ from esi.models import Token class BackendTestCase(TestCase): - def setUp(self): - self.main_character = EveCharacter.objects.create( + @classmethod + def setUpTestData(cls): + cls.main_character = EveCharacter.objects.create( character_id=1, character_name='Main Character', corporation_id=1, corporation_name='Corp', corporation_ticker='CORP', ) - self.alt_character = EveCharacter.objects.create( + cls.alt_character = EveCharacter.objects.create( character_id=2, character_name='Alt Character', corporation_id=1, corporation_name='Corp', corporation_ticker='CORP', ) - self.unclaimed_character = EveCharacter.objects.create( + cls.unclaimed_character = EveCharacter.objects.create( character_id=3, character_name='Unclaimed Character', corporation_id=1, corporation_name='Corp', corporation_ticker='CORP', ) - self.user = AuthUtils.create_user('test_user', disconnect_signals=True) + cls.user = AuthUtils.create_user('test_user', disconnect_signals=True) AuthUtils.disconnect_signals() - CharacterOwnership.objects.create(user=self.user, character=self.main_character, owner_hash='1') - CharacterOwnership.objects.create(user=self.user, character=self.alt_character, owner_hash='2') - UserProfile.objects.update_or_create(user=self.user, defaults={'main_character': self.main_character}) + CharacterOwnership.objects.create(user=cls.user, character=cls.main_character, owner_hash='1') + CharacterOwnership.objects.create(user=cls.user, character=cls.alt_character, owner_hash='2') + UserProfile.objects.update_or_create(user=cls.user, defaults={'main_character': cls.main_character}) AuthUtils.connect_signals() def test_authenticate_main_character(self): @@ -77,10 +78,11 @@ class BackendTestCase(TestCase): class CharacterOwnershipTestCase(TestCase): - def setUp(self): - self.user = AuthUtils.create_user('user', disconnect_signals=True) - self.alt_user = AuthUtils.create_user('alt_user', disconnect_signals=True) - self.character = EveCharacter.objects.create( + @classmethod + def setUpTestData(cls): + cls.user = AuthUtils.create_user('user', disconnect_signals=True) + cls.alt_user = AuthUtils.create_user('alt_user', disconnect_signals=True) + cls.character = EveCharacter.objects.create( character_id=1, character_name='Main Character', corporation_id=1, @@ -136,17 +138,18 @@ class CharacterOwnershipTestCase(TestCase): 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', + @classmethod + def setUpTestData(cls): + cls.user = AuthUtils.create_user('test_user', disconnect_signals=True) + AuthUtils.add_main_character(cls.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', + cls.guest_state = get_guest_state() + cls.test_character = EveCharacter.objects.get(character_id='1') + cls.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', + cls.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( + cls.member_state = State.objects.create( name='Test Member', priority=150, ) @@ -183,58 +186,75 @@ class StateTestCase(TestCase): def test_state_assignment_on_higher_priority_state_creation(self): self.member_state.member_characters.add(self.test_character) - self.higher_state = State.objects.create( + higher_state = State.objects.create( name='Higher State', priority=200, ) - self.higher_state.member_characters.add(self.test_character) + higher_state.member_characters.add(self.test_character) self._refresh_user() - self.assertEquals(self.higher_state, self.user.profile.state) - self.higher_state.member_characters.clear() + self.assertEquals(higher_state, self.user.profile.state) + higher_state.member_characters.clear() self._refresh_user() self.assertEquals(self.member_state, self.user.profile.state) self.member_state.member_characters.clear() def test_state_assignment_on_lower_priority_state_creation(self): self.member_state.member_characters.add(self.test_character) - self.lower_state = State.objects.create( + lower_state = State.objects.create( name='Lower State', priority=125, ) - self.lower_state.member_characters.add(self.test_character) + lower_state.member_characters.add(self.test_character) self._refresh_user() self.assertEquals(self.member_state, self.user.profile.state) - self.lower_state.member_characters.clear() + lower_state.member_characters.clear() self._refresh_user() self.assertEquals(self.member_state, self.user.profile.state) self.member_state.member_characters.clear() def test_state_assignment_on_priority_change(self): self.member_state.member_characters.add(self.test_character) - self.lower_state = State.objects.create( + lower_state = State.objects.create( name='Lower State', priority=125, ) - self.lower_state.member_characters.add(self.test_character) + lower_state.member_characters.add(self.test_character) self._refresh_user() - self.lower_state.priority = 500 - self.lower_state.save() + lower_state.priority = 500 + lower_state.save() self._refresh_user() - self.assertEquals(self.lower_state, self.user.profile.state) - self.lower_state.priority = 125 - self.lower_state.save() + self.assertEquals(lower_state, self.user.profile.state) + lower_state.priority = 125 + lower_state.save() self._refresh_user() self.assertEquals(self.member_state, self.user.profile.state) def test_state_assignment_on_state_deletion(self): self.member_state.member_characters.add(self.test_character) - self.higher_state = State.objects.create( + higher_state = State.objects.create( name='Higher State', priority=200, ) - self.higher_state.member_characters.add(self.test_character) + higher_state.member_characters.add(self.test_character) self._refresh_user() - self.assertEquals(self.higher_state, self.user.profile.state) - self.higher_state.delete() + self.assertEquals(higher_state, self.user.profile.state) + higher_state.delete() + self._refresh_user() + self.assertEquals(self.member_state, self.user.profile.state) + + def test_state_assignment_on_public_toggle(self): + self.member_state.member_characters.add(self.test_character) + higher_state = State.objects.create( + name='Higher State', + priority=200, + ) + self._refresh_user() + self.assertEquals(self.member_state, self.user.profile.state) + higher_state.public = True + higher_state.save() + self._refresh_user() + self.assertEquals(higher_state, self.user.profile.state) + higher_state.public = False + higher_state.save() self._refresh_user() self.assertEquals(self.member_state, self.user.profile.state)