tests: fix, generate html coverage report

pull/94/head^2
Christian Merten 12 months ago
parent 36424f091d
commit 19eb0953d5
Signed by: christian.merten
GPG Key ID: D953D69721B948B3

@ -14,8 +14,8 @@ services:
entrypoint: /app/docker/test/entrypoint-master.sh entrypoint: /app/docker/test/entrypoint-master.sh
volumes: volumes:
- type: bind - type: bind
source: ./coverage.xml source: ./htmlcov/
target: /app/jdav_web/coverage.xml target: /app/jdav_web/htmlcov/
cache: cache:
restart: always restart: always

@ -38,5 +38,5 @@ fi
cd jdav_web cd jdav_web
coverage run manage.py test startpage finance members -v 2 coverage run manage.py test startpage finance members contrib logindata mailer material -v 2 --noinput
coverage xml coverage html

@ -3,7 +3,7 @@ from django.utils import timezone
from django.conf import settings from django.conf import settings
from .models import Statement, StatementUnSubmitted, StatementSubmitted, Bill, Ledger, Transaction from .models import Statement, StatementUnSubmitted, StatementSubmitted, Bill, Ledger, Transaction
from members.models import Member, Group, Freizeit, GEMEINSCHAFTS_TOUR, MUSKELKRAFT_ANREISE, NewMemberOnList,\ from members.models import Member, Group, Freizeit, GEMEINSCHAFTS_TOUR, MUSKELKRAFT_ANREISE, NewMemberOnList,\
FAHRGEMEINSCHAFT_ANREISE FAHRGEMEINSCHAFT_ANREISE, MALE, FEMALE, DIVERSE
# Create your tests here. # Create your tests here.
class StatementTestCase(TestCase): class StatementTestCase(TestCase):
@ -15,7 +15,7 @@ class StatementTestCase(TestCase):
def setUp(self): def setUp(self):
self.jl = Group.objects.create(name="Jugendleiter") self.jl = Group.objects.create(name="Jugendleiter")
self.fritz = Member.objects.create(prename="Fritz", lastname="Wulter", birth_date=timezone.now().date(), 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.group.add(self.jl)
self.fritz.save() self.fritz.save()
@ -39,12 +39,12 @@ class StatementTestCase(TestCase):
self.st3 = Statement.objects.create(night_cost=self.night_cost, excursion=ex) self.st3 = Statement.objects.create(night_cost=self.night_cost, excursion=ex)
for i in range(self.participant_count): for i in range(self.participant_count):
m = Member.objects.create(prename='Fritz {}'.format(i), lastname='Walter', birth_date=timezone.now().date(), 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) mol = NewMemberOnList.objects.create(member=m, memberlist=ex)
ex.membersonlist.add(mol) ex.membersonlist.add(mol)
for i in range(self.staff_count): for i in range(self.staff_count):
m = Member.objects.create(prename='Fritz {}'.format(i), lastname='Walter', birth_date=timezone.now().date(), 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', Bill.objects.create(statement=self.st3, short_description='food', explanation='i was hungry',
amount=42.69, costs_covered=True, paid_by=m) amount=42.69, costs_covered=True, paid_by=m)
m.group.add(self.jl) m.group.add(self.jl)
@ -57,7 +57,7 @@ class StatementTestCase(TestCase):
self.st4 = Statement.objects.create(night_cost=self.night_cost, excursion=ex) self.st4 = Statement.objects.create(night_cost=self.night_cost, excursion=ex)
for i in range(2): for i in range(2):
m = Member.objects.create(prename='Peter {}'.format(i), lastname='Walter', birth_date=timezone.now().date(), 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) mol = NewMemberOnList.objects.create(member=m, memberlist=ex)
ex.membersonlist.add(mol) ex.membersonlist.add(mol)
@ -66,7 +66,7 @@ class StatementTestCase(TestCase):
'Admissible staff count is not 0, although not enough participants.') 'Admissible staff count is not 0, although not enough participants.')
for i in range(2): for i in range(2):
m = Member.objects.create(prename='Peter {}'.format(i), lastname='Walter', birth_date=timezone.now().date(), 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) mol = NewMemberOnList.objects.create(member=m, memberlist=self.st4.excursion)
self.st4.excursion.membersonlist.add(mol) self.st4.excursion.membersonlist.add(mol)
self.assertEqual(self.st4.admissible_staff_count, 2, self.assertEqual(self.st4.admissible_staff_count, 2,

@ -6,8 +6,10 @@ from django.test import TestCase, Client, RequestFactory
from django.utils import timezone, translation from django.utils import timezone, translation
from django.conf import settings from django.conf import settings
from django.urls import reverse from django.urls import reverse
from unittest import skip
from .models import Member, Group, PermissionMember, PermissionGroup, Freizeit, GEMEINSCHAFTS_TOUR, MUSKELKRAFT_ANREISE,\ 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 import connection
from django.db.migrations.executor import MigrationExecutor from django.db.migrations.executor import MigrationExecutor
@ -18,7 +20,7 @@ def create_custom_user(username, groups, prename, lastname):
user = User.objects.create_user( user = User.objects.create_user(
username=username, password='secret' 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.user = user
member.save() member.save()
user.is_staff = True user.is_staff = True
@ -37,22 +39,22 @@ class BasicMemberTestCase(TestCase):
self.spiel = Group.objects.create(name="Spielkinder") self.spiel = Group.objects.create(name="Spielkinder")
self.fritz = Member.objects.create(prename="Fritz", lastname="Wulter", birth_date=timezone.now().date(), 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.jl)
self.fritz.group.add(self.alp) self.fritz.group.add(self.alp)
self.fritz.save() self.fritz.save()
self.lara = Member.objects.create(prename="Lara", lastname="Wallis", birth_date=timezone.now().date(), 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.group.add(self.alp)
self.lara.save() self.lara.save()
self.fridolin = Member.objects.create(prename="Fridolin", lastname="Spargel", birth_date=timezone.now().date(), 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.alp)
self.fridolin.group.add(self.spiel) self.fridolin.group.add(self.spiel)
self.fridolin.save() self.fridolin.save()
self.lise = Member.objects.create(prename="Lise", lastname="Lotte", birth_date=timezone.now().date(), 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): class MemberTestCase(BasicMemberTestCase):
@ -66,11 +68,11 @@ class MemberTestCase(BasicMemberTestCase):
self.ja = Group.objects.create(name="Jugendausschuss") self.ja = Group.objects.create(name="Jugendausschuss")
self.peter = Member.objects.create(prename="Peter", lastname="Keks", birth_date=timezone.now().date(), 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(), 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(), 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.peter.group.add(self.ja)
self.anna.group.add(self.ja) self.anna.group.add(self.ja)
self.lisa.group.add(self.ja) self.lisa.group.add(self.ja)
@ -128,7 +130,7 @@ class PDFTestCase(TestCase):
for i in range(7): for i in range(7):
m = Member.objects.create(prename='Lise {}'.format(i), lastname='Walter', birth_date=timezone.now().date(), 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.ex)
NewMemberOnList.objects.create(member=m, comments='a' * i, memberlist=self.note) 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')
self._test_pdf('notes_list', username='standard', invalid=True) 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): def test_seminar_report(self):
self._test_pdf('seminar_report') self._test_pdf('seminar_report')
self._test_pdf('seminar_report', username='standard', invalid=True) self._test_pdf('seminar_report', username='standard', invalid=True)
@ -200,21 +209,21 @@ class AdminTestCase(TestCase):
for i in range(3): for i in range(3):
m = Member.objects.create(prename='Fritz {}'.format(i), lastname='Walter', birth_date=timezone.now().date(), 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.group.add(cool_kids)
m.save() m.save()
for i in range(7): for i in range(7):
m = Member.objects.create(prename='Lise {}'.format(i), lastname='Walter', birth_date=timezone.now().date(), 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.group.add(super_kids)
m.save() m.save()
for i in range(5): for i in range(5):
m = Member.objects.create(prename='Lulla {}'.format(i), lastname='Hulla', birth_date=timezone.now().date(), 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.group.add(staff)
m.save() m.save()
m = Member.objects.create(prename='Peter', lastname='Hulla', birth_date=timezone.now().date(), 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) m.group.add(staff)
p1.list_members.add(m) p1.list_members.add(m)
@ -256,7 +265,7 @@ class MemberAdminTestCase(AdminTestCase):
for i in range(1): for i in range(1):
m = Member.objects.create(prename='Peter {}'.format(i), lastname='Walter', birth_date=timezone.now().date(), 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.group.add(mega_kids)
m.save() m.save()
@ -383,7 +392,7 @@ class FreizeitAdminTestCase(AdminTestCase):
for i in range(7): for i in range(7):
m = Member.objects.create(prename='Lise {}'.format(i), lastname='Walter', birth_date=timezone.now().date(), 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) NewMemberOnList.objects.create(member=m, comments='a' * i, memberlist=ex)
def test_changelist(self): def test_changelist(self):
@ -413,11 +422,17 @@ class FreizeitAdminTestCase(AdminTestCase):
response = c.get(url) response = c.get(url)
self.assertEqual(response.status_code, 200, 'Response code is not 200.') 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') u = User.objects.get(username='standard')
c = self._login('standard')
url = reverse('admin:members_freizeit_add')
request = self.factory.get(url) request = self.factory.get(url)
request.user = u request.user = u
#staff = Group.objects.get(name='Jugendleiter')
field = Freizeit._meta.get_field('jugendleiter') field = Freizeit._meta.get_field('jugendleiter')
queryset = self.admin.formfield_for_manytomany(field, request).queryset queryset = self.admin.formfield_for_manytomany(field, request).queryset
self.assertQuerysetEqual(queryset, u.member.filter_queryset_by_permissions(model=Member), 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 # father's mail should now be confirmed
self.assertTrue(self.father.confirmed_mail, msg='After confirming by key, the mail should 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): def test_emergency_contact_confirmation(self):
# request mail confirmation of fritz, should also ask for confirmation of father # request mail confirmation of fritz, should also ask for confirmation of father
requested_confirmation = self.fritz.request_mail_confirmation() requested_confirmation = self.fritz.request_mail_confirmation()

@ -1,46 +1,55 @@
from django.test import TestCase, Client from django.test import TestCase, Client
from django.urls import reverse from django.urls import reverse
from django.conf import settings
from members.models import Group from members.models import Group
from .models import Post, Section from .models import Post, Section
class ModelsTestCase(TestCase): class BasicTestCase(TestCase):
def setUp(self): def setUp(self):
orga = Section.objects.create(title='Organisation', urlname='orga', website_text='Section is a about everything.') 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.', Post.objects.create(title='Staff', urlname='staff', website_text='This is our staff: Peter.',
section=orga) 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): def test_str(self):
orga = Section.objects.get(urlname='orga') orga = Section.objects.get(urlname='orga')
self.assertEqual(str(orga), orga.title, 'String representation does not match title.') self.assertEqual(str(orga), orga.title, 'String representation does not match title.')
post = Post.objects.get(urlname='staff', section=orga) 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(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.') 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): def test_absolute_urlnames(self):
orga = Section.objects.get(urlname='orga') 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') self.assertEqual(orga.absolute_urlname(), '/de/orga')
post1 = Post.objects.get(urlname='staff', section=orga) post1 = Post.objects.get(urlname='staff', section=orga)
self.assertEqual(post1.absolute_urlname(), '/de/orga/staff') self.assertEqual(post1.absolute_urlname(), '/de/orga/staff')
post2 = Post.objects.get(urlname='climbing-is-fun', section=None) self.assertEqual(post1.absolute_urlname(), reverse('startpage:post', args=(orga.urlname, 'staff')))
self.assertEqual(post2.absolute_urlname(), '/de/aktuelles/climbing-is-fun') 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))
class ViewTestCase(TestCase): self.assertEqual(post2.absolute_urlname(), reverse('startpage:post', args=(recent.urlname, 'climbing-is-fun')))
def setUp(self): post3 = Post.objects.get(urlname='last-trip', section=reports)
orga = Section.objects.create(title='Organisation', urlname='orga', website_text='Section is a about everything.') self.assertEqual(post3.absolute_urlname(),
Post.objects.create(title='Climbing is fun', urlname='climbing-is-fun', website_text='Climbing is fun!') '/de/{name}/last-trip'.format(name=settings.REPORTS_SECTION))
Post.objects.create(title='Staff', urlname='staff', website_text='This is our staff: Peter.', self.assertEqual(post3.absolute_urlname(), reverse('startpage:post', args=(reports.urlname, 'last-trip')))
section=orga)
Group.objects.create(name='CrazyClimbers', show_website=True)
Group.objects.create(name='SuperClimbers', show_website=False) class ViewTestCase(BasicTestCase):
def test_index(self): def test_index(self):
c = Client() c = Client()
url = reverse('startpage:index') url = reverse('startpage:index')
@ -49,7 +58,7 @@ class ViewTestCase(TestCase):
def test_posts_no_category(self): def test_posts_no_category(self):
c = Client() 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) response = c.get(url)
self.assertEqual(response.status_code, 200, 'Response code is not 200 for climbing post.') 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): def test_section_recent(self):
c = Client() 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) response = c.get(url)
self.assertEqual(response.status_code, 200, 'Response code is not 200 for section page.') self.assertEqual(response.status_code, 200, 'Response code is not 200 for section page.')

Loading…
Cancel
Save