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
« 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
5from freezegun import freeze_time
7from members import emails
8from members.models import Member, Membership, Profile
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 )
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 )
230 @freeze_time("2017-10-01")
231 def test_send_information_request(self):
232 emails.send_information_request()
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"])
250 self.assertEqual(mails[0].subject, "[THALIA] Membership information check sent")
252 @freeze_time("2018-08-15")
253 def test_send_expiration_announcement(self):
254 emails.send_expiration_announcement()
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"])
268 self.assertEqual(
269 mail.outbox[3].subject, "[THALIA] Membership expiration announcement sent"
270 )
272 @freeze_time("2018-08-15")
273 def test_send_welcome_message(self):
274 emails.send_welcome_message(self.year_member_nl, "password1")
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 )
282 @freeze_time("2018-08-15")
283 def test_send_expiration_study_long(self):
284 emails.send_expiration_study_long()
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 )
292 @freeze_time("2018-09-15")
293 def test_send_expiration_study_long_reminder(self):
294 emails.send_expiration_study_long_reminder()
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 )