Coverage for website/events/tests/test_admin.py: 100.00%
137 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
2from unittest import mock
4from django.contrib.admin import AdminSite
5from django.core.exceptions import DisallowedRedirect
6from django.http import HttpResponseRedirect
7from django.test import RequestFactory, TestCase, override_settings
8from django.utils import timezone
10from freezegun import freeze_time
12from activemembers.models import Committee, MemberGroupMembership
13from events.admin import EventAdmin, RegistrationInformationFieldInline
14from events.models import Event, EventRegistration, RegistrationInformationField
15from members.models import Member
16from utils.admin import DoNextModelAdmin
19class DoNextModelAdminTest(TestCase):
20 def setUp(self):
21 self.site = AdminSite()
22 self.admin = DoNextModelAdmin(Event, admin_site=self.site)
23 self.rf = RequestFactory()
25 @mock.patch("django.contrib.admin.ModelAdmin.response_add")
26 def test_response_add(self, super_mock):
27 super_mock.return_value = None
29 request = self.rf.get("/admin/events/event/1")
30 response = self.admin.response_add(request, None)
31 self.assertIsNone(response, "Should return the original response")
33 request = self.rf.post(
34 "/admin/events/event/1?next=http://example.org", data={"_save": True}
35 )
36 with self.assertRaises(DisallowedRedirect):
37 self.admin.response_add(request, None)
39 request = self.rf.post("/admin/events/event/1?next=/test", data={"_save": True})
40 response = self.admin.response_add(request, None)
41 self.assertIsInstance(response, HttpResponseRedirect)
42 self.assertEqual(
43 "/test", response.url, "Should return the url in the next parameter."
44 )
46 request = self.rf.post("/admin/events/event/1?next=/test")
47 response = self.admin.response_add(request, None)
48 self.assertNotIsInstance(response, HttpResponseRedirect, "Should not redirect")
50 @mock.patch("django.contrib.admin.ModelAdmin.response_change")
51 def test_response_change(self, super_mock):
52 super_mock.return_value = None
54 request = self.rf.get("/admin/events/event/1")
55 response = self.admin.response_change(request, None)
56 self.assertIsNone(response, "Should return the original response")
58 request = self.rf.post(
59 "/admin/events/event/1?next=http://example.org", data={"_save": True}
60 )
61 with self.assertRaises(DisallowedRedirect):
62 self.admin.response_change(request, None)
64 request = self.rf.post("/admin/events/event/1?next=/test", data={"_save": True})
65 response = self.admin.response_change(request, None)
66 self.assertIsInstance(response, HttpResponseRedirect)
67 self.assertEqual(
68 "/test", response.url, "Should return the url in the next parameter."
69 )
71 request = self.rf.post("/admin/events/event/1?next=/test")
72 response = self.admin.response_change(request, None)
73 self.assertNotIsInstance(response, HttpResponseRedirect, "Should not redirect")
76@freeze_time("2017-01-01")
77@override_settings(SUSPEND_SIGNALS=True)
78class RegistrationInformationFieldInlineTest(TestCase):
79 fixtures = ["members.json", "member_groups.json"]
81 @classmethod
82 def setUpTestData(cls):
83 cls.committee = Committee.objects.get(pk=1)
84 cls.event = Event.objects.create(
85 pk=1,
86 title="testevent",
87 description="desc",
88 published=True,
89 start=(timezone.now() + datetime.timedelta(hours=1)),
90 end=(timezone.now() + datetime.timedelta(hours=2)),
91 location="test location",
92 map_location="test map location",
93 price=0.00,
94 fine=0.00,
95 )
96 cls.event.organisers.add(cls.committee)
97 cls.member = Member.objects.filter(last_name="Wiggers").first()
98 cls.member.is_superuser = True
99 cls.member.save()
100 MemberGroupMembership.objects.create(member=cls.member, group=cls.committee)
102 RegistrationInformationField.objects.create(
103 pk=1,
104 event=cls.event,
105 type=RegistrationInformationField.BOOLEAN_FIELD,
106 name="test bool",
107 required=False,
108 )
110 RegistrationInformationField.objects.create(
111 pk=2,
112 event=cls.event,
113 type=RegistrationInformationField.INTEGER_FIELD,
114 name="test int",
115 required=False,
116 )
118 RegistrationInformationField.objects.create(
119 pk=3,
120 event=cls.event,
121 type=RegistrationInformationField.TEXT_FIELD,
122 name="test text",
123 required=False,
124 )
126 def setUp(self):
127 self.site = AdminSite()
128 self.inline = RegistrationInformationFieldInline(Event, self.site)
129 self.rf = RequestFactory()
131 def test_get_formset(self):
132 request = self.rf.get("/admin/events/event/1/change/")
133 request.user = self.member
135 formset = self.inline.get_formset(request, None)
136 self.assertEqual(0, formset.form.declared_fields["order"].initial)
138 formset = self.inline.get_formset(request, self.event)
139 self.assertEqual(3, formset.form.declared_fields["order"].initial)
142@freeze_time("2017-01-01")
143@override_settings(SUSPEND_SIGNALS=True)
144class EventAdminTest(TestCase):
145 fixtures = ["members.json", "member_groups.json"]
147 @classmethod
148 def setUpTestData(cls):
149 cls.committee = Committee.objects.get(pk=1)
150 cls.event = Event.objects.create(
151 pk=1,
152 title="testevent",
153 description="desc",
154 published=True,
155 start=(timezone.now() + datetime.timedelta(hours=1)),
156 end=(timezone.now() + datetime.timedelta(hours=2)),
157 location="test location",
158 map_location="test map location",
159 price=0.00,
160 fine=0.00,
161 )
162 cls.event.organisers.add(cls.committee)
163 cls.member = Member.objects.filter(last_name="Wiggers").first()
165 def setUp(self):
166 self.admin_site = AdminSite()
167 self.admin = EventAdmin(Event, self.admin_site)
168 self.rf = RequestFactory()
170 def test_overview_link(self):
171 """The overview link goes to the correct event and contains the name."""
172 self.assertEqual(
173 self.admin.overview_link(self.event),
174 '<a href="/admin/events/event/1/details/">testevent</a>',
175 )
177 @mock.patch("utils.admin.DoNextModelAdmin.has_change_permission")
178 @mock.patch("events.services.is_organiser")
179 def test_has_change_permission(self, organiser_mock, permission_mock):
180 permission_mock.return_value = None
181 organiser_mock.return_value = True
183 request = self.rf.get("/admin/events/event/1/change/")
184 request.member = self.member
186 res = self.admin.has_change_permission(request, None)
187 self.assertEqual(res, None)
189 res = self.admin.has_change_permission(request, self.event)
190 self.assertEqual(res, None)
192 organiser_mock.return_value = False
194 res = self.admin.has_change_permission(request, self.event)
195 self.assertEqual(res, False)
197 @override_settings(LANGUAGE_CODE="en")
198 def test_event_date(self):
199 self.assertEqual(self.admin.event_date(self.event), "Sunday 01 jan 2017, 2:00")
201 @override_settings(LANGUAGE_CODE="en")
202 def test_registration_date(self):
203 self.assertEqual(self.admin.registration_date(self.event), "")
204 self.event.registration_start = timezone.now()
205 self.assertEqual(
206 self.admin.registration_date(self.event), "Sunday 01 jan 2017, 1:00"
207 )
209 @override_settings(LANGUAGE_CODE="en")
210 def test_edit_link(self):
211 self.assertEqual(self.admin.edit_link(None), "Edit")
213 @override_settings(LANGUAGE_CODE="en")
214 def test_num_participants(self):
215 request = self.rf.get("/admin/events/event/")
216 request.user = self.member
217 qs = self.admin.get_queryset(request)
218 event = qs.get(id=self.event.id)
220 self.assertEqual(self.admin.num_participants(event), "0/∞")
221 event.max_participants = 2
222 self.assertEqual(self.admin.num_participants(event), "0/2")
224 self.event.max_participants = None
226 EventRegistration.objects.create(
227 event=self.event,
228 name="test_cancelled",
229 date=timezone.now() - timezone.timedelta(days=1),
230 date_cancelled=timezone.now() - timezone.timedelta(seconds=10),
231 )
232 EventRegistration.objects.create(event=self.event, name="test")
234 request = self.rf.get("/admin/events/event/")
235 request.user = self.member
236 qs = self.admin.get_queryset(request)
237 event = qs.get(id=self.event.id)
239 self.assertEqual(self.admin.num_participants(event), "1/∞")
240 event.max_participants = 2
241 self.assertEqual(self.admin.num_participants(event), "1/2")