Я пытаюсь улучшить лямбду отправителя электронной почты, чтобы она могла использовать SES AWS для отправки массовых писем, которые также имеют вложения. То, что казалось лучшим решением (в то время), было просто обновить сервис sesv2 в boto3, так как метод send_email обеспечивает необходимую функциональность.
Раньше модульные тесты просто использовали библиотеку moto для имитации служба SES, но moto в настоящее время не поддерживает sesv2. Как команда, мы изо всех сил пытаемся найти хороший способ создания рабочих юнит-тестов без использования библиотеки moto. Главным образом из-за отсутствия опытного тестировщика в команде.
Мы действительно не знаем, чтобы запустить тест, чтобы убедиться, что функция send_email работает должным образом.
sender.py
import boto3
from email.mime.multipart import MIMEMultipart
def handler(event, context):
msg = MIMEMultipart('mixed')
send_raw_email(msg, 'recipient@domain.com', 'sender@domain.com')
send_email(msg, 'recipient@domain.com', 'sender@domain.com')
def send_raw_email(msg, recipient, sender):
ses_client = boto3.client('ses', region_name="eu-west-1")
response = ses_client.send_raw_email(
Source=sender,
Destinations=[recipient],
RawMessage={'Data': msg.as_string()}
)
return response
def send_email(msg, recipient, sender):
ses_v2_client = boto3.client('sesv2', region_name="eu-west-1")
response = ses_v2_client.send_email(
FromEmailAddress=sender,
Destination={'BccAddresses': [recipient, recipient]},
Content={'Raw': {'Data': msg.as_string()}}
)
return response
test_sender.py
import unittest
import boto3
from unittest.mock import Mock
from email.mime.multipart import MIMEMultipart
from moto import mock_ses
import sender
class SenderTests(unittest.TestCase):
@mock_ses
def test_send_raw_email(self):
ses_client = boto3.client('ses', region_name="eu-west-1")
ses_client.verify_email_identity(EmailAddress='sender@domain.com')
result = sender.send_raw_email(MIMEMultipart('mixed'), 'recipient@domain.com', 'sender@domain.com')
self.assertEqual(result['ResponseMetadata']['HTTPStatusCode'], 200)
def test_send_email(self):
ses_client = boto3.client('sesv2', region_name="eu-west-1")
ses_client.create_email_identity = Mock(
return_value={'IdentityType': 'DOMAIN', 'VerifiedForSendingStatus': True})
ses_client.create_email_identity(EmailIdentity='sender@domain.com')
ses_client.send_email = Mock(return_value=None)
sender.send_email = Mock(return_value={'MessageId': 'string'})
result = sender.send_email(MIMEMultipart('mixed'), 'recipient@domain.com', 'sender@domain.com')
self.assertEqual(result, {'MessageId': 'string'})