From 19eb0953d5fa91bd22ae7dd8f7ded01412b68396 Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Sun, 29 Dec 2024 00:05:00 +0100 Subject: [PATCH] tests: fix, generate html coverage report --- docker/test/docker-compose.yaml | 4 +-- docker/test/entrypoint-master.sh | 4 +-- jdav_web/finance/tests.py | 14 ++++----- jdav_web/members/tests.py | 50 ++++++++++++++++++++---------- jdav_web/startpage/tests.py | 53 ++++++++++++++++++++------------ 5 files changed, 78 insertions(+), 47 deletions(-) diff --git a/docker/test/docker-compose.yaml b/docker/test/docker-compose.yaml index 9bc9bae..edbb892 100644 --- a/docker/test/docker-compose.yaml +++ b/docker/test/docker-compose.yaml @@ -14,8 +14,8 @@ services: entrypoint: /app/docker/test/entrypoint-master.sh volumes: - type: bind - source: ./coverage.xml - target: /app/jdav_web/coverage.xml + source: ./htmlcov/ + target: /app/jdav_web/htmlcov/ cache: restart: always diff --git a/docker/test/entrypoint-master.sh b/docker/test/entrypoint-master.sh index 8c70043..2c80809 100755 --- a/docker/test/entrypoint-master.sh +++ b/docker/test/entrypoint-master.sh @@ -38,5 +38,5 @@ fi cd jdav_web -coverage run manage.py test startpage finance members -v 2 -coverage xml +coverage run manage.py test startpage finance members contrib logindata mailer material -v 2 --noinput +coverage html diff --git a/jdav_web/finance/tests.py b/jdav_web/finance/tests.py index 0014d8d..08b531a 100644 --- a/jdav_web/finance/tests.py +++ b/jdav_web/finance/tests.py @@ -3,7 +3,7 @@ from django.utils import timezone from django.conf import settings from .models import Statement, StatementUnSubmitted, StatementSubmitted, Bill, Ledger, Transaction from members.models import Member, Group, Freizeit, GEMEINSCHAFTS_TOUR, MUSKELKRAFT_ANREISE, NewMemberOnList,\ - FAHRGEMEINSCHAFT_ANREISE + FAHRGEMEINSCHAFT_ANREISE, MALE, FEMALE, DIVERSE # Create your tests here. class StatementTestCase(TestCase): @@ -11,11 +11,11 @@ class StatementTestCase(TestCase): kilometers_traveled = 512 participant_count = 10 staff_count = 5 - + def setUp(self): self.jl = Group.objects.create(name="Jugendleiter") self.fritz = Member.objects.create(prename="Fritz", lastname="Wulter", birth_date=timezone.now().date(), - email=settings.TEST_MAIL) + email=settings.TEST_MAIL, gender=MALE) self.fritz.group.add(self.jl) self.fritz.save() @@ -39,12 +39,12 @@ class StatementTestCase(TestCase): self.st3 = Statement.objects.create(night_cost=self.night_cost, excursion=ex) for i in range(self.participant_count): m = Member.objects.create(prename='Fritz {}'.format(i), lastname='Walter', birth_date=timezone.now().date(), - email=settings.TEST_MAIL) + email=settings.TEST_MAIL, gender=MALE) mol = NewMemberOnList.objects.create(member=m, memberlist=ex) ex.membersonlist.add(mol) for i in range(self.staff_count): m = Member.objects.create(prename='Fritz {}'.format(i), lastname='Walter', birth_date=timezone.now().date(), - email=settings.TEST_MAIL) + email=settings.TEST_MAIL, gender=MALE) Bill.objects.create(statement=self.st3, short_description='food', explanation='i was hungry', amount=42.69, costs_covered=True, paid_by=m) m.group.add(self.jl) @@ -57,7 +57,7 @@ class StatementTestCase(TestCase): self.st4 = Statement.objects.create(night_cost=self.night_cost, excursion=ex) for i in range(2): m = Member.objects.create(prename='Peter {}'.format(i), lastname='Walter', birth_date=timezone.now().date(), - email=settings.TEST_MAIL) + email=settings.TEST_MAIL, gender=DIVERSE) mol = NewMemberOnList.objects.create(member=m, memberlist=ex) ex.membersonlist.add(mol) @@ -66,7 +66,7 @@ class StatementTestCase(TestCase): 'Admissible staff count is not 0, although not enough participants.') for i in range(2): m = Member.objects.create(prename='Peter {}'.format(i), lastname='Walter', birth_date=timezone.now().date(), - email=settings.TEST_MAIL) + email=settings.TEST_MAIL, gender=DIVERSE) mol = NewMemberOnList.objects.create(member=m, memberlist=self.st4.excursion) self.st4.excursion.membersonlist.add(mol) self.assertEqual(self.st4.admissible_staff_count, 2, diff --git a/jdav_web/members/tests.py b/jdav_web/members/tests.py index 673d658..440446f 100644 --- a/jdav_web/members/tests.py +++ b/jdav_web/members/tests.py @@ -6,8 +6,10 @@ from django.test import TestCase, Client, RequestFactory from django.utils import timezone, translation from django.conf import settings from django.urls import reverse +from unittest import skip from .models import Member, Group, PermissionMember, PermissionGroup, Freizeit, GEMEINSCHAFTS_TOUR, MUSKELKRAFT_ANREISE,\ - MemberNoteList, NewMemberOnList, confirm_mail_by_key, EmergencyContact + MemberNoteList, NewMemberOnList, confirm_mail_by_key, EmergencyContact,\ + DIVERSE, MALE, FEMALE from django.db import connection from django.db.migrations.executor import MigrationExecutor @@ -18,7 +20,7 @@ def create_custom_user(username, groups, prename, lastname): user = User.objects.create_user( username=username, password='secret' ) - member = Member.objects.create(prename=prename, lastname=lastname, birth_date=timezone.localdate(), email=settings.TEST_MAIL) + member = Member.objects.create(prename=prename, lastname=lastname, birth_date=timezone.localdate(), email=settings.TEST_MAIL, gender=DIVERSE) member.user = user member.save() user.is_staff = True @@ -37,22 +39,22 @@ class BasicMemberTestCase(TestCase): self.spiel = Group.objects.create(name="Spielkinder") self.fritz = Member.objects.create(prename="Fritz", lastname="Wulter", birth_date=timezone.now().date(), - email=settings.TEST_MAIL) + email=settings.TEST_MAIL, gender=DIVERSE) self.fritz.group.add(self.jl) self.fritz.group.add(self.alp) self.fritz.save() self.lara = Member.objects.create(prename="Lara", lastname="Wallis", birth_date=timezone.now().date(), - email=settings.TEST_MAIL) + email=settings.TEST_MAIL, gender=DIVERSE) self.lara.group.add(self.alp) self.lara.save() self.fridolin = Member.objects.create(prename="Fridolin", lastname="Spargel", birth_date=timezone.now().date(), - email=settings.TEST_MAIL) + email=settings.TEST_MAIL, gender=MALE) self.fridolin.group.add(self.alp) self.fridolin.group.add(self.spiel) self.fridolin.save() self.lise = Member.objects.create(prename="Lise", lastname="Lotte", birth_date=timezone.now().date(), - email=settings.TEST_MAIL) + email=settings.TEST_MAIL, gender=FEMALE) class MemberTestCase(BasicMemberTestCase): @@ -66,11 +68,11 @@ class MemberTestCase(BasicMemberTestCase): self.ja = Group.objects.create(name="Jugendausschuss") self.peter = Member.objects.create(prename="Peter", lastname="Keks", birth_date=timezone.now().date(), - email=settings.TEST_MAIL) + email=settings.TEST_MAIL, gender=MALE) self.anna = Member.objects.create(prename="Anna", lastname="Keks", birth_date=timezone.now().date(), - email=settings.TEST_MAIL) + email=settings.TEST_MAIL, gender=FEMALE) self.lisa = Member.objects.create(prename="Lisa", lastname="Keks", birth_date=timezone.now().date(), - email=settings.TEST_MAIL) + email=settings.TEST_MAIL, gender=DIVERSE) self.peter.group.add(self.ja) self.anna.group.add(self.ja) self.lisa.group.add(self.ja) @@ -128,7 +130,7 @@ class PDFTestCase(TestCase): for i in range(7): m = Member.objects.create(prename='Lise {}'.format(i), lastname='Walter', birth_date=timezone.now().date(), - email=settings.TEST_MAIL) + email=settings.TEST_MAIL, gender=FEMALE) NewMemberOnList.objects.create(member=m, comments='a' * i, memberlist=self.ex) NewMemberOnList.objects.create(member=m, comments='a' * i, memberlist=self.note) @@ -158,6 +160,13 @@ class PDFTestCase(TestCase): self._test_pdf('notes_list') self._test_pdf('notes_list', username='standard', invalid=True) + def test_sjr_application(self): + self._test_pdf('sjr_application') + self._test_pdf('sjr_application', username='standard', invalid=True) + + # TODO: Since generating a seminar report requires more input now, this test rightly + # fails. Replace this test with one that fills the POST form and generates a pdf. + @skip("Currently rightly fails, because expected behaviour changed.") def test_seminar_report(self): self._test_pdf('seminar_report') self._test_pdf('seminar_report', username='standard', invalid=True) @@ -200,21 +209,21 @@ class AdminTestCase(TestCase): for i in range(3): m = Member.objects.create(prename='Fritz {}'.format(i), lastname='Walter', birth_date=timezone.now().date(), - email=settings.TEST_MAIL) + email=settings.TEST_MAIL, gender=MALE) m.group.add(cool_kids) m.save() for i in range(7): m = Member.objects.create(prename='Lise {}'.format(i), lastname='Walter', birth_date=timezone.now().date(), - email=settings.TEST_MAIL) + email=settings.TEST_MAIL, gender=FEMALE) m.group.add(super_kids) m.save() for i in range(5): m = Member.objects.create(prename='Lulla {}'.format(i), lastname='Hulla', birth_date=timezone.now().date(), - email=settings.TEST_MAIL) + email=settings.TEST_MAIL, gender=DIVERSE) m.group.add(staff) m.save() m = Member.objects.create(prename='Peter', lastname='Hulla', birth_date=timezone.now().date(), - email=settings.TEST_MAIL) + email=settings.TEST_MAIL, gender=MALE) m.group.add(staff) p1.list_members.add(m) @@ -256,7 +265,7 @@ class MemberAdminTestCase(AdminTestCase): for i in range(1): m = Member.objects.create(prename='Peter {}'.format(i), lastname='Walter', birth_date=timezone.now().date(), - email=settings.TEST_MAIL) + email=settings.TEST_MAIL, gender=MALE) m.group.add(mega_kids) m.save() @@ -383,7 +392,7 @@ class FreizeitAdminTestCase(AdminTestCase): for i in range(7): m = Member.objects.create(prename='Lise {}'.format(i), lastname='Walter', birth_date=timezone.now().date(), - email=settings.TEST_MAIL) + email=settings.TEST_MAIL, gender=FEMALE) NewMemberOnList.objects.create(member=m, comments='a' * i, memberlist=ex) def test_changelist(self): @@ -413,11 +422,17 @@ class FreizeitAdminTestCase(AdminTestCase): response = c.get(url) self.assertEqual(response.status_code, 200, 'Response code is not 200.') + @skip("The filtering is currently (intentionally) disabled.") + def test_add_queryset_filter(self): + """Test if queryset on `jugendleiter` field is properly filtered by permissions.""" u = User.objects.get(username='standard') + c = self._login('standard') + + url = reverse('admin:members_freizeit_add') request = self.factory.get(url) request.user = u - #staff = Group.objects.get(name='Jugendleiter') + field = Freizeit._meta.get_field('jugendleiter') queryset = self.admin.formfield_for_manytomany(field, request).queryset self.assertQuerysetEqual(queryset, u.member.filter_queryset_by_permissions(model=Member), @@ -472,6 +487,7 @@ class MailConfirmationTestCase(BasicMemberTestCase): # father's mail should now be confirmed self.assertTrue(self.father.confirmed_mail, msg='After confirming by key, the mail should be confirmed.') + @skip("Currently, emergency contact email addresses are not required to be confirmed.") def test_emergency_contact_confirmation(self): # request mail confirmation of fritz, should also ask for confirmation of father requested_confirmation = self.fritz.request_mail_confirmation() diff --git a/jdav_web/startpage/tests.py b/jdav_web/startpage/tests.py index c012738..8a8ceef 100644 --- a/jdav_web/startpage/tests.py +++ b/jdav_web/startpage/tests.py @@ -1,46 +1,55 @@ from django.test import TestCase, Client from django.urls import reverse +from django.conf import settings from members.models import Group from .models import Post, Section -class ModelsTestCase(TestCase): +class BasicTestCase(TestCase): def setUp(self): orga = Section.objects.create(title='Organisation', urlname='orga', website_text='Section is a about everything.') - Post.objects.create(title='Climbing is fun', urlname='climbing-is-fun', website_text='Climbing is fun!') + recent = Section.objects.create(title='Recent', urlname=settings.RECENT_SECTION, website_text='Recently recent.') + reports = Section.objects.create(title='Reports', urlname=settings.REPORTS_SECTION, website_text='Reporty reports.') + Post.objects.create(title='Climbing is fun', urlname='climbing-is-fun', website_text='Climbing is fun!', + section=recent) + Post.objects.create(title='Last trip', urlname='last-trip', website_text='A fun trip.', + section=reports) Post.objects.create(title='Staff', urlname='staff', website_text='This is our staff: Peter.', section=orga) + Group.objects.create(name='CrazyClimbers', show_website=True) + Group.objects.create(name='SuperClimbers', show_website=False) + +class ModelsTestCase(BasicTestCase): def test_str(self): orga = Section.objects.get(urlname='orga') self.assertEqual(str(orga), orga.title, 'String representation does not match title.') post = Post.objects.get(urlname='staff', section=orga) self.assertEqual(post.absolute_section(), orga.title, 'Displayed section of post does not match section title.') self.assertEqual(str(post), post.title, 'String representation does not match title.') - for post in Post.objects.filter(section=None): - self.assertEqual(post.absolute_section(), 'Aktuelles', 'Displayed section of post does not "Aktuelles".') def test_absolute_urlnames(self): orga = Section.objects.get(urlname='orga') + recent = Section.objects.get(urlname=settings.RECENT_SECTION) + reports = Section.objects.get(urlname=settings.REPORTS_SECTION) self.assertEqual(orga.absolute_urlname(), '/de/orga') post1 = Post.objects.get(urlname='staff', section=orga) self.assertEqual(post1.absolute_urlname(), '/de/orga/staff') - post2 = Post.objects.get(urlname='climbing-is-fun', section=None) - self.assertEqual(post2.absolute_urlname(), '/de/aktuelles/climbing-is-fun') - - -class ViewTestCase(TestCase): - def setUp(self): - orga = Section.objects.create(title='Organisation', urlname='orga', website_text='Section is a about everything.') - Post.objects.create(title='Climbing is fun', urlname='climbing-is-fun', website_text='Climbing is fun!') - Post.objects.create(title='Staff', urlname='staff', website_text='This is our staff: Peter.', - section=orga) - Group.objects.create(name='CrazyClimbers', show_website=True) - Group.objects.create(name='SuperClimbers', show_website=False) - + self.assertEqual(post1.absolute_urlname(), reverse('startpage:post', args=(orga.urlname, 'staff'))) + post2 = Post.objects.get(urlname='climbing-is-fun', section=recent) + self.assertEqual(post2.absolute_urlname(), + '/de/{name}/climbing-is-fun'.format(name=settings.RECENT_SECTION)) + self.assertEqual(post2.absolute_urlname(), reverse('startpage:post', args=(recent.urlname, 'climbing-is-fun'))) + post3 = Post.objects.get(urlname='last-trip', section=reports) + self.assertEqual(post3.absolute_urlname(), + '/de/{name}/last-trip'.format(name=settings.REPORTS_SECTION)) + self.assertEqual(post3.absolute_urlname(), reverse('startpage:post', args=(reports.urlname, 'last-trip'))) + + +class ViewTestCase(BasicTestCase): def test_index(self): c = Client() url = reverse('startpage:index') @@ -49,7 +58,7 @@ class ViewTestCase(TestCase): def test_posts_no_category(self): c = Client() - url = reverse('startpage:post', args=('aktuelles', 'climbing-is-fun')) + url = reverse('startpage:post', args=(settings.RECENT_SECTION, 'climbing-is-fun')) response = c.get(url) self.assertEqual(response.status_code, 200, 'Response code is not 200 for climbing post.') @@ -67,7 +76,13 @@ class ViewTestCase(TestCase): def test_section_recent(self): c = Client() - url = reverse('startpage:aktuelles') + url = reverse('startpage:' + settings.RECENT_SECTION) + response = c.get(url) + self.assertEqual(response.status_code, 200, 'Response code is not 200 for section page.') + + def test_section_reports(self): + c = Client() + url = reverse('startpage:' + settings.REPORTS_SECTION) response = c.get(url) self.assertEqual(response.status_code, 200, 'Response code is not 200 for section page.')