Esempio n. 1
0
    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
Esempio n. 2
0
    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
Esempio n. 3
0
    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"
Esempio n. 4
0
    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
Esempio n. 5
0
    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
Esempio n. 6
0
    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"
Esempio n. 7
0
    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"
Esempio n. 8
0
    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"
Esempio n. 9
0
    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"
Esempio n. 10
0
    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"
Esempio n. 11
0
    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"