Coverage for website/registrations/tests/test_admin.py: 98.63%
144 statements
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
« prev ^ index » next coverage.py v7.6.7, created at 2025-08-14 10:31 +0000
1from unittest import mock
3from django.contrib.admin import AdminSite
4from django.contrib.auth.models import Permission
5from django.http import HttpRequest
6from django.test import TestCase, override_settings
7from django.utils import timezone
9from members.models import Member
10from members.models.membership import Membership
11from payments.widgets import PaymentWidget
12from registrations import admin, payables
13from registrations.models import Entry, Reference, Registration, Renewal
16def _get_mock_request(perms=None):
17 if perms is None: 17 ↛ 18line 17 didn't jump to line 18 because the condition on line 17 was never true
18 perms = []
20 mock_request = HttpRequest()
21 mock_request.META = mock.Mock(return_value={})
22 mock_request.user = mock.MagicMock()
23 mock_request.user.pk = 1
24 mock_request.user.is_superuser = False
25 mock_request.user.user_permissions = perms
26 mock_request.user.has_perm = lambda x: x in perms
27 mock_request._messages = mock.Mock()
28 return mock_request
31@override_settings(SUSPEND_SIGNALS=True)
32class RegistrationAdminTest(TestCase):
33 fixtures = ["members.json"]
35 def setUp(self):
36 self.site = AdminSite()
37 self.admin = admin.RegistrationAdmin(Registration, admin_site=self.site)
38 payables.register()
40 def test_get_readonly_fields(self):
41 request = _get_mock_request([])
43 fields = self.admin.get_readonly_fields(request)
44 self.assertEqual(fields, ["status", "created_at", "updated_at", "payment"])
46 fields = self.admin.get_readonly_fields(
47 request, Registration(status=Entry.STATUS_CONFIRM)
48 )
49 self.assertEqual(fields, ["status", "created_at", "updated_at", "payment"])
51 fields = self.admin.get_readonly_fields(
52 request, Registration(status=Entry.STATUS_REJECTED)
53 )
54 self.assertCountEqual(
55 fields,
56 [
57 "created_at",
58 "updated_at",
59 "status",
60 "length",
61 "membership_type",
62 "remarks",
63 "entry_ptr",
64 "username",
65 "first_name",
66 "last_name",
67 "birthday",
68 "email",
69 "phone_number",
70 "student_number",
71 "programme",
72 "starting_year",
73 "address_street",
74 "address_street2",
75 "address_postal_code",
76 "address_city",
77 "address_country",
78 "membership",
79 "optin_mailinglist",
80 "optin_birthday",
81 "contribution",
82 "direct_debit",
83 "initials",
84 "iban",
85 "bic",
86 "signature",
87 "optin_thabloid",
88 ],
89 )
91 fields = self.admin.get_readonly_fields(
92 request, Registration(status=Entry.STATUS_ACCEPTED)
93 )
94 self.assertCountEqual(
95 fields,
96 [
97 "created_at",
98 "updated_at",
99 "status",
100 "length",
101 "membership_type",
102 "remarks",
103 "entry_ptr",
104 "username",
105 "first_name",
106 "last_name",
107 "birthday",
108 "email",
109 "phone_number",
110 "student_number",
111 "programme",
112 "starting_year",
113 "address_street",
114 "address_street2",
115 "address_postal_code",
116 "address_city",
117 "address_country",
118 "membership",
119 "optin_mailinglist",
120 "optin_birthday",
121 "contribution",
122 "direct_debit",
123 "initials",
124 "iban",
125 "bic",
126 "signature",
127 "optin_thabloid",
128 ],
129 )
131 fields = self.admin.get_readonly_fields(
132 request, Registration(status=Entry.STATUS_COMPLETED)
133 )
134 self.assertCountEqual(
135 fields,
136 [
137 "created_at",
138 "updated_at",
139 "status",
140 "length",
141 "membership_type",
142 "remarks",
143 "entry_ptr",
144 "username",
145 "first_name",
146 "last_name",
147 "birthday",
148 "email",
149 "phone_number",
150 "student_number",
151 "programme",
152 "starting_year",
153 "address_street",
154 "address_street2",
155 "address_postal_code",
156 "address_city",
157 "address_country",
158 "membership",
159 "optin_mailinglist",
160 "optin_birthday",
161 "contribution",
162 "direct_debit",
163 "initials",
164 "iban",
165 "bic",
166 "signature",
167 "optin_thabloid",
168 ],
169 )
171 def test_name(self):
172 reg = Registration(
173 first_name="John",
174 last_name="Doe",
175 )
176 self.assertEqual(self.admin.name(reg), reg.get_full_name())
178 def test_reference_count(self):
179 reg = Registration.objects.create(
180 length=Entry.MEMBERSHIP_YEAR,
181 first_name="John",
182 last_name="Doe",
183 birthday=timezone.now(),
184 )
185 self.assertEqual(self.admin.reference_count(reg), 0)
186 Reference.objects.create(entry=reg, member=Member.objects.get(pk=1))
187 Reference.objects.create(entry=reg, member=Member.objects.get(pk=2))
188 self.assertEqual(self.admin.reference_count(reg), 2)
190 def test_formfield_for_dbfield(self):
191 with self.subTest("Payment field"):
192 field = self.admin.formfield_for_dbfield(
193 Registration._meta.get_field("payment"), request=None
194 )
195 self.assertIsInstance(field.widget, PaymentWidget)
196 with self.subTest("Other field"):
197 field = self.admin.formfield_for_dbfield(
198 Registration._meta.get_field("first_name"), request=None
199 )
200 self.assertNotIsInstance(field.widget, PaymentWidget)
201 self.assertIsNotNone(field.widget)
203 def test_save_model(self):
204 reg = Registration(
205 length=Entry.MEMBERSHIP_YEAR,
206 status=Registration.STATUS_REVIEW,
207 birthday=timezone.now(),
208 )
210 with self.subTest("Status review saves"):
211 reg.first_name = "Test1"
212 self.admin.save_model({}, reg, None, True)
213 self.assertTrue(Registration.objects.filter(first_name="Test1").exists())
215 with self.subTest("Status accepted, no save"):
216 reg.first_name = "Test2"
217 reg.status = Registration.STATUS_ACCEPTED
218 self.admin.save_model({}, reg, None, True)
219 self.assertFalse(Registration.objects.filter(first_name="Test2").exists())
221 with self.subTest("Status reject, no save"):
222 reg.first_name = "Test2"
223 reg.status = Registration.STATUS_REJECTED
224 self.admin.save_model({}, reg, None, True)
225 self.assertFalse(Registration.objects.filter(first_name="Test2").exists())
227 with self.subTest("Status completed, no save"):
228 reg.first_name = "Test2"
229 reg.status = Registration.STATUS_COMPLETED
230 self.admin.save_model({}, reg, None, True)
231 self.assertFalse(Registration.objects.filter(first_name="Test2").exists())
233 def test_bulk_actions_permissions(self):
234 admin = Member.objects.get(pk=1)
235 self.client.force_login(Member.objects.get(pk=1))
236 Registration.objects.create(
237 length=Entry.MEMBERSHIP_YEAR,
238 status=Entry.STATUS_REVIEW,
239 birthday=timezone.now(),
240 )
242 Renewal.objects.create(
243 length=Entry.MEMBERSHIP_YEAR,
244 status=Entry.STATUS_REVIEW,
245 member=Member.objects.get(pk=2),
246 )
248 response = self.client.get("/admin/registrations/registration/")
249 self.assertContains(response, "Accept selected registrations")
250 self.assertContains(response, "Reject selected registrations")
252 admin.is_superuser = False
253 admin.is_staff = True
254 admin.save()
256 admin.user_permissions.add(Permission.objects.get(codename="view_registration"))
258 response = self.client.get("/admin/registrations/registration/")
259 self.assertNotContains(response, "Accept selected registrations")
260 self.assertNotContains(response, "Accept selected registrations")
262 admin.user_permissions.add(Permission.objects.get(codename="review_entries"))
264 response = self.client.get("/admin/registrations/registration/")
265 self.assertContains(response, "Accept selected registrations")
266 self.assertContains(response, "Reject selected registrations")
268 def test_can_open_registration_change_view(self):
269 # Just a sanity check and to get coverage.
270 self.client.force_login(Member.objects.get(pk=1))
272 registration = Registration.objects.create(
273 first_name="John",
274 last_name="Doe",
275 email="johndoe@example.com",
276 programme="computingscience",
277 student_number="s1234567",
278 starting_year=2014,
279 address_street="Heyendaalseweg 135",
280 address_street2="",
281 address_postal_code="6525AJ",
282 address_city="Nijmegen",
283 address_country="NL",
284 phone_number="06123456789",
285 birthday=timezone.now().replace(year=1990, day=1).date(),
286 length=Entry.MEMBERSHIP_YEAR,
287 contribution=7.5,
288 membership_type=Membership.MEMBER,
289 status=Entry.STATUS_CONFIRM,
290 )
291 response = self.client.get(
292 f"/admin/registrations/registration/{registration.pk}/change/"
293 )
294 self.assertEqual(response.status_code, 200)
297class RenewalAdminTest(TestCase):
298 fixtures = ["members.json"]
300 def setUp(self):
301 self.site = AdminSite()
302 self.admin = admin.RenewalAdmin(Renewal, admin_site=self.site)
304 def test_get_readonly_fields(self):
305 request = _get_mock_request([])
307 fields = self.admin.get_readonly_fields(request)
308 self.assertEqual(fields, ["status", "created_at", "updated_at", "payment"])
310 fields = self.admin.get_readonly_fields(
311 request, Renewal(status=Entry.STATUS_CONFIRM)
312 )
313 self.assertEqual(
314 fields, ["status", "created_at", "updated_at", "payment", "member"]
315 )
317 fields = self.admin.get_readonly_fields(
318 request, Renewal(status=Entry.STATUS_REJECTED)
319 )
320 self.assertCountEqual(
321 fields,
322 [
323 "created_at",
324 "updated_at",
325 "status",
326 "length",
327 "membership_type",
328 "remarks",
329 "entry_ptr",
330 "member",
331 "membership",
332 "contribution",
333 ],
334 )
336 fields = self.admin.get_readonly_fields(
337 request, Renewal(status=Entry.STATUS_ACCEPTED)
338 )
339 self.assertCountEqual(
340 fields,
341 [
342 "created_at",
343 "updated_at",
344 "status",
345 "length",
346 "membership_type",
347 "remarks",
348 "entry_ptr",
349 "member",
350 "membership",
351 "contribution",
352 ],
353 )
355 def test_name(self):
356 renewal = Renewal(
357 member=Member(
358 first_name="John",
359 last_name="Doe",
360 )
361 )
362 self.assertEqual(self.admin.name(renewal), renewal.member.get_full_name())
364 def test_email(self):
365 renewal = Renewal(member=Member(email="test@example.org"))
366 self.assertEqual(self.admin.email(renewal), "test@example.org")
368 def test_bulk_actions_permissions(self):
369 admin = Member.objects.get(pk=1)
370 self.client.force_login(Member.objects.get(pk=1))
372 Registration.objects.create(
373 length=Entry.MEMBERSHIP_YEAR,
374 status=Entry.STATUS_REVIEW,
375 birthday=timezone.now(),
376 )
378 Renewal.objects.create(
379 length=Entry.MEMBERSHIP_YEAR,
380 status=Entry.STATUS_REVIEW,
381 member=Member.objects.get(pk=2),
382 )
384 response = self.client.get("/admin/registrations/renewal/")
385 self.assertContains(response, "Accept selected renewals")
386 self.assertContains(response, "Reject selected renewals")
388 admin.is_superuser = False
389 admin.is_staff = True
390 admin.save()
392 admin.user_permissions.add(Permission.objects.get(codename="view_renewal"))
394 response = self.client.get("/admin/registrations/renewal/")
395 self.assertNotContains(response, "Accept selected renewals")
396 self.assertNotContains(response, "Accept selected renewals")
398 admin.user_permissions.add(Permission.objects.get(codename="review_entries"))
400 response = self.client.get("/admin/registrations/renewal/")
401 self.assertContains(response, "Accept selected renewals")
402 self.assertContains(response, "Reject selected renewals")