def test_soft_bounce_without_an_email_obj(self, db_session): em = EmailMessageFactory.create() status = EmailStatus.load(em) status.soft_bounce() assert em.missing
def test_delivery_without_an_email_obj(self, db_session): em = EmailMessageFactory.create() status = EmailStatus.load(em) status.deliver() assert em.missing
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
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
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
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
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
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
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
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
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
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
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
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
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()
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()
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)