Skip to content

Commit

Permalink
Test ResendRegistrationMailAdminView
Browse files Browse the repository at this point in the history
Added tests for ResendRegistrationMailAdminView and related forms
  • Loading branch information
EricTRL committed Sep 29, 2023
1 parent bb25f4b commit adb7402
Show file tree
Hide file tree
Showing 4 changed files with 115 additions and 4 deletions.
24 changes: 23 additions & 1 deletion membership_file/tests/test_forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

from django.urls import reverse

from membership_file.forms import ContinueMembershipForm, RegisterMemberForm
from membership_file.forms import ContinueMembershipForm, RegisterMemberForm, ResendRegistrationForm
from membership_file.models import Member, MemberYear, Membership, Room
from membership_file.util import LinkAccountTokenGenerator
from utils.testing.form_test_util import FormValidityMixin
Expand Down Expand Up @@ -54,6 +54,28 @@ def test_form_kwarg_requirements(self):
)


@patch("django.http.request.HttpRequest.get_host", return_value="example.com")
class ResendRegistrationFormTestCase(FormValidityMixin, TestCase):
"""Tests for ResendRegistrationForm"""

form_class = ResendRegistrationForm

def get_form_kwargs(self, **kwargs):
kwargs = super().get_form_kwargs(**kwargs)
kwargs.update(request=HttpRequest(), token_generator=LinkAccountTokenGenerator())
return kwargs

def test_fields(self, _):
"""Tests the existence of fields"""
# No fields should exist
form = self.build_form({})
self.assertDictEqual(form.fields, {})

def test_save(self, _):
"""Tests saving"""
self.assertFormValid({})


@patch("django.http.request.HttpRequest.get_host", return_value="example.com")
class RegisterMemberFormTestCase(FormValidityMixin, TestCase):
"""Tests for RegisterMemberForm"""
Expand Down
58 changes: 57 additions & 1 deletion membership_file/tests/test_views.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from django.contrib import messages
from django.contrib.admin.models import LogEntry
from django.contrib.auth import get_user_model
from django.template.response import TemplateResponse
from django.test import TestCase
Expand All @@ -10,7 +11,7 @@

from core.tests.util import suppress_warnings, DynamicRegistryUsageMixin
from membership_file.forms import ContinueMembershipForm
from membership_file.models import Member, MemberYear
from membership_file.models import Member, MemberYear, Room
from membership_file.views import (
ExtendMembershipView,
ExtendMembershipSuccessView,
Expand Down Expand Up @@ -133,6 +134,9 @@ def test_messages(self):
res = self.assertValidPostResponse(data=data, redirect_url=self.base_url)
member = Member.objects.filter(email=self.data["email"]).first()
self.assertIsNotNone(member, "New member should've been created.")
self.assertHasMessage(
res, messages.SUCCESS, reverse(f"admin:membership_file_member_change", args=(member.id,))
)
member.delete()

# Without registration mail
Expand All @@ -144,6 +148,58 @@ def test_messages(self):
res, messages.WARNING, reverse(f"admin:membership_file_member_change", args=(member.id,))
)

def test_admin_log(self):
"""Tests if an admin log entry is created"""
Room.objects.create(name="Room", access="Master Key")
data = {**self.data, "do_send_registration_email": True}
res = self.assertValidPostResponse(data=data, redirect_url=self.base_url)
logs = LogEntry.objects.all()
self.assertEqual(len(logs), 1, "Admin log entry should've been created.")
self.assertEqual(logs.first().user.id, self.base_user_id)
self.assertEqual(logs.first().object_id, str(Member.objects.filter(email=self.data["email"]).first().id))


class ResendRegistrationEmailAdminViewTestCase(ViewValidityMixin, TestCase):
"""Tests for ResendRegistrationMailAdminView"""

fixtures = ["test_users"]
base_url = None
base_user_id = 4
permission_required = ("membership_file.add_member", "membership_file.view_member")
form_context_name = "adminform"

def setUp(self):
self.member = Member.objects.create(first_name="Foo", last_name="", legal_name="Foo", email="foo@example.com")
return super().setUp()

def get_base_url(self):
return reverse(
"admin:membership_file_member_actions", kwargs={"pk": self.member.id, "tool": "resend_verification"}
)

@suppress_warnings
def test_resend_access(self):
"""Tests if the view is only accessible if certain conditions are met"""
# Permission membership_file.add_member
self.assertRequiresPermission("membership_file.add_member")

# Already has an associated member
self.member.user = self.user
self.member.save()
res = self.client.get(self.get_base_url())
self.assertEqual(res.status_code, 400)

def test_successful_get(self):
res = self.assertValidGetResponse()

def test_messages(self):
"""Tests messages and urls they contain"""
url = reverse(f"admin:membership_file_member_change", args=(self.member.id,))
res = self.assertValidPostResponse(redirect_url=url)
self.assertHasMessage(
res, messages.SUCCESS, reverse(f"admin:membership_file_member_change", args=(self.member.id,))
)


class LinkMembershipConfirmViewTestCase(ViewValidityMixin, TestCase):
"""
Expand Down
29 changes: 29 additions & 0 deletions membership_file/tests/tests_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,35 @@ def test_access_registration_view(self):
res: HttpResponse = self.model_admin.register_new_member(self.request, Member.objects.all())
self.assertEqual(res.status_code, 200)

def test_resend_email_action(self):
"""Tests availability of the re-send registration email action button"""
# No permission
member = Member.objects.create(first_name="Foo", last_name="", legal_name="Foo", email="foo@example.com")
self.user.is_superuser = False
self.user.save()
self.user.user_permissions.clear()
self.request.user = User.objects.all().first()
actions = self.model_admin.get_change_actions(self.request, member.id, "")
self.assertNotIn("resend_verification", actions)

# With permission
self.user.user_permissions.add(Permission.objects.get(codename="add_member"))
self.request.user = User.objects.all().first()
actions = self.model_admin.get_change_actions(self.request, member.id, "")
self.assertIn("resend_verification", actions)

# Already has an associated user
member.user = self.user
member.save()
actions = self.model_admin.get_change_actions(self.request, member.id, "")
self.assertNotIn("resend_verification", actions)

def test_access_resend_email_view(self):
"""Tests whether the re-send registration email view is accessible"""
member = Member.objects.create(first_name="Foo", last_name="", legal_name="Foo", email="foo@example.com")
res: HttpResponse = self.model_admin.resend_verification(self.request, member)
self.assertEqual(res.status_code, 200)


# Tests Log deletion when members are deleted
class MemberLogCleanupTest(TestCase):
Expand Down
8 changes: 6 additions & 2 deletions utils/testing/view_test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ class ViewValidityMixin:
"""A mixin for testing views. Takes over a bit of behind the scenes overhead
base_user_id: the id for the user running the sessions normally
base_url: The basic url to navigate to
permission_required: The name of the permission that is required to view the tested page
permission_required: The name (or list of names) of the permission(s) that is required to view the tested page
"""

client = None
Expand All @@ -31,7 +31,11 @@ def setUp(self):
self.client.force_login(self.user)

if self.user and self.permission_required:
self._set_user_perm(self.user, self.permission_required)
perms = self.permission_required
if isinstance(self.permission_required, str):
perms = [self.permission_required]
for perm in perms:
self._set_user_perm(self.user, perm)

def _set_user_perm(self, user: User, perm):
if user.has_perm(perm):
Expand Down

0 comments on commit adb7402

Please sign in to comment.