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
This commit is contained in:
Adarnof 2017-08-11 17:34:43 -04:00
parent 84b1ddc5d9
commit 3c90868338
3 changed files with 67 additions and 42 deletions

View File

@ -8,10 +8,13 @@ logger = logging.getLogger(__name__)
def available_states_query(character): def available_states_query(character):
query = Q(member_characters__character_id=character.character_id) query = Q(public=True)
query |= Q(member_corporations__corporation_id=character.corporation_id) if character.character_id:
query |= Q(member_alliances__alliance_id=character.alliance_id) query |= Q(member_characters__character_id=character.character_id)
query |= Q(public=True) 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 return query

View File

@ -26,6 +26,7 @@ def trigger_state_check(state):
if state.available_to_user(profile.user): if state.available_to_user(profile.user):
profile.state = state profile.state = state
profile.save(update_fields=['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) @receiver(m2m_changed, sender=State.member_characters.through)
@ -60,6 +61,7 @@ def state_deleted(sender, instance, *args, **kwargs):
else: else:
profile.state = get_guest_state() profile.state = get_guest_state()
profile.save(update_fields=['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? # Is there a smarter way to intercept pre_save with a diff main_character or state?

View File

@ -17,33 +17,34 @@ from esi.models import Token
class BackendTestCase(TestCase): class BackendTestCase(TestCase):
def setUp(self): @classmethod
self.main_character = EveCharacter.objects.create( def setUpTestData(cls):
cls.main_character = EveCharacter.objects.create(
character_id=1, character_id=1,
character_name='Main Character', character_name='Main Character',
corporation_id=1, corporation_id=1,
corporation_name='Corp', corporation_name='Corp',
corporation_ticker='CORP', corporation_ticker='CORP',
) )
self.alt_character = EveCharacter.objects.create( cls.alt_character = EveCharacter.objects.create(
character_id=2, character_id=2,
character_name='Alt Character', character_name='Alt Character',
corporation_id=1, corporation_id=1,
corporation_name='Corp', corporation_name='Corp',
corporation_ticker='CORP', corporation_ticker='CORP',
) )
self.unclaimed_character = EveCharacter.objects.create( cls.unclaimed_character = EveCharacter.objects.create(
character_id=3, character_id=3,
character_name='Unclaimed Character', character_name='Unclaimed Character',
corporation_id=1, corporation_id=1,
corporation_name='Corp', corporation_name='Corp',
corporation_ticker='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() AuthUtils.disconnect_signals()
CharacterOwnership.objects.create(user=self.user, character=self.main_character, owner_hash='1') CharacterOwnership.objects.create(user=cls.user, character=cls.main_character, owner_hash='1')
CharacterOwnership.objects.create(user=self.user, character=self.alt_character, owner_hash='2') CharacterOwnership.objects.create(user=cls.user, character=cls.alt_character, owner_hash='2')
UserProfile.objects.update_or_create(user=self.user, defaults={'main_character': self.main_character}) UserProfile.objects.update_or_create(user=cls.user, defaults={'main_character': cls.main_character})
AuthUtils.connect_signals() AuthUtils.connect_signals()
def test_authenticate_main_character(self): def test_authenticate_main_character(self):
@ -77,10 +78,11 @@ class BackendTestCase(TestCase):
class CharacterOwnershipTestCase(TestCase): class CharacterOwnershipTestCase(TestCase):
def setUp(self): @classmethod
self.user = AuthUtils.create_user('user', disconnect_signals=True) def setUpTestData(cls):
self.alt_user = AuthUtils.create_user('alt_user', disconnect_signals=True) cls.user = AuthUtils.create_user('user', disconnect_signals=True)
self.character = EveCharacter.objects.create( cls.alt_user = AuthUtils.create_user('alt_user', disconnect_signals=True)
cls.character = EveCharacter.objects.create(
character_id=1, character_id=1,
character_name='Main Character', character_name='Main Character',
corporation_id=1, corporation_id=1,
@ -136,17 +138,18 @@ class CharacterOwnershipTestCase(TestCase):
class StateTestCase(TestCase): class StateTestCase(TestCase):
def setUp(self): @classmethod
self.user = AuthUtils.create_user('test_user', disconnect_signals=True) def setUpTestData(cls):
AuthUtils.add_main_character(self.user, 'Test Character', '1', corp_id='1', alliance_id='1', 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') corp_name='Test Corp', alliance_name='Test Alliance')
self.guest_state = get_guest_state() cls.guest_state = get_guest_state()
self.test_character = EveCharacter.objects.get(character_id='1') cls.test_character = EveCharacter.objects.get(character_id='1')
self.test_corporation = EveCorporationInfo.objects.create(corporation_id='1', corporation_name='Test Corp', cls.test_corporation = EveCorporationInfo.objects.create(corporation_id='1', corporation_name='Test Corp',
corporation_ticker='TEST', member_count=1) 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') alliance_ticker='TEST', executor_corp_id='1')
self.member_state = State.objects.create( cls.member_state = State.objects.create(
name='Test Member', name='Test Member',
priority=150, priority=150,
) )
@ -183,58 +186,75 @@ class StateTestCase(TestCase):
def test_state_assignment_on_higher_priority_state_creation(self): def test_state_assignment_on_higher_priority_state_creation(self):
self.member_state.member_characters.add(self.test_character) self.member_state.member_characters.add(self.test_character)
self.higher_state = State.objects.create( higher_state = State.objects.create(
name='Higher State', name='Higher State',
priority=200, priority=200,
) )
self.higher_state.member_characters.add(self.test_character) higher_state.member_characters.add(self.test_character)
self._refresh_user() self._refresh_user()
self.assertEquals(self.higher_state, self.user.profile.state) self.assertEquals(higher_state, self.user.profile.state)
self.higher_state.member_characters.clear() higher_state.member_characters.clear()
self._refresh_user() self._refresh_user()
self.assertEquals(self.member_state, self.user.profile.state) self.assertEquals(self.member_state, self.user.profile.state)
self.member_state.member_characters.clear() self.member_state.member_characters.clear()
def test_state_assignment_on_lower_priority_state_creation(self): def test_state_assignment_on_lower_priority_state_creation(self):
self.member_state.member_characters.add(self.test_character) self.member_state.member_characters.add(self.test_character)
self.lower_state = State.objects.create( lower_state = State.objects.create(
name='Lower State', name='Lower State',
priority=125, priority=125,
) )
self.lower_state.member_characters.add(self.test_character) lower_state.member_characters.add(self.test_character)
self._refresh_user() self._refresh_user()
self.assertEquals(self.member_state, self.user.profile.state) self.assertEquals(self.member_state, self.user.profile.state)
self.lower_state.member_characters.clear() lower_state.member_characters.clear()
self._refresh_user() self._refresh_user()
self.assertEquals(self.member_state, self.user.profile.state) self.assertEquals(self.member_state, self.user.profile.state)
self.member_state.member_characters.clear() self.member_state.member_characters.clear()
def test_state_assignment_on_priority_change(self): def test_state_assignment_on_priority_change(self):
self.member_state.member_characters.add(self.test_character) self.member_state.member_characters.add(self.test_character)
self.lower_state = State.objects.create( lower_state = State.objects.create(
name='Lower State', name='Lower State',
priority=125, priority=125,
) )
self.lower_state.member_characters.add(self.test_character) lower_state.member_characters.add(self.test_character)
self._refresh_user() self._refresh_user()
self.lower_state.priority = 500 lower_state.priority = 500
self.lower_state.save() lower_state.save()
self._refresh_user() self._refresh_user()
self.assertEquals(self.lower_state, self.user.profile.state) self.assertEquals(lower_state, self.user.profile.state)
self.lower_state.priority = 125 lower_state.priority = 125
self.lower_state.save() lower_state.save()
self._refresh_user() self._refresh_user()
self.assertEquals(self.member_state, self.user.profile.state) self.assertEquals(self.member_state, self.user.profile.state)
def test_state_assignment_on_state_deletion(self): def test_state_assignment_on_state_deletion(self):
self.member_state.member_characters.add(self.test_character) self.member_state.member_characters.add(self.test_character)
self.higher_state = State.objects.create( higher_state = State.objects.create(
name='Higher State', name='Higher State',
priority=200, priority=200,
) )
self.higher_state.member_characters.add(self.test_character) higher_state.member_characters.add(self.test_character)
self._refresh_user() self._refresh_user()
self.assertEquals(self.higher_state, self.user.profile.state) self.assertEquals(higher_state, self.user.profile.state)
self.higher_state.delete() 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._refresh_user()
self.assertEquals(self.member_state, self.user.profile.state) self.assertEquals(self.member_state, self.user.profile.state)