Coverage for website/members/tests/test_emails.py: 100.00%

100 statements  

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

1from django.core import mail 

2from django.test import TestCase, override_settings 

3from django.utils import timezone 

4 

5from freezegun import freeze_time 

6 

7from members import emails 

8from members.models import Member, Membership, Profile 

9 

10 

11@override_settings(SUSPEND_SIGNALS=True) 

12class EmailsTest(TestCase): 

13 @classmethod 

14 def setUpTestData(cls): 

15 cls.member_no_mail = Member.objects.create( 

16 username="no_mail_test", first_name="Nomail", last_name="Example" 

17 ) 

18 Profile.objects.create( 

19 user=cls.member_no_mail, 

20 ) 

21 Membership.objects.create( 

22 user=cls.member_no_mail, 

23 type=Membership.MEMBER, 

24 since=timezone.now().replace(year=2017, month=9, day=1), 

25 until=timezone.now().replace(year=2018, month=9, day=1), 

26 ) 

27 cls.year_member_nl = Member.objects.create( 

28 username="test1", 

29 first_name="Test1", 

30 last_name="Example", 

31 email="test1@example.org", 

32 ) 

33 Profile.objects.create(user=cls.year_member_nl) 

34 Membership.objects.create( 

35 user=cls.year_member_nl, 

36 type=Membership.MEMBER, 

37 since=timezone.now().replace(year=2017, month=9, day=1), 

38 until=timezone.now().replace(year=2018, month=9, day=1), 

39 ) 

40 cls.year_member_en = Member.objects.create( 

41 username="test2", 

42 first_name="Test2", 

43 last_name="Example", 

44 email="test2@example.org", 

45 ) 

46 Profile.objects.create(user=cls.year_member_en) 

47 Membership.objects.create( 

48 user=cls.year_member_en, 

49 type=Membership.MEMBER, 

50 since=timezone.now().replace(year=2017, month=9, day=1), 

51 until=timezone.now().replace(year=2018, month=9, day=1), 

52 ) 

53 cls.year_member_no_expiry = Member.objects.create( 

54 username="test3", 

55 first_name="Test3", 

56 last_name="Example", 

57 email="test3@example.org", 

58 ) 

59 Profile.objects.create( 

60 user=cls.year_member_no_expiry, 

61 ) 

62 Membership.objects.create( 

63 user=cls.year_member_no_expiry, 

64 type=Membership.MEMBER, 

65 since=timezone.now().replace(year=2017, month=9, day=1), 

66 until=timezone.now().replace(year=2019, month=9, day=1), 

67 ) 

68 cls.study_member = Member.objects.create( 

69 username="test4", 

70 first_name="Test4", 

71 last_name="Example", 

72 email="test4@example.org", 

73 ) 

74 Profile.objects.create( 

75 user=cls.study_member, 

76 ) 

77 Membership.objects.create( 

78 user=cls.study_member, 

79 type=Membership.MEMBER, 

80 since=timezone.now().replace(year=2017, month=9, day=1), 

81 until=None, 

82 ) 

83 cls.study_member_2 = Member.objects.create( 

84 username="test5", 

85 first_name="Test5", 

86 last_name="Example", 

87 email="test5@example.org", 

88 ) 

89 Profile.objects.create( 

90 user=cls.study_member_2, 

91 ) 

92 Membership.objects.create( 

93 user=cls.study_member_2, 

94 type=Membership.MEMBER, 

95 since=timezone.now().replace(year=2016, month=9, day=1), 

96 until=timezone.now().replace(year=2017, month=9, day=1), 

97 ) 

98 Membership.objects.create( 

99 user=cls.study_member_2, 

100 type=Membership.MEMBER, 

101 since=timezone.now().replace(year=2017, month=9, day=6), 

102 until=None, 

103 ) 

104 cls.benefactor = Member.objects.create( 

105 username="test6", 

106 first_name="Test6", 

107 last_name="Example", 

108 email="test6@example.org", 

109 ) 

110 Membership.objects.create( 

111 user=cls.benefactor, 

112 type=Membership.BENEFACTOR, 

113 since=timezone.now().replace(year=2017, month=9, day=1), 

114 until=timezone.now().replace(year=2018, month=9, day=1), 

115 ) 

116 Profile.objects.create( 

117 user=cls.benefactor, 

118 ) 

119 cls.honorary_member = Member.objects.create( 

120 username="test7", 

121 first_name="Test7", 

122 last_name="Example", 

123 email="test7@example.org", 

124 ) 

125 Profile.objects.create( 

126 user=cls.honorary_member, 

127 ) 

128 Membership.objects.create( 

129 user=cls.honorary_member, 

130 type=Membership.HONORARY, 

131 since=timezone.now().replace(year=2016, month=12, day=6), 

132 until=timezone.now().replace(year=2017, month=6, day=12), 

133 ) 

134 Membership.objects.create( 

135 user=cls.honorary_member, 

136 type=Membership.HONORARY, 

137 since=timezone.now().replace(year=2017, month=6, day=12), 

138 until=None, 

139 ) 

140 cls.old_member = Member.objects.create( 

141 username="test8", 

142 first_name="Test8", 

143 last_name="Example", 

144 email="test8@example.org", 

145 ) 

146 Profile.objects.create( 

147 user=cls.old_member, 

148 ) 

149 Membership.objects.create( 

150 user=cls.old_member, 

151 type=Membership.MEMBER, 

152 since=timezone.now().replace(year=2016, month=12, day=6), 

153 until=timezone.now().replace(year=2017, month=6, day=12), 

154 ) 

155 cls.future_member = Member.objects.create( 

156 username="test9", 

157 first_name="Test9", 

158 last_name="Example", 

159 email="test9@example.org", 

160 ) 

161 Profile.objects.create( 

162 user=cls.future_member, 

163 ) 

164 Membership.objects.create( 

165 user=cls.future_member, 

166 type=Membership.MEMBER, 

167 since=timezone.now().replace(year=2018, month=9, day=1), 

168 until=None, 

169 ) 

170 

171 # Member with expiring study-long membership in the next 31 days 

172 cls.study_long_expiring = Member.objects.create( 

173 username="test10", 

174 first_name="Test10", 

175 last_name="Example", 

176 email="test10@example.org", 

177 ) 

178 Profile.objects.create( 

179 user=cls.study_long_expiring, 

180 ) 

181 Membership.objects.create( 

182 user=cls.study_long_expiring, 

183 type=Membership.MEMBER, 

184 since=timezone.now().replace(year=2017, month=9, day=1), 

185 until=timezone.now().replace(year=2018, month=8, day=25), 

186 study_long=True, 

187 ) 

188 # Member with expired study-long membership in +-60 days 

189 cls.study_long_expired = Member.objects.create( 

190 username="test11", 

191 first_name="Test11", 

192 last_name="Example", 

193 email="test11@example.org", 

194 ) 

195 Profile.objects.create( 

196 user=cls.study_long_expired, 

197 ) 

198 Membership.objects.create( 

199 user=cls.study_long_expired, 

200 type=Membership.MEMBER, 

201 since=timezone.now().replace(year=2017, month=9, day=1), 

202 until=timezone.now().replace(year=2018, month=10, day=15), 

203 study_long=True, 

204 ) 

205 # Member with expiring study-long membership with future membership 

206 cls.study_long_expiring_with_future = Member.objects.create( 

207 username="test12", 

208 first_name="Test12", 

209 last_name="Example", 

210 email="test12@example.org", 

211 ) 

212 Profile.objects.create( 

213 user=cls.study_long_expiring_with_future, 

214 ) 

215 Membership.objects.create( 

216 user=cls.study_long_expiring_with_future, 

217 type=Membership.MEMBER, 

218 since=timezone.now().replace(year=2017, month=9, day=1), 

219 until=timezone.now().replace(year=2018, month=8, day=25), 

220 study_long=True, 

221 ) 

222 # Future membership for study_long_expiring_with_future 

223 Membership.objects.create( 

224 user=cls.study_long_expiring_with_future, 

225 type=Membership.BENEFACTOR, 

226 since=timezone.now().replace(year=2018, month=9, day=1), 

227 until=timezone.now().replace(year=2019, month=9, day=1), 

228 ) 

229 

230 @freeze_time("2017-10-01") 

231 def test_send_information_request(self): 

232 emails.send_information_request() 

233 

234 self.assertEqual(len(mail.outbox), 12) 

235 mails = list(sorted(mail.outbox, key=lambda x: x.to[0])) 

236 self.assertEqual(mails[1].to, ["test10@example.org"]) 

237 self.assertEqual(mails[2].to, ["test11@example.org"]) 

238 self.assertEqual(mails[3].to, ["test12@example.org"]) 

239 self.assertEqual(mails[4].to, ["test1@example.org"]) 

240 self.assertEqual(mails[4].subject, "[THALIA] Membership information check") 

241 self.assertEqual(mails[5].to, ["test2@example.org"]) 

242 self.assertEqual(mails[5].subject, "[THALIA] Membership information check") 

243 self.assertEqual(mails[6].to, ["test3@example.org"]) 

244 self.assertEqual(mails[7].to, ["test4@example.org"]) 

245 self.assertEqual(mails[8].to, ["test5@example.org"]) 

246 self.assertEqual(mails[9].to, ["test6@example.org"]) 

247 self.assertEqual(mails[10].to, ["test7@example.org"]) 

248 self.assertEqual(mails[11].to, ["test9@example.org"]) 

249 

250 self.assertEqual(mails[0].subject, "[THALIA] Membership information check sent") 

251 

252 @freeze_time("2018-08-15") 

253 def test_send_expiration_announcement(self): 

254 emails.send_expiration_announcement() 

255 

256 print(mail.outbox) 

257 self.assertEqual(len(mail.outbox), 4) 

258 self.assertEqual(mail.outbox[0].to, ["test1@example.org"]) 

259 self.assertEqual( 

260 mail.outbox[0].subject, "[THALIA] Membership expiration announcement" 

261 ) 

262 self.assertEqual(mail.outbox[1].to, ["test2@example.org"]) 

263 self.assertEqual( 

264 mail.outbox[1].subject, "[THALIA] Membership expiration announcement" 

265 ) 

266 self.assertEqual(mail.outbox[2].to, ["test6@example.org"]) 

267 

268 self.assertEqual( 

269 mail.outbox[3].subject, "[THALIA] Membership expiration announcement sent" 

270 ) 

271 

272 @freeze_time("2018-08-15") 

273 def test_send_welcome_message(self): 

274 emails.send_welcome_message(self.year_member_nl, "password1") 

275 

276 self.assertEqual(len(mail.outbox), 1) 

277 self.assertEqual(mail.outbox[0].to, ["test1@example.org"]) 

278 self.assertEqual( 

279 mail.outbox[0].subject, "[THALIA] Welcome to Study Association Thalia" 

280 ) 

281 

282 @freeze_time("2018-08-15") 

283 def test_send_expiration_study_long(self): 

284 emails.send_expiration_study_long() 

285 

286 self.assertEqual(len(mail.outbox), 1) 

287 self.assertEqual(mail.outbox[0].to, ["test10@example.org"]) 

288 self.assertEqual( 

289 mail.outbox[0].subject, "[THALIA] Membership expiration warning" 

290 ) 

291 

292 @freeze_time("2018-09-15") 

293 def test_send_expiration_study_long_reminder(self): 

294 emails.send_expiration_study_long_reminder() 

295 

296 self.assertEqual(len(mail.outbox), 1) 

297 self.assertEqual(mail.outbox[0].to, ["test10@example.org"]) 

298 self.assertEqual( 

299 mail.outbox[0].subject, "[THALIA] Membership expiration warning" 

300 )