svthalia/concrexit

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

Summary

Maintainability
B
4 hrs
Test Coverage
from unittest import mock

from django.contrib.admin import AdminSite
from django.contrib.auth.models import Permission
from django.http import HttpRequest
from django.test import TestCase, override_settings
from django.utils import timezone

from members.models import Member
from members.models.membership import Membership
from payments.widgets import PaymentWidget
from registrations import admin, payables
from registrations.models import Entry, Reference, Registration, Renewal


def _get_mock_request(perms=None):
    if perms is None:
        perms = []

    mock_request = HttpRequest()
    mock_request.META = mock.Mock(return_value={})
    mock_request.user = mock.MagicMock()
    mock_request.user.pk = 1
    mock_request.user.is_superuser = False
    mock_request.user.user_permissions = perms
    mock_request.user.has_perm = lambda x: x in perms
    mock_request._messages = mock.Mock()
    return mock_request


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

    def setUp(self):
        self.site = AdminSite()
        self.admin = admin.RegistrationAdmin(Registration, admin_site=self.site)
        payables.register()

    def test_get_readonly_fields(self):
        request = _get_mock_request([])

        fields = self.admin.get_readonly_fields(request)
        self.assertEqual(fields, ["status", "created_at", "updated_at", "payment"])

        fields = self.admin.get_readonly_fields(
            request, Registration(status=Entry.STATUS_CONFIRM)
        )
        self.assertEqual(fields, ["status", "created_at", "updated_at", "payment"])

        fields = self.admin.get_readonly_fields(
            request, Registration(status=Entry.STATUS_REJECTED)
        )
        self.assertCountEqual(
            fields,
            [
                "created_at",
                "updated_at",
                "status",
                "length",
                "membership_type",
                "remarks",
                "entry_ptr",
                "username",
                "first_name",
                "last_name",
                "birthday",
                "email",
                "phone_number",
                "student_number",
                "programme",
                "starting_year",
                "address_street",
                "address_street2",
                "address_postal_code",
                "address_city",
                "address_country",
                "membership",
                "optin_mailinglist",
                "optin_birthday",
                "contribution",
                "direct_debit",
                "initials",
                "iban",
                "bic",
                "signature",
                "optin_thabloid",
            ],
        )

        fields = self.admin.get_readonly_fields(
            request, Registration(status=Entry.STATUS_ACCEPTED)
        )
        self.assertCountEqual(
            fields,
            [
                "created_at",
                "updated_at",
                "status",
                "length",
                "membership_type",
                "remarks",
                "entry_ptr",
                "username",
                "first_name",
                "last_name",
                "birthday",
                "email",
                "phone_number",
                "student_number",
                "programme",
                "starting_year",
                "address_street",
                "address_street2",
                "address_postal_code",
                "address_city",
                "address_country",
                "membership",
                "optin_mailinglist",
                "optin_birthday",
                "contribution",
                "direct_debit",
                "initials",
                "iban",
                "bic",
                "signature",
                "optin_thabloid",
            ],
        )

        fields = self.admin.get_readonly_fields(
            request, Registration(status=Entry.STATUS_COMPLETED)
        )
        self.assertCountEqual(
            fields,
            [
                "created_at",
                "updated_at",
                "status",
                "length",
                "membership_type",
                "remarks",
                "entry_ptr",
                "username",
                "first_name",
                "last_name",
                "birthday",
                "email",
                "phone_number",
                "student_number",
                "programme",
                "starting_year",
                "address_street",
                "address_street2",
                "address_postal_code",
                "address_city",
                "address_country",
                "membership",
                "optin_mailinglist",
                "optin_birthday",
                "contribution",
                "direct_debit",
                "initials",
                "iban",
                "bic",
                "signature",
                "optin_thabloid",
            ],
        )

    def test_name(self):
        reg = Registration(
            first_name="John",
            last_name="Doe",
        )
        self.assertEqual(self.admin.name(reg), reg.get_full_name())

    def test_reference_count(self):
        reg = Registration.objects.create(
            length=Entry.MEMBERSHIP_YEAR,
            first_name="John",
            last_name="Doe",
            birthday=timezone.now(),
        )
        self.assertEqual(self.admin.reference_count(reg), 0)
        Reference.objects.create(entry=reg, member=Member.objects.get(pk=1))
        Reference.objects.create(entry=reg, member=Member.objects.get(pk=2))
        self.assertEqual(self.admin.reference_count(reg), 2)

    def test_formfield_for_dbfield(self):
        with self.subTest("Payment field"):
            field = self.admin.formfield_for_dbfield(
                Registration._meta.get_field("payment"), request=None
            )
            self.assertIsInstance(field.widget, PaymentWidget)
        with self.subTest("Other field"):
            field = self.admin.formfield_for_dbfield(
                Registration._meta.get_field("first_name"), request=None
            )
            self.assertNotIsInstance(field.widget, PaymentWidget)
            self.assertIsNotNone(field.widget)

    def test_save_model(self):
        reg = Registration(
            length=Entry.MEMBERSHIP_YEAR,
            status=Registration.STATUS_REVIEW,
            birthday=timezone.now(),
        )

        with self.subTest("Status review saves"):
            reg.first_name = "Test1"
            self.admin.save_model({}, reg, None, True)
            self.assertTrue(Registration.objects.filter(first_name="Test1").exists())

        with self.subTest("Status accepted, no save"):
            reg.first_name = "Test2"
            reg.status = Registration.STATUS_ACCEPTED
            self.admin.save_model({}, reg, None, True)
            self.assertFalse(Registration.objects.filter(first_name="Test2").exists())

        with self.subTest("Status reject, no save"):
            reg.first_name = "Test2"
            reg.status = Registration.STATUS_REJECTED
            self.admin.save_model({}, reg, None, True)
            self.assertFalse(Registration.objects.filter(first_name="Test2").exists())

        with self.subTest("Status completed, no save"):
            reg.first_name = "Test2"
            reg.status = Registration.STATUS_COMPLETED
            self.admin.save_model({}, reg, None, True)
            self.assertFalse(Registration.objects.filter(first_name="Test2").exists())

    def test_bulk_actions_permissions(self):
        admin = Member.objects.get(pk=1)
        self.client.force_login(Member.objects.get(pk=1))
        Registration.objects.create(
            length=Entry.MEMBERSHIP_YEAR,
            status=Entry.STATUS_REVIEW,
            birthday=timezone.now(),
        )

        Renewal.objects.create(
            length=Entry.MEMBERSHIP_YEAR,
            status=Entry.STATUS_REVIEW,
            member=Member.objects.get(pk=2),
        )

        response = self.client.get("/admin/registrations/registration/")
        self.assertContains(response, "Accept selected registrations")
        self.assertContains(response, "Reject selected registrations")

        admin.is_superuser = False
        admin.is_staff = True
        admin.save()

        admin.user_permissions.add(Permission.objects.get(codename="view_registration"))

        response = self.client.get("/admin/registrations/registration/")
        self.assertNotContains(response, "Accept selected registrations")
        self.assertNotContains(response, "Accept selected registrations")

        admin.user_permissions.add(Permission.objects.get(codename="review_entries"))

        response = self.client.get("/admin/registrations/registration/")
        self.assertContains(response, "Accept selected registrations")
        self.assertContains(response, "Reject selected registrations")

    def test_can_open_registration_change_view(self):
        # Just a sanity check and to get coverage.
        self.client.force_login(Member.objects.get(pk=1))

        registration = Registration.objects.create(
            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).date(),
            length=Entry.MEMBERSHIP_YEAR,
            contribution=7.5,
            membership_type=Membership.MEMBER,
            status=Entry.STATUS_CONFIRM,
        )
        response = self.client.get(
            f"/admin/registrations/registration/{registration.pk}/change/"
        )
        self.assertEqual(response.status_code, 200)


class RenewalAdminTest(TestCase):
    fixtures = ["members.json"]

    def setUp(self):
        self.site = AdminSite()
        self.admin = admin.RenewalAdmin(Renewal, admin_site=self.site)

    def test_get_readonly_fields(self):
        request = _get_mock_request([])

        fields = self.admin.get_readonly_fields(request)
        self.assertEqual(fields, ["status", "created_at", "updated_at", "payment"])

        fields = self.admin.get_readonly_fields(
            request, Renewal(status=Entry.STATUS_CONFIRM)
        )
        self.assertEqual(
            fields, ["status", "created_at", "updated_at", "payment", "member"]
        )

        fields = self.admin.get_readonly_fields(
            request, Renewal(status=Entry.STATUS_REJECTED)
        )
        self.assertCountEqual(
            fields,
            [
                "created_at",
                "updated_at",
                "status",
                "length",
                "membership_type",
                "remarks",
                "entry_ptr",
                "member",
                "membership",
                "contribution",
            ],
        )

        fields = self.admin.get_readonly_fields(
            request, Renewal(status=Entry.STATUS_ACCEPTED)
        )
        self.assertCountEqual(
            fields,
            [
                "created_at",
                "updated_at",
                "status",
                "length",
                "membership_type",
                "remarks",
                "entry_ptr",
                "member",
                "membership",
                "contribution",
            ],
        )

    def test_name(self):
        renewal = Renewal(
            member=Member(
                first_name="John",
                last_name="Doe",
            )
        )
        self.assertEqual(self.admin.name(renewal), renewal.member.get_full_name())

    def test_email(self):
        renewal = Renewal(member=Member(email="test@example.org"))
        self.assertEqual(self.admin.email(renewal), "test@example.org")

    def test_bulk_actions_permissions(self):
        admin = Member.objects.get(pk=1)
        self.client.force_login(Member.objects.get(pk=1))

        Registration.objects.create(
            length=Entry.MEMBERSHIP_YEAR,
            status=Entry.STATUS_REVIEW,
            birthday=timezone.now(),
        )

        Renewal.objects.create(
            length=Entry.MEMBERSHIP_YEAR,
            status=Entry.STATUS_REVIEW,
            member=Member.objects.get(pk=2),
        )

        response = self.client.get("/admin/registrations/renewal/")
        self.assertContains(response, "Accept selected renewals")
        self.assertContains(response, "Reject selected renewals")

        admin.is_superuser = False
        admin.is_staff = True
        admin.save()

        admin.user_permissions.add(Permission.objects.get(codename="view_renewal"))

        response = self.client.get("/admin/registrations/renewal/")
        self.assertNotContains(response, "Accept selected renewals")
        self.assertNotContains(response, "Accept selected renewals")

        admin.user_permissions.add(Permission.objects.get(codename="review_entries"))

        response = self.client.get("/admin/registrations/renewal/")
        self.assertContains(response, "Accept selected renewals")
        self.assertContains(response, "Reject selected renewals")