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

1import datetime 

2from unittest import mock 

3 

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 

9 

10from freezegun import freeze_time 

11 

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 

17 

18 

19class DoNextModelAdminTest(TestCase): 

20 def setUp(self): 

21 self.site = AdminSite() 

22 self.admin = DoNextModelAdmin(Event, admin_site=self.site) 

23 self.rf = RequestFactory() 

24 

25 @mock.patch("django.contrib.admin.ModelAdmin.response_add") 

26 def test_response_add(self, super_mock): 

27 super_mock.return_value = None 

28 

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") 

32 

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) 

38 

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 ) 

45 

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") 

49 

50 @mock.patch("django.contrib.admin.ModelAdmin.response_change") 

51 def test_response_change(self, super_mock): 

52 super_mock.return_value = None 

53 

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") 

57 

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) 

63 

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 ) 

70 

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") 

74 

75 

76@freeze_time("2017-01-01") 

77@override_settings(SUSPEND_SIGNALS=True) 

78class RegistrationInformationFieldInlineTest(TestCase): 

79 fixtures = ["members.json", "member_groups.json"] 

80 

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) 

101 

102 RegistrationInformationField.objects.create( 

103 pk=1, 

104 event=cls.event, 

105 type=RegistrationInformationField.BOOLEAN_FIELD, 

106 name="test bool", 

107 required=False, 

108 ) 

109 

110 RegistrationInformationField.objects.create( 

111 pk=2, 

112 event=cls.event, 

113 type=RegistrationInformationField.INTEGER_FIELD, 

114 name="test int", 

115 required=False, 

116 ) 

117 

118 RegistrationInformationField.objects.create( 

119 pk=3, 

120 event=cls.event, 

121 type=RegistrationInformationField.TEXT_FIELD, 

122 name="test text", 

123 required=False, 

124 ) 

125 

126 def setUp(self): 

127 self.site = AdminSite() 

128 self.inline = RegistrationInformationFieldInline(Event, self.site) 

129 self.rf = RequestFactory() 

130 

131 def test_get_formset(self): 

132 request = self.rf.get("/admin/events/event/1/change/") 

133 request.user = self.member 

134 

135 formset = self.inline.get_formset(request, None) 

136 self.assertEqual(0, formset.form.declared_fields["order"].initial) 

137 

138 formset = self.inline.get_formset(request, self.event) 

139 self.assertEqual(3, formset.form.declared_fields["order"].initial) 

140 

141 

142@freeze_time("2017-01-01") 

143@override_settings(SUSPEND_SIGNALS=True) 

144class EventAdminTest(TestCase): 

145 fixtures = ["members.json", "member_groups.json"] 

146 

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() 

164 

165 def setUp(self): 

166 self.admin_site = AdminSite() 

167 self.admin = EventAdmin(Event, self.admin_site) 

168 self.rf = RequestFactory() 

169 

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 ) 

176 

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 

182 

183 request = self.rf.get("/admin/events/event/1/change/") 

184 request.member = self.member 

185 

186 res = self.admin.has_change_permission(request, None) 

187 self.assertEqual(res, None) 

188 

189 res = self.admin.has_change_permission(request, self.event) 

190 self.assertEqual(res, None) 

191 

192 organiser_mock.return_value = False 

193 

194 res = self.admin.has_change_permission(request, self.event) 

195 self.assertEqual(res, False) 

196 

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") 

200 

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 ) 

208 

209 @override_settings(LANGUAGE_CODE="en") 

210 def test_edit_link(self): 

211 self.assertEqual(self.admin.edit_link(None), "Edit") 

212 

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) 

219 

220 self.assertEqual(self.admin.num_participants(event), "0/∞") 

221 event.max_participants = 2 

222 self.assertEqual(self.admin.num_participants(event), "0/2") 

223 

224 self.event.max_participants = None 

225 

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") 

233 

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) 

238 

239 self.assertEqual(self.admin.num_participants(event), "1/∞") 

240 event.max_participants = 2 

241 self.assertEqual(self.admin.num_participants(event), "1/2")