示例#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
示例#2
0
    def test_delivery_without_an_email_obj(self, db_session):
        em = EmailMessageFactory.create()

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

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

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

        assert em.missing
示例#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
示例#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
示例#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
示例#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
示例#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
示例#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
示例#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
示例#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
示例#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
示例#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
示例#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
示例#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
示例#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
示例#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
示例#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
示例#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
示例#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
示例#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
示例#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
示例#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
示例#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
示例#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
示例#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
示例#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()
示例#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
示例#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()
示例#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)
示例#31
0
 def test_starts_out_accepted(self, db_session):
     em = EmailStatus(EmailMessage()).save()
     assert em.status is EmailStatuses.Accepted
示例#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)