Example #1
0
    def test_soft_bounce_without_an_email_obj(self, db_session):
        em = EmailMessageFactory.create()

        status = EmailStatus.load(em)
        status.soft_bounce()

        assert em.missing
Example #2
0
    def test_delivery_without_an_email_obj(self, db_session):
        em = EmailMessageFactory.create()

        status = EmailStatus.load(em)
        status.deliver()

        assert em.missing
Example #3
0
    def test_delivery_without_an_email_obj(self, db_session):
        em = EmailMessageFactory.create()

        status = EmailStatus.load(em)
        status.deliver()

        assert em.missing
Example #4
0
    def test_soft_bounce_without_an_email_obj(self, db_session):
        em = EmailMessageFactory.create()

        status = EmailStatus.load(em)
        status.soft_bounce()

        assert em.missing
Example #5
0
    def test_hard_bounce_resets_transient_bounces(self, db_session):
        email = EmailFactory.create(transient_bounces=3)
        em = EmailMessageFactory.create(to=email.email)

        status = EmailStatus.load(em)
        status.bounce()

        assert email.transient_bounces == 0
Example #6
0
    def test_hard_bounce_resets_transient_bounces(self, db_session):
        email = EmailFactory.create(transient_bounces=3)
        em = EmailMessageFactory.create(to=email.email)

        status = EmailStatus.load(em)
        status.bounce()

        assert email.transient_bounces == 0
Example #7
0
    def test_can_deliver(self, db_session):
        email = EmailFactory.create()
        em = EmailMessageFactory.create(to=email.email)

        status = EmailStatus.load(em)
        status.deliver()

        assert status.save().status is EmailStatuses.Delivered
        assert email.unverify_reason is None
Example #8
0
    def test_soft_bounce_increments_transient_bounces(self, db_session):
        email = EmailFactory.create(transient_bounces=3)
        em = EmailMessageFactory.create(to=email.email)

        status = EmailStatus.load(em)
        status.soft_bounce()

        assert status.save().status is EmailStatuses.SoftBounced
        assert email.transient_bounces == 4
Example #9
0
    def test_complain_resets_transient_bounces(self, db_session):
        email = EmailFactory.create(transient_bounces=3)
        em = EmailMessageFactory.create(to=email.email)

        status = EmailStatus.load(em)
        status.deliver()
        status.complain()

        assert email.transient_bounces == 0
Example #10
0
    def test_can_deliver(self, db_session):
        email = EmailFactory.create()
        em = EmailMessageFactory.create(to=email.email)

        status = EmailStatus.load(em)
        status.deliver()

        assert status.save().status is EmailStatuses.Delivered
        assert email.unverify_reason is None
Example #11
0
    def test_delivery_resets_transient_bounces(self, db_session):
        email = EmailFactory.create(transient_bounces=3)
        em = EmailMessageFactory.create(to=email.email)

        status = EmailStatus.load(em)
        status.deliver()

        assert status.save().status is EmailStatuses.Delivered
        assert email.transient_bounces == 0
Example #12
0
    def test_complain_without_email_obj_and_with(self, db_session):
        em = EmailMessageFactory.create()

        status = EmailStatus.load(em)
        status.deliver()
        EmailFactory.create(email=em.to)
        status.complain()

        assert em.missing
Example #13
0
    def test_complain_resets_transient_bounces(self, db_session):
        email = EmailFactory.create(transient_bounces=3)
        em = EmailMessageFactory.create(to=email.email)

        status = EmailStatus.load(em)
        status.deliver()
        status.complain()

        assert email.transient_bounces == 0
Example #14
0
    def test_hard_bounce_after_delivery_without_email_obj(self, db_session):
        em = EmailMessageFactory.create()

        status = EmailStatus.load(em)
        status.deliver()
        EmailFactory.create(email=em.to)
        status.bounce()

        assert em.missing
Example #15
0
    def test_soft_bounce_increments_transient_bounces(self, db_session):
        email = EmailFactory.create(transient_bounces=3)
        em = EmailMessageFactory.create(to=email.email)

        status = EmailStatus.load(em)
        status.soft_bounce()

        assert status.save().status is EmailStatuses.SoftBounced
        assert email.transient_bounces == 4
Example #16
0
    def test_complain_without_email_obj_and_with(self, db_session):
        em = EmailMessageFactory.create()

        status = EmailStatus.load(em)
        status.deliver()
        EmailFactory.create(email=em.to)
        status.complain()

        assert em.missing
Example #17
0
    def test_hard_bounce_after_delivery_without_email_obj(self, db_session):
        em = EmailMessageFactory.create()

        status = EmailStatus.load(em)
        status.deliver()
        EmailFactory.create(email=em.to)
        status.bounce()

        assert em.missing
Example #18
0
    def test_delivery_resets_transient_bounces(self, db_session):
        email = EmailFactory.create(transient_bounces=3)
        em = EmailMessageFactory.create(to=email.email)

        status = EmailStatus.load(em)
        status.deliver()

        assert status.save().status is EmailStatuses.Delivered
        assert email.transient_bounces == 0
Example #19
0
    def test_soft_bounce_after_delivery_does_nothing(self, db_session):
        email = EmailFactory.create(transient_bounces=3)
        em = EmailMessageFactory.create(to=email.email)

        status = EmailStatus.load(em)
        status.deliver()
        status.soft_bounce()

        assert status.save().status is EmailStatuses.Delivered
        assert email.transient_bounces == 0
Example #20
0
    def test_hard_bounce_unverifies_email(self, db_session):
        email = EmailFactory.create()
        em = EmailMessageFactory.create(to=email.email)

        status = EmailStatus.load(em)
        status.bounce()

        assert status.save().status is EmailStatuses.Bounced
        assert not email.verified
        assert email.unverify_reason is UnverifyReasons.HardBounce
Example #21
0
    def test_hard_bounce_unverifies_email(self, db_session):
        email = EmailFactory.create()
        em = EmailMessageFactory.create(to=email.email)

        status = EmailStatus.load(em)
        status.bounce()

        assert status.save().status is EmailStatuses.Bounced
        assert not email.verified
        assert email.unverify_reason is UnverifyReasons.HardBounce
Example #22
0
    def test_soft_bounce_after_delivery_does_nothing(self, db_session):
        email = EmailFactory.create(transient_bounces=3)
        em = EmailMessageFactory.create(to=email.email)

        status = EmailStatus.load(em)
        status.deliver()
        status.soft_bounce()

        assert status.save().status is EmailStatuses.Delivered
        assert email.transient_bounces == 0
Example #23
0
    def test_delivery_after_hard_bounce(self, db_session):
        email = EmailFactory.create(transient_bounces=3)
        em = EmailMessageFactory.create(to=email.email)

        status = EmailStatus.load(em)
        status.bounce()
        status.deliver()

        assert email.transient_bounces == 0
        assert not email.verified
Example #24
0
    def test_soft_bounced_unverifies_when_going_over(self, db_session):
        email = EmailFactory.create(transient_bounces=MAX_TRANSIENT_BOUNCES)
        em = EmailMessageFactory.create(to=email.email)

        status = EmailStatus.load(em)
        status.soft_bounce()

        assert status.save().status is EmailStatuses.SoftBounced
        assert email.transient_bounces == MAX_TRANSIENT_BOUNCES + 1
        assert not email.verified
        assert email.unverify_reason is UnverifyReasons.SoftBounce
Example #25
0
    def test_soft_bounced_unverifies_when_going_over(self, db_session):
        email = EmailFactory.create(transient_bounces=MAX_TRANSIENT_BOUNCES)
        em = EmailMessageFactory.create(to=email.email)

        status = EmailStatus.load(em)
        status.soft_bounce()

        assert status.save().status is EmailStatuses.SoftBounced
        assert email.transient_bounces == MAX_TRANSIENT_BOUNCES + 1
        assert not email.verified
        assert email.unverify_reason is UnverifyReasons.SoftBounce
Example #26
0
    def test_complain_unverifies_email(self, db_session):
        email = EmailFactory.create()
        em = EmailMessageFactory.create(to=email.email)

        status = EmailStatus.load(em)
        status.deliver()
        status.complain()

        assert status.save().status is EmailStatuses.Complained
        assert not email.verified
        assert email.unverify_reason is UnverifyReasons.SpamComplaint
Example #27
0
def notification(request):
    metrics = request.find_service(IMetricsService, context=None)
    data = request.json_body

    # Check to ensure that the Type is what we expect.
    if data.get("Type") != "Notification":
        raise HTTPBadRequest("Expected Type of Notification")

    try:
        _verify_sns_message(request, data)
    except requests.HTTPError:
        metrics.increment("warehouse.ses.sns_verify.error")
        raise HTTPServiceUnavailable from None

    event_exists = request.db.query(
        exists().where(Event.event_id == data["MessageId"])).scalar()
    if event_exists:
        return Response()

    message = json.loads(data["Message"])
    message_id = message["mail"]["messageId"]

    try:
        email = (request.db.query(EmailMessage).filter(
            EmailMessage.message_id == message_id).one())
    except NoResultFound:
        raise HTTPBadRequest("Unknown messageId")

    # Load our state machine from the status in the database, process any
    # transition we have from this event, and then save the result.
    machine = EmailStatus.load(email)
    if message["notificationType"] == "Delivery":
        machine.deliver()
    elif (message["notificationType"] == "Bounce"
          and message["bounce"]["bounceType"] == "Permanent"):
        machine.bounce()
    elif message["notificationType"] == "Bounce":
        machine.soft_bounce()
    elif message["notificationType"] == "Complaint":
        machine.complain()
    else:
        raise HTTPBadRequest("Unknown notificationType")
    email = machine.save()

    # Save our event to the database.
    request.db.add(
        Event(
            email=email,
            event_id=data["MessageId"],
            event_type=EventTypes(message["notificationType"]),
            data=message[message["notificationType"].lower()],
        ))

    return Response()
Example #28
0
    def test_complain_unverifies_email(self, db_session):
        email = EmailFactory.create()
        em = EmailMessageFactory.create(to=email.email)

        status = EmailStatus.load(em)
        status.deliver()
        status.complain()

        assert status.save().status is EmailStatuses.Complained
        assert not email.verified
        assert email.unverify_reason is UnverifyReasons.SpamComplaint
Example #29
0
def notification(request):
    data = request.json_body

    # Check to ensure that the Type is what we expect.
    if data.get("Type") != "Notification":
        raise HTTPBadRequest("Expected Type of Notification")

    _verify_sns_message(request, data)

    event_exists = (
        request.db.query(exists().where(Event.event_id == data["MessageId"]))
                  .scalar())
    if event_exists:
        return Response()

    message = json.loads(data["Message"])
    message_id = message["mail"]["messageId"]

    try:
        email = (
            request.db.query(EmailMessage)
                      .filter(EmailMessage.message_id == message_id)
                      .one())
    except NoResultFound:
        raise HTTPBadRequest("Unknown messageId")

    # Load our state machine from the status in the database, process any
    # transition we have from this event, and then save the result.
    machine = EmailStatus.load(email)
    if message["notificationType"] == "Delivery":
        machine.deliver()
    elif (message["notificationType"] == "Bounce" and
            message["bounce"]["bounceType"] == "Permanent"):
        machine.bounce()
    elif message["notificationType"] == "Bounce":
        machine.soft_bounce()
    elif message["notificationType"] == "Complaint":
        machine.complain()
    else:
        raise HTTPBadRequest("Unknown notificationType")
    email = machine.save()

    # Save our event to the database.
    request.db.add(
        Event(
            email=email,
            event_id=data["MessageId"],
            event_type=EventTypes(message["notificationType"]),
            data=message[message["notificationType"].lower()],
        )
    )

    return Response()
Example #30
0
 def test_load(self, start_status, db_session):
     em = EmailMessageFactory.create(status=EmailStatuses(start_status))
     status = EmailStatus.load(em)
     assert status.save().status == EmailStatuses(start_status)
Example #31
0
 def test_starts_out_accepted(self, db_session):
     em = EmailStatus(EmailMessage()).save()
     assert em.status is EmailStatuses.Accepted
Example #32
0
 def test_load(self, start_status, db_session):
     em = EmailMessageFactory.create(status=EmailStatuses(start_status))
     status = EmailStatus.load(em)
     assert status.save().status == EmailStatuses(start_status)