def test_last_sent_none(self, db_session): to = "*****@*****.**" subject = "I care about this" sender = SESEmailSender(pretend.stub(), sender=pretend.stub(), db=db_session) assert sender.last_sent(to, subject) is None
def test_last_sent(self, db_session): to = "*****@*****.**" subject = "I care about this" # Send some random emails aws_client = pretend.stub(send_raw_email=pretend.call_recorder( lambda *a, **kw: {"MessageId": str(uuid.uuid4()) + "-ses"})) sender = SESEmailSender(aws_client, sender="DevPyPI <*****@*****.**>", db=db_session) for address in [to, "*****@*****.**"]: for subject in [subject, "I do not care about this"]: sender.send( f"Foobar <{ to }>", EmailMessage(subject=subject, body_text="This is a plain text body"), ) # Send the last email that we care about resp = {"MessageId": str(uuid.uuid4()) + "-ses"} aws_client = pretend.stub( send_raw_email=pretend.call_recorder(lambda *a, **kw: resp)) sender = SESEmailSender(aws_client, sender="DevPyPI <*****@*****.**>", db=db_session) sender.send( f"Foobar <{ to }>", EmailMessage(subject=subject, body_text="This is a plain text body"), ) em = (db_session.query(SESEmailMessage).filter_by( message_id=resp["MessageId"]).one()) assert sender.last_sent(to, subject) == em.created
def test_send(self, db_session): # Determine what the random boundary token will be import random import sys random.seed(42) token = random.randrange(sys.maxsize) random.seed(42) resp = {"MessageId": str(uuid.uuid4()) + "-ses"} aws_client = pretend.stub( send_raw_email=pretend.call_recorder(lambda *a, **kw: resp) ) sender = SESEmailSender( aws_client, sender="DevPyPI <*****@*****.**>", db=db_session ) sender.send( "This is a Subject", "This is a Body", recipient="FooBar <*****@*****.**>", ) assert aws_client.send_raw_email.calls == [ pretend.call( Source="DevPyPI <*****@*****.**>", Destinations=["FooBar <*****@*****.**>"], RawMessage={ "Data": ( 'Content-Type: multipart/mixed; boundary="==============={token}=="\n' # noqa "MIME-Version: 1.0\n" "Subject: This is a Subject\n" "From: DevPyPI <*****@*****.**>\n" "To: FooBar <*****@*****.**>\n" "\n" "--==============={token}==\n" 'Content-Type: text/plain; charset="utf-8"\n' "MIME-Version: 1.0\n" "Content-Transfer-Encoding: base64\n" "\n" "VGhpcyBpcyBhIEJvZHk=\n" "\n" "--==============={token}==--\n" ).format(token=token) }, ) ] em = ( db_session.query(EmailMessage).filter_by(message_id=resp["MessageId"]).one() ) assert em.from_ == "*****@*****.**" assert em.to == "*****@*****.**" assert em.subject == "This is a Subject"
def test_creates_service(self): aws_client = pretend.stub() aws_session = pretend.stub( client=pretend.call_recorder(lambda name, region_name: aws_client), ) request = pretend.stub( find_service=lambda name: {"aws.session": aws_session}[name], registry=pretend.stub( settings={ "site.name": "DevPyPI", "mail.region": "us-west-2", "mail.sender": "*****@*****.**", }, ), db=pretend.stub(), ) sender = SESEmailSender.create_service(pretend.stub(), request) assert aws_session.client.calls == [ pretend.call("ses", region_name="us-west-2"), ] assert sender._client is aws_client assert sender._sender == "DevPyPI <*****@*****.**>" assert sender._db is request.db
def test_creates_service(self): aws_client = pretend.stub() aws_session = pretend.stub( client=pretend.call_recorder(lambda name, region_name: aws_client) ) request = pretend.stub( find_service=lambda name: {"aws.session": aws_session}[name], registry=pretend.stub( settings={ "site.name": "DevPyPI", "mail.region": "us-west-2", "mail.sender": "*****@*****.**", } ), db=pretend.stub(), ) sender = SESEmailSender.create_service(pretend.stub(), request) assert aws_session.client.calls == [ pretend.call("ses", region_name="us-west-2") ] assert sender._client is aws_client assert sender._sender == "DevPyPI <*****@*****.**>" assert sender._db is request.db
def test_send_with_plaintext(self, db_session): resp = {"MessageId": str(uuid.uuid4()) + "-ses"} aws_client = pretend.stub( send_raw_email=pretend.call_recorder(lambda *a, **kw: resp) ) sender = SESEmailSender( aws_client, sender="DevPyPI <*****@*****.**>", db=db_session ) sender.send( "Foobar <*****@*****.**>", EmailMessage( subject="This is a Subject", body_text="This is a plain text body" ), ) assert aws_client.send_raw_email.calls == [ pretend.call( Source="DevPyPI <*****@*****.**>", Destinations=["Foobar <*****@*****.**>"], RawMessage={ "Data": ( b"Subject: This is a Subject\n" b"From: DevPyPI <*****@*****.**>\n" b"To: Foobar <*****@*****.**>\n" b'Content-Type: text/plain; charset="utf-8"\n' b"Content-Transfer-Encoding: 7bit\n" b"MIME-Version: 1.0\n" b"\n" b"This is a plain text body\n" ) }, ) ] em = ( db_session.query(SESEmailMessage) .filter_by(message_id=resp["MessageId"]) .one() ) assert em.from_ == "*****@*****.**" assert em.to == "*****@*****.**" assert em.subject == "This is a Subject"
def test_send_with_plaintext(self, db_session): resp = {"MessageId": str(uuid.uuid4()) + "-ses"} aws_client = pretend.stub( send_raw_email=pretend.call_recorder(lambda *a, **kw: resp) ) sender = SESEmailSender( aws_client, sender="DevPyPI <*****@*****.**>", db=db_session ) sender.send( "Foobar <*****@*****.**>", EmailMessage( subject="This is a Subject", body_text="This is a plain text body" ), ) assert aws_client.send_raw_email.calls == [ pretend.call( Source="DevPyPI <*****@*****.**>", Destinations=["Foobar <*****@*****.**>"], RawMessage={ "Data": ( b"Subject: This is a Subject\n" b"From: DevPyPI <*****@*****.**>\n" b"To: Foobar <*****@*****.**>\n" b'Content-Type: text/plain; charset="utf-8"\n' b"Content-Transfer-Encoding: 7bit\n" b"MIME-Version: 1.0\n" b"\n" b"This is a plain text body\n" ) }, ) ] em = ( db_session.query(SESEmailMessage) .filter_by(message_id=resp["MessageId"]) .one() ) assert em.from_ == "*****@*****.**" assert em.to == "*****@*****.**" assert em.subject == "This is a Subject"
def test_send(self, db_session): resp = {"MessageId": str(uuid.uuid4()) + "-ses"} aws_client = pretend.stub( send_email=pretend.call_recorder(lambda *a, **kw: resp), ) sender = SESEmailSender(aws_client, sender="DevPyPI <*****@*****.**>", db=db_session) sender.send( "This is a Subject", "This is a Body", recipient="FooBar <*****@*****.**>", ) assert aws_client.send_email.calls == [ pretend.call( Source="DevPyPI <*****@*****.**>", Destination={"ToAddresses": ["FooBar <*****@*****.**>"]}, Message={ "Subject": { "Data": "This is a Subject", "Charset": "UTF-8", }, "Body": { "Text": { "Data": "This is a Body", "Charset": "UTF-8" }, }, }, ), ] em = (db_session.query(EmailMessage).filter_by( message_id=resp["MessageId"]).one()) assert em.from_ == "*****@*****.**" assert em.to == "*****@*****.**" assert em.subject == "This is a Subject"
def test_send(self, db_session): resp = {"MessageId": str(uuid.uuid4()) + "-ses"} aws_client = pretend.stub( send_email=pretend.call_recorder(lambda *a, **kw: resp), ) sender = SESEmailSender(aws_client, sender="DevPyPI <*****@*****.**>", db=db_session) sender.send( "This is a Subject", "This is a Body", recipient="FooBar <*****@*****.**>", ) assert aws_client.send_email.calls == [ pretend.call( Source="DevPyPI <*****@*****.**>", Destination={"ToAddresses": ["FooBar <*****@*****.**>"]}, Message={ "Subject": { "Data": "This is a Subject", "Charset": "UTF-8", }, "Body": { "Text": {"Data": "This is a Body", "Charset": "UTF-8"}, }, }, ), ] em = (db_session.query(EmailMessage) .filter_by(message_id=resp["MessageId"]) .one()) assert em.from_ == "*****@*****.**" assert em.to == "*****@*****.**" assert em.subject == "This is a Subject"
def test_send_with_unicode_and_html(self, db_session): # Determine what the random boundary token will be import random import sys random.seed(42) token = random.randrange(sys.maxsize) random.seed(42) resp = {"MessageId": str(uuid.uuid4()) + "-ses"} aws_client = pretend.stub( send_raw_email=pretend.call_recorder(lambda *a, **kw: resp)) sender = SESEmailSender(aws_client, sender="DevPyPI <*****@*****.**>", db=db_session) sender.send( "Fööbar <*****@*****.**>", EmailMessage( subject="This is a Subject", body_text="This is a plain text body", body_html="<p>This is a html body! 💩</p>", ), ) assert aws_client.send_raw_email.calls == [ pretend.call( Source="DevPyPI <*****@*****.**>", Destinations=["Fööbar <*****@*****.**>"], RawMessage={ "Data": (b"Subject: This is a Subject\n" b"From: DevPyPI <*****@*****.**>\n" b"To: =?utf-8?q?F=C3=B6=C3=B6bar?= <*****@*****.**>\n" b"MIME-Version: 1.0\n" b"Content-Type: multipart/alternative;\n" b' boundary="===============%(token)d=="\n' b"\n" b"--===============%(token)d==\n" b'Content-Type: text/plain; charset="utf-8"\n' b"Content-Transfer-Encoding: 7bit\n" b"\n" b"This is a plain text body\n" b"\n" b"--===============%(token)d==\n" b'Content-Type: text/html; charset="utf-8"\n' b"Content-Transfer-Encoding: 8bit\n" b"MIME-Version: 1.0\n" b"\n" b"<p>This is a html body! \xf0\x9f\x92\xa9</p>\n" b"\n" b"--===============%(token)d==--\n") % { b"token": token } }, ) ] em = (db_session.query(SESEmailMessage).filter_by( message_id=resp["MessageId"]).one()) assert em.from_ == "*****@*****.**" assert em.to == "*****@*****.**" assert em.subject == "This is a Subject"
def test_send_with_uncide_and_html(self, db_session): # Determine what the random boundary token will be import random import sys random.seed(42) token = random.randrange(sys.maxsize) random.seed(42) resp = {"MessageId": str(uuid.uuid4()) + "-ses"} aws_client = pretend.stub( send_raw_email=pretend.call_recorder(lambda *a, **kw: resp) ) sender = SESEmailSender( aws_client, sender="DevPyPI <*****@*****.**>", db=db_session ) sender.send( "Fööbar <*****@*****.**>", EmailMessage( subject="This is a Subject", body_text="This is a plain text body", body_html="<p>This is a html body! 💩</p>", ), ) assert aws_client.send_raw_email.calls == [ pretend.call( Source="DevPyPI <*****@*****.**>", Destinations=["Fööbar <*****@*****.**>"], RawMessage={ "Data": ( b"Subject: This is a Subject\n" b"From: DevPyPI <*****@*****.**>\n" b"To: =?utf-8?q?F=C3=B6=C3=B6bar?= <*****@*****.**>\n" b"MIME-Version: 1.0\n" b"Content-Type: multipart/alternative;\n" b' boundary="===============%(token)d=="\n' b"\n" b"--===============%(token)d==\n" b'Content-Type: text/plain; charset="utf-8"\n' b"Content-Transfer-Encoding: 7bit\n" b"\n" b"This is a plain text body\n" b"\n" b"--===============%(token)d==\n" b'Content-Type: text/html; charset="utf-8"\n' b"Content-Transfer-Encoding: 8bit\n" b"MIME-Version: 1.0\n" b"\n" b"<p>This is a html body! \xf0\x9f\x92\xa9</p>\n" b"\n" b"--===============%(token)d==--\n" ) % {b"token": token} }, ) ] em = ( db_session.query(SESEmailMessage) .filter_by(message_id=resp["MessageId"]) .one() ) assert em.from_ == "*****@*****.**" assert em.to == "*****@*****.**" assert em.subject == "This is a Subject"