Coverage for website/events/tests/test_services.py: 100.00%
222 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 datetime import datetime, timedelta
2from unittest import mock
4from django.contrib.auth.models import AnonymousUser, Permission
5from django.http import HttpRequest
6from django.test import TestCase, override_settings
7from django.utils import timezone
9from freezegun import freeze_time
11from activemembers.models import Committee, MemberGroupMembership
12from events import services
13from events.exceptions import RegistrationError
14from events.models import Event, EventRegistration, RegistrationInformationField
15from members.models import Member
18@freeze_time("2017-01-01")
19@override_settings(SUSPEND_SIGNALS=True)
20class ServicesTest(TestCase):
21 fixtures = ["members.json", "member_groups.json"]
23 @classmethod
24 def setUpTestData(cls):
25 cls.committee = Committee.objects.get(pk=1)
26 cls.event = Event.objects.create(
27 pk=1,
28 title="testevent",
29 description="desc",
30 published=True,
31 start=(timezone.now() + timedelta(hours=1)),
32 end=(timezone.now() + timedelta(hours=2)),
33 location="test location",
34 map_location="test map location",
35 price=0.00,
36 fine=0.00,
37 )
38 cls.event.organisers.add(cls.committee)
39 cls.member = Member.objects.filter(last_name="Wiggers").first()
40 cls.member.is_superuser = False
41 cls.member.save()
43 cls.perm_change_event = Permission.objects.get(
44 content_type__model="event", codename="change_event"
45 )
46 cls.perm_override_organiser = Permission.objects.get(
47 content_type__model="event", codename="override_organiser"
48 )
50 def setUp(self):
51 self.committee.refresh_from_db()
52 self.event.refresh_from_db()
53 self.member.refresh_from_db()
55 def _toggle_event_change_perm(self, enable):
56 # Refetch member to empty permissions cache
57 self.member = Member.objects.get(pk=self.member.pk)
58 if enable:
59 self.member.user_permissions.add(self.perm_change_event)
60 else:
61 self.member.user_permissions.remove(self.perm_change_event)
63 def _toggle_override_organiser_perm(self, enable):
64 # Refetch member to empty permissions cache
65 self.member = Member.objects.get(pk=self.member.pk)
66 if enable:
67 self.member.user_permissions.add(self.perm_override_organiser)
68 else:
69 self.member.user_permissions.remove(self.perm_override_organiser)
71 def test_is_user_registered(self):
72 self.assertEqual(None, services.is_user_registered(AnonymousUser(), self.event))
73 self.event.registration_start = timezone.now() - timedelta(hours=1)
74 self.event.registration_end = timezone.now()
75 self.assertEqual(None, services.is_user_registered(AnonymousUser(), self.event))
76 self.assertFalse(services.is_user_registered(self.member, self.event))
77 EventRegistration.objects.create(
78 event=self.event, member=self.member, date_cancelled=None
79 )
81 self.assertTrue(services.is_user_registered(self.member, self.event))
83 def test_event_permissions(self):
84 self.event.registration_start = timezone.now() - timedelta(hours=1)
85 self.event.registration_end = timezone.now() + timedelta(hours=1)
87 self.assertEqual(
88 {
89 "create_registration": False,
90 "create_registration_when_open": False,
91 "cancel_registration": False,
92 "update_registration": False,
93 "manage_event": False,
94 },
95 services.event_permissions(AnonymousUser(), self.event),
96 )
98 self.member.profile.event_permissions = "nothing"
100 self.assertEqual(
101 {
102 "create_registration": False,
103 "create_registration_when_open": False,
104 "cancel_registration": False,
105 "update_registration": False,
106 "manage_event": False,
107 },
108 services.event_permissions(self.member, self.event),
109 )
111 self.member.profile.event_permissions = "all"
113 self.assertEqual(
114 {
115 "create_registration": True,
116 "create_registration_when_open": False,
117 "cancel_registration": False,
118 "update_registration": False,
119 "manage_event": False,
120 },
121 services.event_permissions(self.member, self.event),
122 )
124 reg = EventRegistration.objects.create(
125 event=self.event, member=self.member, date_cancelled=None
126 )
128 self.assertEqual(
129 {
130 "create_registration": False,
131 "create_registration_when_open": False,
132 "cancel_registration": True,
133 "update_registration": False,
134 "manage_event": False,
135 },
136 services.event_permissions(self.member, self.event),
137 )
139 RegistrationInformationField.objects.create(
140 event=self.event,
141 type=RegistrationInformationField.BOOLEAN_FIELD,
142 name="test",
143 required=False,
144 )
146 self.assertEqual(
147 {
148 "create_registration": False,
149 "create_registration_when_open": False,
150 "cancel_registration": True,
151 "update_registration": True,
152 "manage_event": False,
153 },
154 services.event_permissions(self.member, self.event),
155 )
157 reg.date_cancelled = timezone.now()
158 reg.save()
160 self.assertEqual(
161 {
162 "create_registration": True,
163 "create_registration_when_open": False,
164 "cancel_registration": False,
165 "update_registration": False,
166 "manage_event": False,
167 },
168 services.event_permissions(self.member, self.event),
169 )
171 def test_is_organiser(self):
172 self.assertFalse(services.is_organiser(AnonymousUser(), self.event))
174 self.assertFalse(services.is_organiser(self.member, self.event))
175 self.member.is_superuser = True
176 self.assertTrue(services.is_organiser(self.member, self.event))
177 self.member.is_superuser = False
179 self._toggle_override_organiser_perm(True)
180 self.assertTrue(services.is_organiser(self.member, self.event))
181 self._toggle_override_organiser_perm(False)
183 self._toggle_event_change_perm(True)
184 self.assertFalse(services.is_organiser(self.member, self.event))
185 membership = MemberGroupMembership.objects.create(
186 member=self.member, group=self.committee
187 )
188 self.assertTrue(services.is_organiser(self.member, self.event))
189 self.assertFalse(services.is_organiser(self.member, None))
190 self._toggle_event_change_perm(False)
191 membership.delete()
193 @mock.patch("events.services.event_permissions")
194 def test_create_registration(self, perms_mock):
195 self.event.registration_start = timezone.now() - timedelta(hours=2)
196 self.event.registration_end = timezone.now() + timedelta(hours=1)
198 perms_mock.return_value = {
199 "create_registration": False,
200 "cancel_registration": False,
201 "update_registration": False,
202 }
204 with self.assertRaises(RegistrationError):
205 services.create_registration(AnonymousUser(), self.event)
207 perms_mock.return_value["create_registration"] = True
209 reg = services.create_registration(self.member, self.event)
210 self.assertEqual(reg.event, self.event)
211 self.assertEqual(reg.member, self.member)
212 self.assertEqual(reg.date_cancelled, None)
214 reg.date_cancelled = timezone.make_aware(datetime(2017, 9, 1))
215 reg.save()
217 reg = services.create_registration(self.member, self.event)
218 self.assertEqual(reg.event, self.event)
219 self.assertEqual(reg.member, self.member)
220 self.assertEqual(reg.date_cancelled, None)
222 self.event.cancel_deadline = timezone.now() - timedelta(hours=1)
223 self.event.save()
225 reg.date_cancelled = timezone.now()
226 reg.save()
228 with self.assertRaises(RegistrationError):
229 services.create_registration(self.member, self.event)
231 reg.date_cancelled = None
232 reg.save()
234 services.create_registration(self.member, self.event)
236 perms_mock.return_value["create_registration"] = False
237 perms_mock.return_value["cancel_registration"] = True
239 with self.assertRaises(RegistrationError):
240 services.create_registration(self.member, self.event)
242 @mock.patch("events.emails.notify_organiser")
243 @mock.patch("events.emails.notify_first_waiting")
244 @mock.patch("events.services.event_permissions")
245 def test_cancel_registration(
246 self, perms_mock, notify_first_mock, notify_organiser_mock
247 ):
248 self.event.registration_start = timezone.now() - timedelta(hours=2)
249 self.event.registration_end = timezone.now() + timedelta(hours=1)
250 self.event.max_participants = 1
251 self.event.save()
253 perms_mock.return_value = {
254 "create_registration": False,
255 "cancel_registration": False,
256 "update_registration": False,
257 }
259 with self.assertRaises(RegistrationError):
260 services.cancel_registration(self.member, self.event)
262 registration = EventRegistration.objects.create(
263 event=self.event,
264 member=self.member,
265 )
267 with self.assertRaises(RegistrationError):
268 services.cancel_registration(self.member, self.event)
270 perms_mock.return_value["cancel_registration"] = True
272 services.cancel_registration(self.member, self.event)
273 notify_first_mock.assert_not_called()
275 registration.date_cancelled = None
276 registration.save()
277 registration2 = EventRegistration.objects.create(
278 event=self.event, member=Member.objects.filter(username="testuser2").first()
279 )
280 services.cancel_registration(self.member, self.event)
281 notify_first_mock.assert_called_once_with(self.event, registration2)
283 self.event.send_cancel_email = True
284 self.event.save()
286 services.cancel_registration(self.member, self.event)
288 self.event.cancel_deadline = timezone.make_aware(datetime(2017, 1, 1))
289 self.event.save()
291 services.cancel_registration(self.member, self.event)
292 notify_organiser_mock.assert_called_once_with(self.event, registration)
294 registration.refresh_from_db()
295 self.assertIsNotNone(registration.date_cancelled)
296 registration.date_cancelled = None
297 registration.save()
299 EventRegistration.objects.create(
300 event=self.event,
301 member=Member.objects.filter(username="testuser").first(),
302 date=timezone.make_aware(datetime(2017, 9, 1)),
303 )
305 services.cancel_registration(self.member, self.event)
307 @mock.patch("events.services.event_permissions")
308 def test_update_registration_user(self, perms_mock):
309 self.event.registration_start = timezone.now() - timedelta(hours=2)
310 self.event.registration_end = timezone.now() + timedelta(hours=1)
312 perms_mock.return_value = {
313 "create_registration": False,
314 "cancel_registration": False,
315 "update_registration": False,
316 }
318 with self.assertRaises(RegistrationError):
319 services.update_registration(self.member, self.event, field_values=None)
321 registration = EventRegistration.objects.create(
322 event=self.event,
323 member=self.member,
324 )
326 services.update_registration(self.member, self.event, field_values=None)
328 perms_mock.return_value["update_registration"] = True
330 field1 = RegistrationInformationField.objects.create(
331 type=RegistrationInformationField.INTEGER_FIELD,
332 event=self.event,
333 required=False,
334 )
336 field2 = RegistrationInformationField.objects.create(
337 type=RegistrationInformationField.BOOLEAN_FIELD,
338 event=self.event,
339 required=False,
340 )
342 field3 = RegistrationInformationField.objects.create(
343 type=RegistrationInformationField.TEXT_FIELD,
344 event=self.event,
345 required=False,
346 )
348 fields = [
349 (f"info_field_{field1.id}", None),
350 (f"info_field_{field2.id}", None),
351 (f"info_field_{field3.id}", None),
352 ]
354 services.update_registration(self.member, self.event, field_values=fields)
356 self.assertEqual(field1.get_value_for(registration), 0)
357 self.assertEqual(field2.get_value_for(registration), False)
358 self.assertEqual(field3.get_value_for(registration), "")
360 fields = [
361 (f"info_field_{field1.id}", 2),
362 (f"info_field_{field2.id}", True),
363 (f"info_field_{field3.id}", "text"),
364 ]
366 services.update_registration(self.member, self.event, field_values=fields)
368 self.assertEqual(field1.get_value_for(registration), 2)
369 self.assertEqual(field2.get_value_for(registration), True)
370 self.assertEqual(field3.get_value_for(registration), "text")
372 field1.delete()
373 field2.delete()
374 field3.delete()
376 @mock.patch("events.services.event_permissions")
377 def test_update_registration_guest(self, perms_mock):
378 self.event.registration_start = timezone.now() - timedelta(hours=2)
379 self.event.registration_end = timezone.now() + timedelta(hours=1)
381 perms_mock.return_value = {
382 "create_registration": False,
383 "cancel_registration": False,
384 "update_registration": False,
385 }
387 with self.assertRaises(RegistrationError):
388 services.update_registration(self.member, self.event, field_values=None)
390 registration = EventRegistration.objects.create(
391 event=self.event,
392 name="test",
393 )
395 services.update_registration(event=self.event, name="test", field_values=None)
397 perms_mock.return_value["update_registration"] = True
399 field1 = RegistrationInformationField.objects.create(
400 type=RegistrationInformationField.INTEGER_FIELD,
401 event=self.event,
402 required=False,
403 )
405 field2 = RegistrationInformationField.objects.create(
406 type=RegistrationInformationField.BOOLEAN_FIELD,
407 event=self.event,
408 required=False,
409 )
411 field3 = RegistrationInformationField.objects.create(
412 type=RegistrationInformationField.TEXT_FIELD,
413 event=self.event,
414 required=False,
415 )
417 fields = [
418 (f"info_field_{field1.id}", None),
419 (f"info_field_{field2.id}", None),
420 (f"info_field_{field3.id}", None),
421 ]
423 services.update_registration(name="test", event=self.event, field_values=fields)
425 self.assertEqual(field1.get_value_for(registration), 0)
426 self.assertEqual(field2.get_value_for(registration), False)
427 self.assertEqual(field3.get_value_for(registration), "")
429 fields = [
430 (f"info_field_{field1.id}", 2),
431 (f"info_field_{field2.id}", True),
432 (f"info_field_{field3.id}", "text"),
433 ]
435 services.update_registration(name="test", event=self.event, field_values=fields)
437 self.assertEqual(field1.get_value_for(registration), 2)
438 self.assertEqual(field2.get_value_for(registration), True)
439 self.assertEqual(field3.get_value_for(registration), "text")
441 field1.delete()
442 field2.delete()
443 field3.delete()
445 @mock.patch("events.services.event_permissions")
446 def test_registration_fields(self, perms_mock):
447 perms_mock.return_value = {
448 "create_registration": False,
449 "cancel_registration": False,
450 "update_registration": False,
451 }
453 mock_request = HttpRequest()
454 mock_request.member = self.member
456 with self.assertRaises(RegistrationError):
457 services.registration_fields(mock_request, self.member, self.event)
459 registration = EventRegistration.objects.create(
460 event=self.event,
461 member=self.member,
462 )
464 with self.assertRaises(RegistrationError):
465 services.registration_fields(mock_request, self.member, self.event)
466 with self.assertRaises(RegistrationError):
467 services.registration_fields(mock_request, registration=registration)
469 perms_mock.return_value["update_registration"] = True
471 RegistrationInformationField.objects.create(
472 id=1,
473 name="1",
474 type=RegistrationInformationField.INTEGER_FIELD,
475 event=self.event,
476 required=False,
477 )
479 RegistrationInformationField.objects.create(
480 id=2,
481 name="2",
482 type=RegistrationInformationField.BOOLEAN_FIELD,
483 event=self.event,
484 required=True,
485 )
487 RegistrationInformationField.objects.create(
488 id=3,
489 name="3",
490 type=RegistrationInformationField.TEXT_FIELD,
491 event=self.event,
492 required=False,
493 )
494 # set order
495 self.event.set_registrationinformationfield_order([1, 2, 3])
497 fields_list = [
498 services.registration_fields(mock_request, self.member, self.event),
499 services.registration_fields(mock_request, registration=registration),
500 ]
502 for fields in fields_list:
503 self.assertEqual(
504 fields["info_field_1"],
505 {
506 "type": "integer",
507 "label": "1",
508 "description": None,
509 "value": None,
510 "required": False,
511 },
512 )
514 self.assertEqual(
515 fields["info_field_2"],
516 {
517 "type": "boolean",
518 "label": "2",
519 "description": None,
520 "value": None,
521 "required": True,
522 },
523 )
525 self.assertEqual(
526 fields["info_field_3"],
527 {
528 "type": "text",
529 "label": "3",
530 "description": None,
531 "value": None,
532 "required": False,
533 },
534 )
536 self.assertEqual(len(fields), 3)
537 # Test that the ordering is correct
538 labels = [field["label"] for field in fields.values()]
539 self.assertEqual(labels, sorted(labels))