Coverage for website/events/tests/test_api.py: 100.00%

104 statements  

« prev     ^ index     » next       coverage.py v7.6.7, created at 2025-08-14 10:31 +0000

1import datetime 

2 

3from activemembers.models import Committee 

4from django.test import TestCase, override_settings 

5from django.urls import reverse 

6from django.utils import timezone 

7from events.models import Event, EventRegistration 

8from events.models.external_event import ExternalEvent 

9from members.models import Member 

10from rest_framework.test import APIClient 

11 

12 

13@override_settings(SUSPEND_SIGNALS=True) 

14class RegistrationApiTest(TestCase): 

15 """Tests for registration view.""" 

16 

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

18 

19 @classmethod 

20 def setUpTestData(cls): 

21 cls.event = Event.objects.create( 

22 pk=1, 

23 title="testevent", 

24 description="desc", 

25 published=True, 

26 start=(timezone.now() + datetime.timedelta(hours=1)), 

27 end=(timezone.now() + datetime.timedelta(hours=2)), 

28 location="test location", 

29 map_location="test map location", 

30 price=13.37, 

31 fine=5.00, 

32 ) 

33 cls.event.organisers.add(Committee.objects.get(pk=1)) 

34 cls.member = Member.objects.filter(last_name="Wiggers").first() 

35 

36 cls.mark_present_api_url = reverse( 

37 "api:v2:events:mark-present", 

38 kwargs={ 

39 "pk": cls.event.pk, 

40 "token": cls.event.mark_present_url_token, 

41 }, 

42 ) 

43 

44 def setUp(self): 

45 self.client = APIClient() 

46 self.client.force_login(self.member) 

47 

48 def test_mark_present_url_registered(self): 

49 registration = EventRegistration.objects.create( 

50 event=self.event, 

51 member=self.member, 

52 date=timezone.now() - datetime.timedelta(hours=1), 

53 ) 

54 

55 response = self.client.patch(self.mark_present_api_url, follow=True) 

56 self.assertContains(response, "You have been marked as present.") 

57 registration.refresh_from_db() 

58 self.assertTrue(registration.present) 

59 

60 def test_mark_present_url_already_present(self): 

61 registration = EventRegistration.objects.create( 

62 event=self.event, 

63 member=self.member, 

64 date=timezone.now() - datetime.timedelta(hours=1), 

65 present=True, 

66 ) 

67 

68 response = self.client.patch(self.mark_present_api_url, follow=True) 

69 self.assertContains(response, "You were already marked as present.") 

70 registration.refresh_from_db() 

71 self.assertTrue(registration.present) 

72 

73 def test_mark_present_url_not_registered(self): 

74 response = self.client.patch(self.mark_present_api_url, follow=True) 

75 self.assertContains( 

76 response, "You are not registered for this event.", status_code=403 

77 ) 

78 

79 def test_mark_present_url_wrong_token(self): 

80 registration = EventRegistration.objects.create( 

81 event=self.event, 

82 member=self.member, 

83 date=timezone.now() - datetime.timedelta(hours=3), 

84 ) 

85 response = self.client.patch( 

86 reverse( 

87 "api:v2:events:mark-present", 

88 kwargs={ 

89 "pk": self.event.pk, 

90 "token": "11111111-2222-3333-4444-555555555555", 

91 }, 

92 ), 

93 follow=True, 

94 ) 

95 

96 self.assertContains(response, "Invalid url.", status_code=403) 

97 self.assertFalse(registration.present) 

98 

99 def test_mark_present_url_past_event(self): 

100 registration = EventRegistration.objects.create( 

101 event=self.event, 

102 member=self.member, 

103 date=timezone.now() - datetime.timedelta(hours=3), 

104 ) 

105 self.event.start = timezone.now() - datetime.timedelta(hours=2) 

106 self.event.end = timezone.now() - datetime.timedelta(hours=1) 

107 self.event.save() 

108 response = self.client.patch(self.mark_present_api_url, follow=True) 

109 

110 self.assertContains(response, "This event has already ended.", status_code=403) 

111 self.assertFalse(registration.present) 

112 

113 

114@override_settings(SUSPEND_SIGNALS=True) 

115class CalendarjsTest(TestCase): 

116 """Tests for CalendarJS/Fullcalendar view.""" 

117 

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

119 

120 @classmethod 

121 def setUpTestData(cls): 

122 cls.event = Event.objects.create( 

123 pk=1, 

124 title="testevent", 

125 description="desc", 

126 published=True, 

127 start=timezone.make_aware(datetime.datetime(2010, 1, 1, 20, 0, 0)), 

128 end=timezone.make_aware(datetime.datetime(2010, 1, 1, 22, 0, 0)), 

129 location="test location", 

130 map_location="test map location", 

131 price=13.37, 

132 fine=5.00, 

133 ) 

134 cls.unpubEvent = Event.objects.create( 

135 pk=2, 

136 title="secretevent", 

137 description="desc", 

138 published=False, 

139 start=timezone.make_aware(datetime.datetime(2010, 1, 1, 20, 0, 0)), 

140 end=timezone.make_aware(datetime.datetime(2010, 1, 1, 22, 0, 0)), 

141 location="fake location", 

142 map_location="fake map location", 

143 price=6.66, 

144 fine=5.00, 

145 ) 

146 cls.extEvent = ExternalEvent.objects.create( 

147 pk=3, 

148 organiser="Technicie", 

149 title="extevent", 

150 description="desc", 

151 published=True, 

152 start=timezone.make_aware(datetime.datetime(2010, 1, 1, 20, 0, 0)), 

153 end=timezone.make_aware(datetime.datetime(2010, 1, 1, 22, 0, 0)), 

154 location="partner location", 

155 ) 

156 cls.event.organisers.add(Committee.objects.get(pk=1)) 

157 cls.member = Member.objects.filter(last_name="Wiggers").first() 

158 

159 def setUp(self): 

160 self.client = APIClient() 

161 self.client.force_login(self.member) 

162 

163 def test_event_list(self): 

164 response = self.client.get( 

165 "/api/calendarjs/events/?start=2010-01-01T00%3A00%3A00%2B01%3A00&end=2011-01-01T00%3A00%3A00%2B01%3A00", 

166 format="json", 

167 ) 

168 self.assertEqual(response.status_code, 200) 

169 self.assertEqual(len(response.data), 1) 

170 self.assertEqual(response.data[0]["title"], "testevent") 

171 

172 def test_unpub_event_list(self): 

173 response = self.client.get( 

174 "/api/calendarjs/events/unpublished/?start=2010-01-01T00%3A00%3A00%2B01%3A00&end=2011-01-01T00%3A00%3A00%2B01%3A00", 

175 format="json", 

176 ) 

177 self.assertEqual(response.status_code, 200) 

178 self.assertEqual(len(response.data), 1) 

179 self.assertEqual(response.data[0]["title"], "secretevent") 

180 

181 def test_external_event_list(self): 

182 response = self.client.get( 

183 "/api/calendarjs/external/?start=2010-01-01T00%3A00%3A00%2B01%3A00&end=2011-01-01T00%3A00%3A00%2B01%3A00", 

184 format="json", 

185 ) 

186 self.assertEqual(response.status_code, 200) 

187 self.assertEqual(len(response.data), 1) 

188 self.assertEqual(response.data[0]["title"], "extevent (Technicie)") 

189 

190 

191@override_settings(SUSPEND_SIGNALS=True) 

192class EventApiV2Test(TestCase): 

193 """Tests for registration view.""" 

194 

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

196 

197 @classmethod 

198 def setUpTestData(cls): 

199 cls.event = Event.objects.create( 

200 pk=1, 

201 title="testevent", 

202 description="desc", 

203 published=True, 

204 start=(timezone.now() + datetime.timedelta(hours=1)), 

205 end=(timezone.now() + datetime.timedelta(hours=2)), 

206 location="test location", 

207 map_location="test map location", 

208 price=13.37, 

209 fine=5.00, 

210 ) 

211 cls.event.organisers.add(Committee.objects.get(pk=1)) 

212 cls.member = Member.objects.filter(last_name="Wiggers").first() 

213 

214 cls.mark_present_api_url = reverse( 

215 "api:v2:events:mark-present", 

216 kwargs={ 

217 "pk": cls.event.pk, 

218 "token": cls.event.mark_present_url_token, 

219 }, 

220 ) 

221 

222 def setUp(self): 

223 self.client = APIClient() 

224 self.client.force_login(self.member) 

225 

226 def test_event_list(self): 

227 response = self.client.get("/api/v2/events/", format="json") 

228 self.assertEqual(response.data["count"], 1) 

229 self.assertEqual(response.data["results"][0]["title"], "testevent") 

230 

231 def test_event_detail(self): 

232 response = self.client.get("/api/v2/events/1/", format="json") 

233 self.assertEqual(response.data["title"], "testevent") 

234 

235 def test_event_detail_not_found(self): 

236 response = self.client.get("/api/v2/events/2/", format="json") 

237 self.assertEqual(response.status_code, 404) 

238 

239 def test_event_detail_unpublished(self): 

240 self.event.published = False 

241 self.event.save() 

242 response = self.client.get("/api/v2/events/1/", format="json") 

243 self.assertEqual(response.status_code, 404)