14
14
if TYPE_CHECKING :
15
15
from mypy_boto3_ses import SESClient
16
16
17
- TEST_TEMPLATE_ATTRIBUTES = {
17
+ SAMPLE_TEMPLATE = {
18
18
"TemplateName" : "hello-world" ,
19
19
"SubjectPart" : "Subject test" ,
20
20
"TextPart" : "hello\n world" ,
21
21
"HtmlPart" : "hello<br/>world" ,
22
22
}
23
23
24
+ SAMPLE_SIMPLE_EMAIL = {
25
+ "Subject" : {
26
+ "Data" : "SOME_SUBJECT" ,
27
+ },
28
+ "Body" : {
29
+ "Text" : {
30
+ "Data" : "SOME_MESSAGE" ,
31
+ },
32
+ "Html" : {
33
+ "Data" : "<p>SOME_HTML</p>" ,
34
+ },
35
+ },
36
+ }
37
+
24
38
25
39
@pytest .fixture
26
40
def create_template (ses_client ):
@@ -81,27 +95,27 @@ def sort_mail_sqs_messages(message):
81
95
82
96
class TestSES :
83
97
def test_list_templates (self , ses_client , create_template ):
84
- create_template (Template = TEST_TEMPLATE_ATTRIBUTES )
98
+ create_template (Template = SAMPLE_TEMPLATE )
85
99
templ_list = ses_client .list_templates ()["TemplatesMetadata" ]
86
100
assert 1 == len (templ_list )
87
101
created_template = templ_list [0 ]
88
- assert TEST_TEMPLATE_ATTRIBUTES ["TemplateName" ] == created_template ["Name" ]
102
+ assert SAMPLE_TEMPLATE ["TemplateName" ] == created_template ["Name" ]
89
103
assert type (created_template ["CreatedTimestamp" ]) in (date , datetime )
90
104
91
105
# Should not fail after 2 consecutive tries
92
106
templ_list = ses_client .list_templates ()["TemplatesMetadata" ]
93
107
assert 1 == len (templ_list )
94
108
created_template = templ_list [0 ]
95
- assert TEST_TEMPLATE_ATTRIBUTES ["TemplateName" ] == created_template ["Name" ]
109
+ assert SAMPLE_TEMPLATE ["TemplateName" ] == created_template ["Name" ]
96
110
assert type (created_template ["CreatedTimestamp" ]) in (date , datetime )
97
111
98
112
def test_delete_template (self , ses_client , create_template ):
99
113
templ_list = ses_client .list_templates ()["TemplatesMetadata" ]
100
114
assert 0 == len (templ_list )
101
- create_template (Template = TEST_TEMPLATE_ATTRIBUTES )
115
+ create_template (Template = SAMPLE_TEMPLATE )
102
116
templ_list = ses_client .list_templates ()["TemplatesMetadata" ]
103
117
assert 1 == len (templ_list )
104
- ses_client .delete_template (TemplateName = TEST_TEMPLATE_ATTRIBUTES ["TemplateName" ])
118
+ ses_client .delete_template (TemplateName = SAMPLE_TEMPLATE ["TemplateName" ])
105
119
templ_list = ses_client .list_templates ()["TemplatesMetadata" ]
106
120
assert 0 == len (templ_list )
107
121
@@ -134,19 +148,7 @@ def _read_message_from_filesystem(message_id: str) -> dict:
134
148
# Send a regular message
135
149
message1 = ses_client .send_email (
136
150
Source = email ,
137
- Message = {
138
- "Subject" : {
139
- "Data" : "A_SUBJECT" ,
140
- },
141
- "Body" : {
142
- "Text" : {
143
- "Data" : "A_MESSAGE" ,
144
- },
145
- "Html" : {
146
- "Data" : "A_HTML" ,
147
- },
148
- },
149
- },
151
+ Message = SAMPLE_SIMPLE_EMAIL ,
150
152
Destination = {
151
153
"ToAddresses" : ["success@example.com" ],
152
154
},
@@ -160,8 +162,11 @@ def _read_message_from_filesystem(message_id: str) -> dict:
160
162
assert contents1 ["Region" ]
161
163
assert contents1 ["Source" ] == email
162
164
assert contents1 ["Destination" ] == {"ToAddresses" : ["success@example.com" ]}
163
- assert contents1 ["Subject" ] == "A_SUBJECT"
164
- assert contents1 ["Body" ] == {"text_part" : "A_MESSAGE" , "html_part" : "A_HTML" }
165
+ assert contents1 ["Subject" ] == SAMPLE_SIMPLE_EMAIL ["Subject" ]["Data" ]
166
+ assert contents1 ["Body" ] == {
167
+ "text_part" : SAMPLE_SIMPLE_EMAIL ["Body" ]["Text" ]["Data" ],
168
+ "html_part" : SAMPLE_SIMPLE_EMAIL ["Body" ]["Html" ]["Data" ],
169
+ }
165
170
assert "RawData" not in contents1
166
171
167
172
# Send a raw message
@@ -208,12 +213,12 @@ def test_send_templated_email_can_retrospect(self, ses_client, create_template):
208
213
data_dir = config .dirs .data or config .dirs .tmp
209
214
email = f"user-{ short_uid ()} @example.com"
210
215
ses_client .verify_email_address (EmailAddress = email )
211
- ses_client .delete_template (TemplateName = TEST_TEMPLATE_ATTRIBUTES ["TemplateName" ])
212
- create_template (Template = TEST_TEMPLATE_ATTRIBUTES )
216
+ ses_client .delete_template (TemplateName = SAMPLE_TEMPLATE ["TemplateName" ])
217
+ create_template (Template = SAMPLE_TEMPLATE )
213
218
214
219
message = ses_client .send_templated_email (
215
220
Source = email ,
216
- Template = TEST_TEMPLATE_ATTRIBUTES ["TemplateName" ],
221
+ Template = SAMPLE_TEMPLATE ["TemplateName" ],
217
222
TemplateData = '{"A key": "A value"}' ,
218
223
Destination = {
219
224
"ToAddresses" : ["success@example.com" ],
@@ -227,7 +232,7 @@ def test_send_templated_email_can_retrospect(self, ses_client, create_template):
227
232
contents = json .loads (message )
228
233
229
234
assert email == contents ["Source" ]
230
- assert TEST_TEMPLATE_ATTRIBUTES ["TemplateName" ] == contents ["Template" ]
235
+ assert SAMPLE_TEMPLATE ["TemplateName" ] == contents ["Template" ]
231
236
assert '{"A key": "A value"}' == contents ["TemplateData" ]
232
237
assert ["success@example.com" ] == contents ["Destination" ]["ToAddresses" ]
233
238
@@ -239,6 +244,44 @@ def test_send_templated_email_can_retrospect(self, ses_client, create_template):
239
244
assert requests .delete ("http://localhost:4566/_aws/ses" ).status_code == 204
240
245
assert requests .get ("http://localhost:4566/_aws/ses" ).json () == {"messages" : []}
241
246
247
+ def test_sent_message_counter (self , ses_client , create_template ):
248
+ # Ensure all email send operations correctly update the sent email counter
249
+ email = f"user-{ short_uid ()} @example.com"
250
+ ses_client .verify_email_address (EmailAddress = email )
251
+
252
+ counter = ses_client .get_send_quota ()["SentLast24Hours" ]
253
+
254
+ ses_client .send_email (
255
+ Source = email ,
256
+ Message = SAMPLE_SIMPLE_EMAIL ,
257
+ Destination = {
258
+ "ToAddresses" : ["success@example.com" ],
259
+ },
260
+ )
261
+
262
+ new_counter = ses_client .get_send_quota ()["SentLast24Hours" ]
263
+ assert new_counter == counter + 1
264
+ counter = new_counter
265
+
266
+ create_template (Template = SAMPLE_TEMPLATE )
267
+ ses_client .send_templated_email (
268
+ Source = email ,
269
+ Template = SAMPLE_TEMPLATE ["TemplateName" ],
270
+ TemplateData = '{"A key": "A value"}' ,
271
+ Destination = {
272
+ "ToAddresses" : ["success@example.com" , "lorem@ipsum.co" ],
273
+ },
274
+ )
275
+
276
+ new_counter = ses_client .get_send_quota ()["SentLast24Hours" ]
277
+ assert new_counter == counter + 2
278
+ counter = new_counter
279
+
280
+ raw_message_data = f"From: { email } \n To: recipient@example.com\n Subject: test\n \n This is the message body.\n \n "
281
+ ses_client .send_raw_email (RawMessage = {"Data" : raw_message_data })
282
+ new_counter = ses_client .get_send_quota ()["SentLast24Hours" ]
283
+ assert new_counter == counter + 1
284
+
242
285
def test_clone_receipt_rule_set (self , ses_client ):
243
286
# Test that rule set is cloned properly
244
287
@@ -362,19 +405,9 @@ def test_ses_sns_topic_integration_send_email(
362
405
destination = {
363
406
"ToAddresses" : [recipient_email_address ],
364
407
}
365
- message = {
366
- "Subject" : {
367
- "Data" : "foo subject" ,
368
- },
369
- "Body" : {
370
- "Text" : {
371
- "Data" : "saml body" ,
372
- },
373
- },
374
- }
375
408
ses_client .send_email (
376
409
Destination = destination ,
377
- Message = message ,
410
+ Message = SAMPLE_SIMPLE_EMAIL ,
378
411
ConfigurationSetName = config_set_name ,
379
412
Source = sender_email_address ,
380
413
Tags = [
0 commit comments