From 416af3607065fc50919ee3d2ff54a8d10d085ae2 Mon Sep 17 00:00:00 2001 From: Christian Merten Date: Sun, 4 May 2025 18:50:59 +0200 Subject: [PATCH] chore(members): reorganize tests --- jdav_web/members/tests/__init__.py | 1 + jdav_web/members/{tests.py => tests/basic.py} | 136 +------------ jdav_web/members/tests/utils.py | 191 ++++++++++++++++++ 3 files changed, 199 insertions(+), 129 deletions(-) create mode 100644 jdav_web/members/tests/__init__.py rename jdav_web/members/{tests.py => tests/basic.py} (93%) create mode 100644 jdav_web/members/tests/utils.py diff --git a/jdav_web/members/tests/__init__.py b/jdav_web/members/tests/__init__.py new file mode 100644 index 0000000..da0f2b6 --- /dev/null +++ b/jdav_web/members/tests/__init__.py @@ -0,0 +1 @@ +from .basic import * diff --git a/jdav_web/members/tests.py b/jdav_web/members/tests/basic.py similarity index 93% rename from jdav_web/members/tests.py rename to jdav_web/members/tests/basic.py index 4e59f15..20295a1 100644 --- a/jdav_web/members/tests.py +++ b/jdav_web/members/tests/basic.py @@ -14,17 +14,17 @@ from django.conf import settings from django.urls import reverse from django import template from unittest import skip, mock -from .models import Member, Group, PermissionMember, PermissionGroup, Freizeit, GEMEINSCHAFTS_TOUR,\ +from members.models import Member, Group, PermissionMember, PermissionGroup, Freizeit, GEMEINSCHAFTS_TOUR,\ MUSKELKRAFT_ANREISE, FUEHRUNGS_TOUR, AUSBILDUNGS_TOUR, OEFFENTLICHE_ANREISE,\ FAHRGEMEINSCHAFT_ANREISE,\ MemberNoteList, NewMemberOnList, confirm_mail_by_key, EmergencyContact, MemberWaitingList,\ RegistrationPassword, MemberUnconfirmedProxy, InvitationToGroup, DIVERSE, MALE, FEMALE,\ Klettertreff, KlettertreffAttendee, LJPProposal, ActivityCategory, WEEKDAYS,\ TrainingCategory, Person -from .admin import MemberWaitingListAdmin, MemberAdmin, FreizeitAdmin, MemberNoteListAdmin,\ +from members.admin import MemberWaitingListAdmin, MemberAdmin, FreizeitAdmin, MemberNoteListAdmin,\ MemberUnconfirmedAdmin, RegistrationFilter, FilteredMemberFieldMixin,\ MemberAdminForm, StatementOnListForm, KlettertreffAdmin, GroupAdmin -from .pdf import fill_pdf_form, render_tex, media_path, serve_pdf, find_template, merge_pdfs +from members.pdf import fill_pdf_form, render_tex, media_path, serve_pdf, find_template, merge_pdfs from mailer.models import EmailAddress from finance.models import Statement, Bill @@ -35,29 +35,9 @@ import datetime from dateutil.relativedelta import relativedelta import math import os.path +from members.tests.utils import * -INTERNAL_EMAIL = "foobar@{domain}".format(domain=settings.ALLOWED_EMAIL_DOMAINS_FOR_INVITE_AS_USER[0]) -REGISTRATION_DATA = { - 'prename': 'Peter', - 'lastname': 'Wulter', - 'street': 'Street 123', - 'plz': '12345 EJ', - 'town': 'Town 1', - 'phone_number': '+49 123456', - 'birth_date': '2010-05-17', - 'gender': '2', - 'email': settings.TEST_MAIL, - 'alternative_email': settings.TEST_MAIL, -} -WAITER_DATA = { - 'prename': 'Peter', - 'lastname': 'Wulter', - 'birth_date': '1999-02-16', - 'gender': '0', - 'email': settings.TEST_MAIL, - 'application_text': 'hoho', -} EMERGENCY_CONTACT_DATA = { 'emergencycontact_set-TOTAL_FORMS': '1', 'emergencycontact_set-INITIAL_FORMS': '0', @@ -73,61 +53,6 @@ EMERGENCY_CONTACT_DATA = { } -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, gender=DIVERSE) - member.user = user - member.save() - user.is_staff = True - user.save() - - for group in groups: - g = authmodels.Group.objects.get(name=group) - user.groups.add(g) - return user - - -class BasicMemberTestCase(TestCase): - def setUp(self): - self.jl = Group.objects.create(name="Jugendleiter") - self.alp = Group.objects.create(name="Alpenfuechse") - 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, gender=DIVERSE) - self.fritz.group.add(self.jl) - self.fritz.group.add(self.alp) - self.fritz.save() - - em = EmailAddress.objects.create(name='foobar') - self.alp.contact_email = em - self.alp.save() - - self.peter = Member.objects.create(prename="Peter", lastname="Wulter", - birth_date=timezone.now().date(), - email=settings.TEST_MAIL, gender=MALE) - self.peter.group.add(self.jl) - self.peter.group.add(self.alp) - self.peter.save() - - self.lara = Member.objects.create(prename="Lara", lastname="Wallis", birth_date=timezone.now().date(), - email=INTERNAL_EMAIL, 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, 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, gender=FEMALE) - self.alp.leiters.add(self.lise) - self.alp.save() - - class MemberTestCase(BasicMemberTestCase): def setUp(self): super().setUp() @@ -693,60 +618,13 @@ class FreizeitTestCase(BasicMemberTestCase): self.ex2.save() def _setup_test_sjr_application_numbers(self, n_yl, n_b27_local, n_b27_non_local): - for i in range(n_yl): - m = Member.objects.create(prename='Peter {}'.format(i), - lastname='Wulter', - birth_date=datetime.datetime.today() - relativedelta(years=50), - email=settings.TEST_MAIL, - gender=FEMALE) - self.ex.jugendleiter.add(m) - NewMemberOnList.objects.create(member=m, comments='a', memberlist=self.ex) - for i in range(n_b27_local): - m = Member.objects.create(prename='Lise {}'.format(i), - lastname='Walter', - birth_date=datetime.datetime.today() - relativedelta(years=10), - town=settings.SEKTION, - email=settings.TEST_MAIL, - gender=FEMALE) - NewMemberOnList.objects.create(member=m, comments='a', memberlist=self.ex) - for i in range(n_b27_non_local): - m = Member.objects.create(prename='Lise {}'.format(i), - lastname='Walter', - birth_date=datetime.datetime.today() - relativedelta(years=10), - email=settings.TEST_MAIL, - gender=FEMALE) - NewMemberOnList.objects.create(member=m, comments='a', memberlist=self.ex) + add_memberonlist_by_local(self.ex, n_yl, n_b27_local, n_b27_non_local) def _setup_test_ljp_participant_count(self, n_yl, n_correct_age, n_too_old): - for i in range(n_yl): - # a 50 years old - m = Member.objects.create(prename='Peter {}'.format(i), - lastname='Wulter', - birth_date=datetime.datetime.today() - relativedelta(years=50), - email=settings.TEST_MAIL, - gender=FEMALE) - self.ex.jugendleiter.add(m) - for i in range(n_correct_age): - # a 10 years old - m = Member.objects.create(prename='Lise {}'.format(i), - lastname='Walter', - birth_date=datetime.datetime.today() - relativedelta(years=10), - email=settings.TEST_MAIL, - gender=FEMALE) - NewMemberOnList.objects.create(member=m, comments='a', memberlist=self.ex) - for i in range(n_too_old): - # a 27 years old - m = Member.objects.create(prename='Lise {}'.format(i), - lastname='Walter', - birth_date=datetime.datetime.today() - relativedelta(years=27), - email=settings.TEST_MAIL, - gender=FEMALE) - NewMemberOnList.objects.create(member=m, comments='a', memberlist=self.ex) + add_memberonlist_by_age(self.ex, n_yl, n_correct_age, n_too_old) def _cleanup_excursion(self): - # delete all members on excursion for clean up - NewMemberOnList.objects.all().delete() - self.ex.jugendleiter.all().delete() + cleanup_excursion(self.ex) def _test_theoretic_ljp_participant_count_proportion(self, n_yl, n_correct_age, n_too_old): self._setup_test_ljp_participant_count(n_yl, n_correct_age, n_too_old) diff --git a/jdav_web/members/tests/utils.py b/jdav_web/members/tests/utils.py new file mode 100644 index 0000000..f7928e2 --- /dev/null +++ b/jdav_web/members/tests/utils.py @@ -0,0 +1,191 @@ +from http import HTTPStatus + +from django.core.files.uploadedfile import SimpleUploadedFile +from django.contrib.auth import models as authmodels +from django.contrib.admin.sites import AdminSite +from django.contrib.messages import get_messages +from django.contrib.auth.models import User +from django.contrib import admin +from django.core.exceptions import ValidationError +from django.utils.translation import gettext_lazy as _ +from django.test import TestCase, Client, RequestFactory +from django.utils import timezone, translation +from django.conf import settings +from django.urls import reverse +from django import template +from unittest import skip, mock +from members.models import Member, Group, PermissionMember, PermissionGroup, Freizeit, GEMEINSCHAFTS_TOUR,\ + MUSKELKRAFT_ANREISE, FUEHRUNGS_TOUR, AUSBILDUNGS_TOUR, OEFFENTLICHE_ANREISE,\ + FAHRGEMEINSCHAFT_ANREISE,\ + MemberNoteList, NewMemberOnList, confirm_mail_by_key, EmergencyContact, MemberWaitingList,\ + RegistrationPassword, MemberUnconfirmedProxy, InvitationToGroup, DIVERSE, MALE, FEMALE,\ + Klettertreff, KlettertreffAttendee, LJPProposal, ActivityCategory, WEEKDAYS,\ + TrainingCategory, Person +from members.admin import MemberWaitingListAdmin, MemberAdmin, FreizeitAdmin, MemberNoteListAdmin,\ + MemberUnconfirmedAdmin, RegistrationFilter, FilteredMemberFieldMixin,\ + MemberAdminForm, StatementOnListForm, KlettertreffAdmin, GroupAdmin +from members.pdf import fill_pdf_form, render_tex, media_path, serve_pdf, find_template, merge_pdfs +from mailer.models import EmailAddress +from finance.models import Statement, Bill + +from django.db import connection +from django.db.migrations.executor import MigrationExecutor +import random +import datetime +from dateutil.relativedelta import relativedelta +import math +import os.path + + +INTERNAL_EMAIL = "foobar@{domain}".format(domain=settings.ALLOWED_EMAIL_DOMAINS_FOR_INVITE_AS_USER[0]) +REGISTRATION_DATA = { + 'prename': 'Peter', + 'lastname': 'Wulter', + 'street': 'Street 123', + 'plz': '12345 EJ', + 'town': 'Town 1', + 'phone_number': '+49 123456', + 'birth_date': '2010-05-17', + 'gender': '2', + 'email': settings.TEST_MAIL, + 'alternative_email': settings.TEST_MAIL, +} +WAITER_DATA = { + 'prename': 'Peter', + 'lastname': 'Wulter', + 'birth_date': '1999-02-16', + 'gender': '0', + 'email': settings.TEST_MAIL, + 'application_text': 'hoho', +} + + +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, gender=DIVERSE) + member.user = user + member.save() + user.is_staff = True + user.save() + + for group in groups: + g = authmodels.Group.objects.get(name=group) + user.groups.add(g) + return user + + +class BasicMemberTestCase(TestCase): + """ + Utility base class for setting up a test environment for member-related tests. + It creates a few groups and members with different attributes. + """ + def setUp(self): + self.jl = Group.objects.create(name="Jugendleiter") + self.alp = Group.objects.create(name="Alpenfuechse") + 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, gender=DIVERSE) + self.fritz.group.add(self.jl) + self.fritz.group.add(self.alp) + self.fritz.save() + + em = EmailAddress.objects.create(name='foobar') + self.alp.contact_email = em + self.alp.save() + + self.peter = Member.objects.create(prename="Peter", lastname="Wulter", + birth_date=timezone.now().date(), + email=settings.TEST_MAIL, gender=MALE) + self.peter.group.add(self.jl) + self.peter.group.add(self.alp) + self.peter.save() + + self.lara = Member.objects.create(prename="Lara", lastname="Wallis", birth_date=timezone.now().date(), + email=INTERNAL_EMAIL, 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, 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, gender=FEMALE) + self.alp.leiters.add(self.lise) + self.alp.save() + + +def add_memberonlist_by_age(excursion, n_yl, n_correct_age, n_too_old): + """ + Utility function for setting up a test environment. Adds `n_yl` youth leaders, + `n_correct_age` members of correct age (i.e. 10 years olds) and + `n_too_old` members that are too old (i.e. 27 years olds) to `excursion`. + """ + for i in range(n_yl): + # a 50 years old + m = Member.objects.create(prename='Peter {}'.format(i), + lastname='Wulter', + birth_date=datetime.datetime.today() - relativedelta(years=50), + email=settings.TEST_MAIL, + gender=FEMALE) + excursion.jugendleiter.add(m) + for i in range(n_correct_age): + # a 10 years old + m = Member.objects.create(prename='Lise {}'.format(i), + lastname='Walter', + birth_date=datetime.datetime.today() - relativedelta(years=10), + email=settings.TEST_MAIL, + gender=FEMALE) + NewMemberOnList.objects.create(member=m, comments='a', memberlist=excursion) + for i in range(n_too_old): + # a 27 years old + m = Member.objects.create(prename='Lise {}'.format(i), + lastname='Walter', + birth_date=datetime.datetime.today() - relativedelta(years=27), + email=settings.TEST_MAIL, + gender=FEMALE) + NewMemberOnList.objects.create(member=m, comments='a', memberlist=excursion) + + +def add_memberonlist_by_local(excursion, n_yl, n_b27_local, n_b27_non_local): + """ + Utility function for setting up a test environment. Adds `n_yl` youth leaders, + `n_b27_local` local members of correct age and + `n_b27_non_local` non-local members of correct age to `excursion`. + """ + for i in range(n_yl): + m = Member.objects.create(prename='Peter {}'.format(i), + lastname='Wulter', + birth_date=datetime.datetime.today() - relativedelta(years=50), + email=settings.TEST_MAIL, + gender=FEMALE) + excursion.jugendleiter.add(m) + NewMemberOnList.objects.create(member=m, comments='a', memberlist=excursion) + for i in range(n_b27_local): + m = Member.objects.create(prename='Lise {}'.format(i), + lastname='Walter', + birth_date=datetime.datetime.today() - relativedelta(years=10), + town=settings.SEKTION, + email=settings.TEST_MAIL, + gender=FEMALE) + NewMemberOnList.objects.create(member=m, comments='a', memberlist=excursion) + for i in range(n_b27_non_local): + m = Member.objects.create(prename='Lise {}'.format(i), + lastname='Walter', + birth_date=datetime.datetime.today() - relativedelta(years=10), + email=settings.TEST_MAIL, + gender=FEMALE) + NewMemberOnList.objects.create(member=m, comments='a', memberlist=excursion) + + +def cleanup_excursion(excursion): + """ + Utility function for cleaning up a test environment. Deletes all members and + youth leaders from `excursion`. + """ + excursion.membersonlist.all().delete() + excursion.jugendleiter.all().delete()