Coverage for website/events/tests/test_models.py: 99.53%
214 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
1import datetime
3from django.core.exceptions import ValidationError
4from django.test import TestCase, override_settings
5from django.utils import timezone
7from activemembers.models import Committee
8from events.models import Event, EventRegistration
9from mailinglists.models import MailingList
10from members.models import Member
13@override_settings(SUSPEND_SIGNALS=True)
14class EventTest(TestCase):
15 """Tests events."""
17 fixtures = ["members.json"]
19 @classmethod
20 def setUpTestData(cls):
21 cls.mailinglist = MailingList.objects.create(name="testmail")
23 cls.committee = Committee.objects.create(
24 name="committee",
25 contact_mailinglist=cls.mailinglist,
26 )
28 cls.event = Event.objects.create(
29 title="testevent",
30 description="desc",
31 start=(timezone.now() + datetime.timedelta(hours=1)),
32 end=(timezone.now() + datetime.timedelta(hours=2)),
33 location="test location",
34 map_location="test map location",
35 price=0.00,
36 fine=5.00,
37 optional_registrations=False,
38 )
39 cls.event.organisers.add(cls.committee)
40 cls.member = Member.objects.first()
42 def setUp(self):
43 self.mailinglist.refresh_from_db()
44 self.committee.refresh_from_db()
45 self.event.refresh_from_db()
46 self.member.refresh_from_db()
48 def test_clean_works(self):
49 self.event.clean()
51 def test_end_after_start(self):
52 self.event.start, self.event.end = self.event.end, self.event.start
53 with self.assertRaises(ValidationError):
54 self.event.clean()
56 def test_missing_registration_start(self):
57 self.event.cancel_deadline = timezone.now()
58 self.event.registration_end = timezone.now() + datetime.timedelta(hours=1)
59 with self.assertRaises(ValidationError):
60 self.event.clean()
62 self.event.registration_start = timezone.now()
63 self.event.clean()
65 def test_missing_registration_end(self):
66 self.event.cancel_deadline = timezone.now()
67 self.event.registration_start = timezone.now()
68 with self.assertRaises(ValidationError):
69 self.event.clean()
71 self.event.registration_end = timezone.now() + datetime.timedelta(hours=1)
72 self.event.clean()
74 def test_missing_cancel_deadline(self):
75 self.event.registration_start = timezone.now()
76 self.event.registration_end = timezone.now() + datetime.timedelta(hours=1)
77 with self.assertRaises(ValidationError):
78 self.event.clean()
80 self.event.cancel_deadline = timezone.now()
81 self.event.clean()
83 def test_unnecessary_no_registration_message(self):
84 self.event.registration_start = timezone.now()
85 self.event.registration_end = timezone.now() + datetime.timedelta(hours=1)
86 self.event.cancel_deadline = timezone.now()
87 self.event.no_registration_message = "Not registered"
88 with self.assertRaises(ValidationError):
89 self.event.clean()
91 self.event.no_registration_message = ""
92 self.event.clean()
94 def test_registration_end_after_registration_start(self):
95 self.event.registration_start = timezone.now() + datetime.timedelta(hours=1)
96 self.event.registration_end = timezone.now()
97 self.event.cancel_deadline = timezone.now()
98 with self.assertRaises(ValidationError):
99 self.event.clean()
101 self.event.registration_start, self.event.registration_end = (
102 self.event.registration_end,
103 self.event.registration_start,
104 )
105 self.event.clean()
107 def test_cancel_deadline_before_registration_start(self):
108 self.event.registration_start = timezone.now()
109 self.event.registration_end = timezone.now() + datetime.timedelta(hours=1)
110 self.event.cancel_deadline = self.event.start + datetime.timedelta(hours=1)
111 with self.assertRaises(ValidationError):
112 self.event.clean()
114 self.event.cancel_deadline = self.event.start
115 self.event.clean()
117 def test_reached_participants_limit(self):
118 self.event.max_participants = 1
119 self.assertFalse(self.event.reached_participants_limit())
121 def test_not_reached_participants_limit(self):
122 self.event.max_participants = 1
123 EventRegistration.objects.create(event=self.event, member=self.member)
124 self.assertTrue(self.event.reached_participants_limit())
126 def test_registration_fine_required(self):
127 self.event.registration_start = timezone.now() - datetime.timedelta(hours=1)
128 self.event.registration_end = timezone.now() + datetime.timedelta(hours=1)
129 self.event.cancel_deadline = timezone.now() - datetime.timedelta(hours=1)
130 self.event.clean()
131 self.event.fine = 0
133 with self.assertRaises(ValidationError):
134 self.event.clean()
136 def test_registration_allowed(self):
137 # Open
138 self.event.registration_start = timezone.now() - datetime.timedelta(hours=1)
139 self.event.registration_end = timezone.now() + datetime.timedelta(hours=1)
140 self.event.cancel_deadline = timezone.now() + datetime.timedelta(hours=1)
141 self.assertTrue(self.event.registration_allowed)
143 # No cancel
144 self.event.registration_start = timezone.now() - datetime.timedelta(hours=2)
145 self.event.registration_end = timezone.now() + datetime.timedelta(hours=1)
146 self.event.cancel_deadline = timezone.now() - datetime.timedelta(hours=1)
147 self.assertTrue(self.event.registration_allowed)
149 # Not yet open
150 self.event.registration_start = timezone.now() + datetime.timedelta(hours=1)
151 self.event.registration_end = timezone.now() + datetime.timedelta(hours=2)
152 self.event.cancel_deadline = timezone.now() + datetime.timedelta(hours=1)
153 self.assertFalse(self.event.registration_allowed)
155 # Cancel only
156 self.event.registration_start = timezone.now() - datetime.timedelta(hours=2)
157 self.event.registration_end = timezone.now() - datetime.timedelta(hours=1)
158 self.event.cancel_deadline = timezone.now() + datetime.timedelta(hours=1)
159 self.assertFalse(self.event.registration_allowed)
161 # Registration is closed
162 self.event.registration_start = timezone.now() - datetime.timedelta(hours=2)
163 self.event.registration_end = timezone.now() - datetime.timedelta(hours=1)
164 self.event.cancel_deadline = timezone.now() - datetime.timedelta(hours=1)
165 self.assertFalse(self.event.registration_allowed)
167 # Registration not needed
168 self.event.registration_start = None
169 self.event.registration_end = None
170 self.event.cancel_deadline = None
171 self.assertFalse(self.event.registration_allowed)
173 def test_cancellation_allowed(self):
174 with self.subTest("Open"):
175 self.event.registration_start = timezone.now() - datetime.timedelta(hours=1)
176 self.event.registration_end = timezone.now() + datetime.timedelta(hours=1)
177 self.event.cancel_deadline = timezone.now() + datetime.timedelta(hours=1)
178 self.assertTrue(self.event.cancellation_allowed)
180 with self.subTest("No cancel"):
181 self.event.registration_start = timezone.now() - datetime.timedelta(hours=2)
182 self.event.registration_end = timezone.now() + datetime.timedelta(hours=1)
183 self.event.cancel_deadline = timezone.now() - datetime.timedelta(hours=1)
184 # Allow since cancellation after deadline is possible
185 self.assertTrue(self.event.cancellation_allowed)
187 with self.subTest("Not yet open (now < registration start)"):
188 self.event.registration_start = timezone.now() + datetime.timedelta(hours=1)
189 self.event.registration_end = timezone.now() + datetime.timedelta(hours=2)
190 self.event.cancel_deadline = timezone.now() + datetime.timedelta(hours=1)
191 self.assertFalse(self.event.cancellation_allowed)
193 with self.subTest("Cancel only"):
194 self.event.registration_start = timezone.now() - datetime.timedelta(hours=2)
195 self.event.registration_end = timezone.now() - datetime.timedelta(hours=1)
196 self.event.cancel_deadline = timezone.now() + datetime.timedelta(hours=1)
197 self.assertTrue(self.event.cancellation_allowed)
199 with self.subTest("Registration is closed"):
200 self.event.registration_start = timezone.now() - datetime.timedelta(hours=2)
201 self.event.registration_end = timezone.now() - datetime.timedelta(hours=1)
202 self.event.cancel_deadline = timezone.now() - datetime.timedelta(hours=1)
203 # Allow since cancellation after deadline is possible
204 self.assertTrue(self.event.cancellation_allowed)
206 with self.subTest("After event start"):
207 self.event.registration_start = timezone.now() - datetime.timedelta(hours=4)
208 self.event.registration_end = timezone.now() - datetime.timedelta(hours=3)
209 self.event.cancel_deadline = timezone.now() - datetime.timedelta(hours=3)
210 self.event.start = timezone.now()
211 self.event.end = timezone.now() + datetime.timedelta(hours=2)
212 self.assertFalse(self.event.cancellation_allowed)
214 with self.subTest("Registration not required"):
215 self.event.registration_start = None
216 self.event.registration_end = None
217 self.event.cancel_deadline = None
218 self.assertFalse(self.event.cancellation_allowed)
221@override_settings(SUSPEND_SIGNALS=True)
222class RegistrationTest(TestCase):
223 """Tests event registrations."""
225 fixtures = ["members.json", "member_groups.json"]
227 @classmethod
228 def setUpTestData(cls):
229 cls.event = Event.objects.create(
230 title="testevent",
231 description="desc",
232 start=timezone.now(),
233 end=(timezone.now() + datetime.timedelta(hours=1)),
234 location="test location",
235 map_location="test map location",
236 price=0.00,
237 fine=0.00,
238 )
239 cls.event.organisers.add(Committee.objects.get(pk=1))
240 cls.member1 = Member.objects.first()
241 cls.member2 = Member.objects.all()[1]
242 cls.member3 = Member.objects.all()[2]
243 cls.r1 = EventRegistration.objects.create(event=cls.event, member=cls.member1)
244 cls.r2 = EventRegistration.objects.create(event=cls.event, member=cls.member2)
245 cls.r3 = EventRegistration.objects.create(event=cls.event, member=cls.member3)
247 def setUp(self):
248 self.r1.refresh_from_db()
250 def test_is_late_registration(self):
251 self.assertFalse(self.r1.is_late_cancellation())
253 self.r1.date_cancelled = timezone.now()
254 self.assertFalse(self.r1.is_late_cancellation())
256 self.r1.event.cancel_deadline = timezone.now() + datetime.timedelta(hours=1)
257 self.assertFalse(self.r1.is_late_cancellation())
259 self.r1.event.cancel_deadline = timezone.now() - datetime.timedelta(hours=1)
260 self.assertTrue(self.r1.is_late_cancellation())
262 def test_queue_position(self):
263 self.assertEqual(self.r1.queue_position, None)
264 self.assertEqual(self.r2.queue_position, None)
266 self.r1.event.max_participants = 0
267 self.r1.event.save()
268 self.r2.event = self.r1.event
269 self.assertEqual(self.r1.queue_position, 1)
270 self.assertEqual(self.r2.queue_position, 2)
272 self.r1.event.max_participants = 1
273 self.r1.event.save()
274 self.r2.event = self.r1.event
275 self.assertEqual(self.r1.queue_position, None)
276 self.assertEqual(self.r2.queue_position, 1)
278 def test_queue_cancel(self):
279 self.r1.event.max_participants = 0
280 self.r1.event.save()
282 self.r2.date_cancelled = timezone.now()
283 self.r2.save()
285 self.assertEqual(self.r1.queue_position, 1)
286 self.assertEqual(self.r2.queue_position, None)
287 self.assertEqual(self.r3.queue_position, 2)
289 def test_registration_either_name_or_member(self):
290 self.r2.delete()
291 self.r1.clean()
292 r2 = EventRegistration.objects.create(event=self.event, name="test name")
293 r2.clean()
294 with self.assertRaises(ValidationError):
295 r3 = EventRegistration.objects.create(
296 event=self.event, name="test name", member=self.member2
297 )
298 r3.clean()
300 def test_would_cancel_after_deadline(self):
301 self.r1.event.registration_start = timezone.now() - datetime.timedelta(hours=1)
302 self.r1.event.registration_end = timezone.now() - datetime.timedelta(hours=1)
303 self.r1.event.cancel_deadline = timezone.now() - datetime.timedelta(hours=1)
305 # Test situation where the event status is REGISTRATION_CLOSED
306 self.assertFalse(self.r1.event.registration_allowed)
307 self.assertTrue(self.r1.would_cancel_after_deadline())
309 self.r1.event.registration_end = timezone.now() + datetime.timedelta(hours=2)
311 # Test situation where the event status is REGISTRATION_OPEN_NO_CANCEL
312 self.assertTrue(self.r1.event.registration_allowed)
313 self.assertTrue(self.r1.would_cancel_after_deadline())