from datetime import date, datetime, timedelta from django.test import TestCase from django.utils import timezone from members.models import (Profile, Member, Membership) from members.views import filter_users class MemberBirthdayTest(TestCase): fixtures = ['members.json'] def _make_date(self, date): return timezone.make_aware(datetime.strptime(date, '%Y-%m-%d')) def _get_members(self, start, end): start_date = self._make_date(start) end_date = self._make_date(end) return Member.active_members.with_birthdays_in_range( start_date, end_date ) def _assert_none(self, start, end): members = self._get_members(start, end) self.assertEqual(len(members), 0) def _assert_thom(self, start, end): members = self._get_members(start, end) self.assertEqual(len(members), 1) self.assertEqual(members[0].get_full_name(), 'Thom Wiggers') def test_one_year_contains_birthday(self): self._assert_thom('2016-03-02', '2016-08-08') def test_one_year_not_contains_birthday(self): self._assert_none('2016-01-01', '2016-02-01') def test_span_year_contains_birthday(self): self._assert_thom('2015-08-09', '2016-08-08') def test_span_year_not_contains_birthday(self): self._assert_none('2015-12-25', '2016-03-01') def test_span_multiple_years_contains_birthday(self): self._assert_thom('2012-12-31', '2016-01-01') def test_range_before_person_born(self): self._assert_none('1985-12-12', '1985-12-13') def test_person_born_in_range_in_one_year(self): self._assert_thom('1993-01-01', '1993-04-01') def test_person_born_in_range_spanning_one_year(self): self._assert_thom('1992-12-31', '1993-04-01') def test_person_born_in_range_spanning_multiple_years(self): self._assert_thom('1992-12-31', '1995-01-01') class MemberTest(TestCase): fixtures = ['members.json'] def test_has_been_member(self): member = Member.objects.get(pk=1) self.assertTrue(member.has_been_member()) m1 = member.membership_set.all()[0] m1.type = 'honorary' m1.save() self.assertFalse(member.has_been_member()) def test_has_been_honorary_member(self): member = Member.objects.get(pk=1) self.assertFalse(member.has_been_honorary_member()) m1 = member.membership_set.all()[0] m1.type = 'honorary' m1.save() self.assertTrue(member.has_been_honorary_member()) class MemberDisplayNameTest(TestCase): @classmethod def setUpTestData(cls): cls.member = Member.objects.create( username='johnnytest', first_name='', last_name='' ) cls.profile = Profile.objects.create( user_id=cls.member.pk, initials=None, nickname=None, display_name_preference='full', ) def setUp(self): self.profile.display_name_preference = 'full' # Assuming we always have a first and last name self.profile.user.first_name = 'Johnny' self.profile.user.last_name = 'Test' self.profile.nickname = None self.profile.initials = None def test_check_display_name_full(self): self.assertEqual('Johnny Test', self.profile.display_name()) self.assertEqual('Johnny', self.profile.short_display_name()) def test_check_display_name_nickname(self): self.profile.display_name_preference = 'nickname' self.assertEqual('Johnny Test', self.profile.display_name()) self.assertEqual('Johnny', self.profile.short_display_name()) self.profile.nickname = 'John' self.assertEqual('John', self.profile.display_name()) self.assertEqual('John', self.profile.short_display_name()) def test_check_display_name_firstname(self): self.profile.display_name_preference = 'firstname' self.assertEqual('Johnny', self.profile.display_name()) self.assertEqual('Johnny', self.profile.short_display_name()) def test_check_display_name_initials(self): self.profile.display_name_preference = 'initials' self.assertEqual('Test', self.profile.display_name()) self.assertEqual('Test', self.profile.short_display_name()) self.profile.initials = 'J' self.assertEqual('J Test', self.profile.display_name()) self.assertEqual('J Test', self.profile.short_display_name()) def test_check_display_name_fullnick(self): self.profile.display_name_preference = 'fullnick' self.assertEqual('Johnny Test', self.profile.display_name()) self.assertEqual('Johnny', self.profile.short_display_name()) self.profile.nickname = 'John' self.assertEqual('Johnny \'John\' Test', self.profile.display_name()) self.assertEqual('Johnny', self.profile.short_display_name()) def test_check_display_name_nicklast(self): self.profile.display_name_preference = 'nicklast' self.assertEqual('Johnny Test', self.profile.display_name()) self.assertEqual('Johnny', self.profile.short_display_name()) self.profile.nickname = 'John' self.assertEqual('\'John\' Test', self.profile.display_name()) self.assertEqual('John', self.profile.short_display_name()) class MembershipFilterTest(TestCase): @classmethod def setUpTestData(cls): # Add 10 members with default membership members = [Member(id=i, username=i) for i in range(7)] Member.objects.bulk_create(members) profiles = [Profile(user_id=i) for i in range(7)] Profile.objects.bulk_create(profiles) Membership(user_id=0, type='honorary', until=date.today() + timedelta(days=1)).save() Membership(user_id=1, type='supporter', until=date.today() + timedelta(days=1)).save() Membership(user_id=2, type='member', until=date.today() + timedelta(days=1)).save() Membership(user_id=3, type='member', until=date.today() + timedelta(days=1)).save() Membership(user_id=3, type='member', until=date.today() - timedelta(days=365*10)).save() Membership(user_id=4, type='supporter', until=date.today() + timedelta(days=1)).save() Membership(user_id=4, type='member', until=date.today() - timedelta(days=365*10)).save() Membership(user_id=5, type='member', until=date.today() - timedelta(days=365*10)).save() # user_id=6 has no memberships at all def test_honorary(self): members = filter_users('honor', '', [date.today().year]) self.assertEqual(len(members), 1) self.assertEqual(members[0].id, 0) def test_ex(self): members = filter_users('ex', '', [date.today().year]) self.assertEqual(len(members), 3) for member in members: self.assertIn(member.id, {4, 5, 6}) # TODO more tests for other cases