svthalia/concrexit

View on GitHub
website/registrations/tests/test_forms.py

Summary

Maintainability
F
2 wks
Test Coverage
from django.conf import settings
from django.test import TestCase, override_settings
from django.utils import timezone

from freezegun import freeze_time

from members.models import Member, Membership
from registrations import forms
from registrations.models import Entry, Reference, Renewal


class MemberRegistrationFormTest(TestCase):
    def setUp(self):
        self.data = {
            "first_name": "John",
            "last_name": "Doe",
            "email": "johndoe@example.com",
            "programme": "computingscience",
            "student_number": "s1234567",
            "starting_year": 2014,
            "address_street": "Heyendaalseweg 135",
            "address_street2": "",
            "address_postal_code": "6525AJ",
            "address_city": "Nijmegen",
            "address_country": "NL",
            "phone_number": "06 12345678",
            "birthday": timezone.now().replace(year=1990, day=1),
            "language": "en",
            "length": Entry.MEMBERSHIP_YEAR,
            "membership_type": Membership.MEMBER,
            "privacy_policy": 1,
        }

    def test_privacy_policy_checked(self):
        with self.subTest("Form is valid"):
            form = forms.MemberRegistrationForm(self.data)
            self.assertTrue(form.is_valid(), msg=dict(form.errors))
            self.assertEqual(form.cleaned_data["phone_number"], "0612345678")
        with self.subTest("Form is not valid"):
            self.data["privacy_policy"] = 0
            form = forms.MemberRegistrationForm(self.data)
            self.assertFalse(form.is_valid(), msg=dict(form.errors))

    def test_has_privacy_policy_field(self):
        form = forms.MemberRegistrationForm(self.data)
        self.assertTrue(form.fields["privacy_policy"] is not None)

    def test_price_calculation(self):
        with self.subTest(length=Entry.MEMBERSHIP_YEAR):
            self.data["length"] = Entry.MEMBERSHIP_YEAR
            form = forms.MemberRegistrationForm(self.data)
            form.is_valid()
            registration = form.save()
            self.assertEqual(
                registration.contribution,
                settings.MEMBERSHIP_PRICES[Entry.MEMBERSHIP_YEAR],
            )
            registration.delete()
        with self.subTest(length=Entry.MEMBERSHIP_STUDY):
            self.data["length"] = Entry.MEMBERSHIP_STUDY
            form = forms.MemberRegistrationForm(self.data)
            form.is_valid()
            registration = form.save()
            self.assertEqual(
                registration.contribution,
                settings.MEMBERSHIP_PRICES[Entry.MEMBERSHIP_STUDY],
            )
            registration.delete()


class BenefactorRegistrationFormTest(TestCase):
    def setUp(self):
        self.data = {
            "first_name": "John",
            "last_name": "Doe",
            "email": "johndoe@example.com",
            "programme": "computingscience",
            "student_number": "s1234567",
            "starting_year": 2014,
            "address_street": "Heyendaalseweg 135",
            "address_street2": "",
            "address_postal_code": "6525AJ",
            "address_city": "Nijmegen",
            "address_country": "NL",
            "phone_number": "06123456789",
            "birthday": timezone.now().replace(year=1990, day=1),
            "language": "en",
            "length": Entry.MEMBERSHIP_YEAR,
            "membership_type": Membership.BENEFACTOR,
            "privacy_policy": 1,
            "icis_employee": 1,
            "contribution": 8,
        }

    def test_privacy_policy_checked(self):
        with self.subTest("Form is valid"):
            form = forms.BenefactorRegistrationForm(self.data)
            self.assertTrue(form.is_valid(), msg=dict(form.errors))
        with self.subTest("Form is not valid"):
            self.data["privacy_policy"] = 0
            form = forms.BenefactorRegistrationForm(self.data)
            self.assertFalse(form.is_valid(), msg=dict(form.errors))

    def test_has_privacy_policy_field(self):
        form = forms.BenefactorRegistrationForm(self.data)
        self.assertTrue(form.fields["privacy_policy"] is not None)

    def test_price_calculation(self):
        form = forms.BenefactorRegistrationForm(self.data)
        form.is_valid()
        registration = form.save()
        self.assertEqual(registration.contribution, 8)


@override_settings(SUSPEND_SIGNALS=True)
class RenewalFormTest(TestCase):
    fixtures = ["members.json"]

    def setUp(self):
        self.member = Member.objects.filter(last_name="Wiggers").first()
        self.member.membership_set.all().delete()
        self.data = {
            "member": self.member.pk,
            "length": Entry.MEMBERSHIP_STUDY,
            "contribution": 8,
            "membership_type": Membership.MEMBER,
            "privacy_policy": 1,
        }

    def test_is_valid(self):
        with self.subTest("Form is valid"):
            form = forms.RenewalForm(self.data)
            self.assertTrue(form.is_valid(), msg=dict(form.errors))
        with self.subTest("Form is not valid"):
            self.data["privacy_policy"] = 0
            form = forms.RenewalForm(self.data)
            self.assertFalse(form.is_valid(), msg=dict(form.errors))
        with self.subTest("User is minimized"):
            profile = self.member.profile
            profile.student_number = None
            profile.phone_number = None
            profile.address_street = None
            profile.address_street2 = None
            profile.address_postal_code = None
            profile.address_city = None
            profile.address_country = None
            profile.birthday = None
            profile.emergency_contact_phone_number = None
            profile.emergency_contact = None
            profile.is_minimized = True
            profile.save()
            self.assertFalse(forms.RenewalForm(self.data).is_valid())

    def test_has_privacy_policy_field(self):
        form = forms.RenewalForm(self.data)
        self.assertTrue(form.fields["privacy_policy"] is not None)

    def test_price_calculation(self):
        membership = Membership.objects.create(
            user=self.member,
            type=Membership.MEMBER,
            since="2023-09-01",
            until="2024-08-31",
        )

        with self.subTest("Member, membership upgrade discount"):
            with freeze_time("2024-08-20"):
                self.data["length"] = Entry.MEMBERSHIP_STUDY
                self.data["membership_type"] = Membership.MEMBER
                form = forms.RenewalForm(self.data)
                self.assertTrue(form.is_valid())
                renewal = form.save()
                self.assertEqual(
                    renewal.contribution,
                    settings.MEMBERSHIP_PRICES[Entry.MEMBERSHIP_STUDY]
                    - settings.MEMBERSHIP_PRICES[Entry.MEMBERSHIP_YEAR],
                )
                renewal.delete()

        with self.subTest("Member, membership upgrade discount (last year)"):
            with freeze_time("2024-10-20"):
                # The user had a membership last year, but still should get a discount.
                self.data["length"] = Entry.MEMBERSHIP_STUDY
                self.data["membership_type"] = Membership.MEMBER
                form = forms.RenewalForm(self.data)
                self.assertTrue(form.is_valid())
                renewal = form.save()
                self.assertEqual(
                    renewal.contribution,
                    settings.MEMBERSHIP_PRICES[Entry.MEMBERSHIP_STUDY]
                    - settings.MEMBERSHIP_PRICES[Entry.MEMBERSHIP_YEAR],
                )
                renewal.delete()

        with self.subTest("Member, new year membership before expiry"):
            with freeze_time("2024-08-20"):
                self.data["length"] = Entry.MEMBERSHIP_YEAR
                self.data["membership_type"] = Membership.MEMBER
                form = forms.RenewalForm(self.data)
                self.assertTrue(form.is_valid())
                renewal = form.save()
                self.assertEqual(
                    renewal.contribution,
                    settings.MEMBERSHIP_PRICES[Entry.MEMBERSHIP_YEAR],
                )
                renewal.delete()

        with self.subTest("Member, new year membership after expiry"):
            with freeze_time("2024-09-10"):
                self.data["length"] = Entry.MEMBERSHIP_YEAR
                self.data["membership_type"] = Membership.MEMBER
                form = forms.RenewalForm(self.data)
                self.assertTrue(form.is_valid())
                renewal = form.save()
                self.assertEqual(
                    renewal.contribution,
                    settings.MEMBERSHIP_PRICES[Entry.MEMBERSHIP_YEAR],
                )
                renewal.delete()

        with self.subTest("Member, study membership after more than a year"):
            with freeze_time("2025-09-10"):
                # The membership discount applies up to 1 year after the user last had a membership.
                self.data["length"] = Entry.MEMBERSHIP_STUDY
                self.data["membership_type"] = Membership.MEMBER
                form = forms.RenewalForm(self.data)
                self.assertTrue(form.is_valid())
                renewal = form.save()
                self.assertEqual(
                    renewal.contribution,
                    settings.MEMBERSHIP_PRICES[Entry.MEMBERSHIP_STUDY],
                )
                renewal.delete()

        with self.subTest("Member, new benefactor membership before expiry"):
            with freeze_time("2024-08-20"):
                self.data["length"] = Entry.MEMBERSHIP_YEAR
                self.data["membership_type"] = Membership.BENEFACTOR
                form = forms.RenewalForm(self.data)
                self.assertTrue(form.is_valid())
                renewal = form.save()
                self.assertEqual(renewal.contribution, 8)
                renewal.delete()

        with self.subTest("Member, new benefactor membership before expiry"):
            with freeze_time("2024-09-10"):
                self.data["length"] = Entry.MEMBERSHIP_YEAR
                self.data["membership_type"] = Membership.BENEFACTOR
                form = forms.RenewalForm(self.data)
                self.assertTrue(form.is_valid())
                renewal = form.save()
                self.assertEqual(renewal.contribution, 8)
                renewal.delete()

        membership.type = Membership.BENEFACTOR
        membership.save()

        with self.subTest("Benefactor, year benefactor membership before expiry"):
            with freeze_time("2024-08-20"):
                self.data["length"] = Entry.MEMBERSHIP_YEAR
                self.data["membership_type"] = Membership.BENEFACTOR
                form = forms.RenewalForm(self.data)
                self.assertTrue(form.is_valid())
                renewal = form.save()
                self.assertEqual(renewal.contribution, 8)
                renewal.delete()

        with self.subTest("Benefactor, year benefactor membership after expiry"):
            with freeze_time("2024-09-10"):
                self.data["length"] = Entry.MEMBERSHIP_YEAR
                self.data["membership_type"] = Membership.BENEFACTOR
                form = forms.RenewalForm(self.data)
                self.assertTrue(form.is_valid())
                renewal = form.save()
                self.assertEqual(renewal.contribution, 8)
                renewal.delete()

        with self.subTest("Benefactor, year member membership before expiry"):
            with freeze_time("2024-08-20"):
                self.data["length"] = Entry.MEMBERSHIP_YEAR
                self.data["membership_type"] = Membership.MEMBER
                form = forms.RenewalForm(self.data)
                self.assertTrue(form.is_valid())
                renewal = form.save()
                self.assertEqual(
                    renewal.contribution,
                    settings.MEMBERSHIP_PRICES[Entry.MEMBERSHIP_YEAR],
                )
                renewal.delete()

        with self.subTest("Benefactor, year member membership after expiry"):
            with freeze_time("2024-09-10"):
                self.data["length"] = Entry.MEMBERSHIP_YEAR
                self.data["membership_type"] = Membership.MEMBER
                form = forms.RenewalForm(self.data)
                self.assertTrue(form.is_valid())
                renewal = form.save()
                self.assertEqual(
                    renewal.contribution,
                    settings.MEMBERSHIP_PRICES[Entry.MEMBERSHIP_YEAR],
                )
                renewal.delete()

        with self.subTest("Benefactor, study membership before expiry"):
            with freeze_time("2024-08-20"):
                self.data["length"] = Entry.MEMBERSHIP_STUDY
                self.data["membership_type"] = Membership.MEMBER
                form = forms.RenewalForm(self.data)
                self.assertTrue(form.is_valid())
                renewal = form.save()
                self.assertEqual(
                    renewal.contribution,
                    settings.MEMBERSHIP_PRICES[Entry.MEMBERSHIP_STUDY],
                )
                renewal.delete()

        with self.subTest("Benefactor, study membership after expiry"):
            with freeze_time("2024-09-10"):
                self.data["length"] = Entry.MEMBERSHIP_STUDY
                self.data["membership_type"] = Membership.MEMBER
                form = forms.RenewalForm(self.data)
                self.assertTrue(form.is_valid())
                renewal = form.save()
                self.assertEqual(
                    renewal.contribution,
                    settings.MEMBERSHIP_PRICES[Entry.MEMBERSHIP_STUDY],
                )
                renewal.delete()


@override_settings(SUSPEND_SIGNALS=True)
class ReferenceFormTest(TestCase):
    fixtures = ["members.json"]

    def setUp(self):
        self.member = Member.objects.filter(last_name="Wiggers").first()
        self.member.membership_set.all().delete()
        self.entry = Renewal.objects.create(
            member=self.member, length=Entry.MEMBERSHIP_YEAR
        )
        self.member.membership_set.all().delete()
        self.data = {"member": self.member.pk, "entry": self.entry.pk}

    @freeze_time("2018-08-01")
    def test_clean(self):
        with self.subTest("Form is valid"):
            form = forms.ReferenceForm(self.data)
            self.assertTrue(form.is_valid())
        with self.subTest("Form throws error about benefactor type"):
            m = Membership.objects.create(
                type=Membership.BENEFACTOR,
                user=self.member,
                since="2017-09-01",
                until="2018-08-31",
            )
            form = forms.ReferenceForm(self.data)
            self.assertFalse(form.is_valid())
            self.assertEqual(
                form.errors, {"__all__": ["Benefactors cannot give references."]}
            )
            m.delete()
        with self.subTest("Form throws error about membership end"):
            m = Membership.objects.create(
                type=Membership.MEMBER,
                user=self.member,
                since="2017-09-01",
                until="2018-08-31",
            )
            form = forms.ReferenceForm(self.data)
            self.assertFalse(form.is_valid())
            self.assertEqual(
                form.errors,
                {
                    "__all__": [
                        "It's not possible to give references for "
                        "memberships that start after your own "
                        "membership's end."
                    ]
                },
            )
            m.delete()
        with self.subTest("Form throws error about uniqueness"):
            Reference.objects.create(member=self.member, entry=self.entry)
            form = forms.ReferenceForm(self.data)
            self.assertFalse(form.is_valid())
            self.assertEqual(
                form.errors,
                {"__all__": ["You've already given a reference for this person."]},
            )