def test_delay_email(mocker, email_logs, faker): from app.tasks import send_email send_mock = mocker.patch.object( send_email, 'apply_async', ) schedule_emails() now = datetime.datetime.now() query = EmailLog.select().where( EmailLog.send_at <= now + datetime.timedelta(minutes=10), EmailLog.status != EmailLog.IN_QUEUE) assert query.count() == 0 query = EmailLog.select().where(EmailLog.status == EmailLog.IN_QUEUE, ) assert query.count() == send_mock.call_count
def schedule_emails(): now = datetime.datetime.now() limit_time = now + datetime.timedelta(minutes=10) email_objs = EmailLog.select().where(EmailLog.status == EmailLog.SCHEDULED, EmailLog.send_at <= limit_time) for i in email_objs: EmailLog.set_by_id(i.id, { 'status': EmailLog.IN_QUEUE, 'updated_at': datetime.datetime.now() }) send_email.apply_async(args=(i.id, ), eta=i.send_at)
def test_send_email(mocker, email_logs, faker): from app.tasks import mailext return_val = {'id': faker.isbn13()} send_mock = mocker.patch.object(mailext, 'send_email', return_value=return_val) email = EmailLog.select().first() send_email(email.id) assert send_mock.called == 1 assert EmailLog[email.id].status == EmailLog.SEND_MAILGUN assert EmailLog[email.id].email_id == return_val['id']
def post(self): data = request.get_json() event_data = data['event-data'] if event_data['event'] != 'opened' or not mailext.verify( **data['signature']): return Response(status=406) email_id = event_data['id'] email = EmailLog.select().where(EmailLog.email_id == email_id).first() if email is None or email.status != EmailLog.SEND_SUCCESSFULLY: return Response(status=406) EmailLog.set_by_id(email.id, { 'status': EmailLog.OPENED, 'updated_at': datetime.datetime.now() }) return Response(status=200)
def test_schedule_email_by_countdown(client, faker): data = { 'to': faker.email(), 'countdown': { 'hours': faker.pyint(), 'minutes': faker.pyint(), 'seconds': faker.pyint(), }, 'body': faker.text(), 'subject': faker.sentence() } resp = client.post('/email/schedule', json=data) assert resp.status_code == 200 email = EmailLog.select().first() assert email.created_at + datetime.timedelta( **data['countdown']) == email.send_at
def test_email_track_send_successfully(client, faker, mocker, email_logs_called_mailgun): from app.api.views import mailext verify_mock = mocker.patch.object(mailext, 'verify', return_val=True) email = EmailLog.select().first() resp = client.post('/email/send-track', json={ 'event-data': { 'event': 'delivered', 'id': email.email_id, }, 'signature': {} }) assert resp.status_code == 200 assert EmailLog[email.id].status == EmailLog.SEND_SUCCESSFULLY assert verify_mock.called
def test_schedule_email_by_eta(client, mocker, faker): from app.tasks import send_email mocker.patch.object( send_email, 'apply_async', ) data = { 'to': faker.email(), 'eta': str(faker.future_datetime()), 'body': faker.text(), 'subject': faker.sentence() } resp = client.post('/email/schedule', json=data) assert resp.status_code == 200 email = EmailLog.select().first() assert email.to == data['to'] assert str(email.send_at) == data['eta'] assert email.body == data['body']
def post(self): data = request.get_json() event_data = data['event-data'] if event_data['event'] not in ( 'delivered', 'failed', ) or not mailext.verify(**data['signature']): return Response(status=406) email_id = event_data['id'] email = EmailLog.select().where(EmailLog.email_id == email_id).first() if email is None or email.status != EmailLog.SEND_MAILGUN: return Response(status=406) if event_data['event'] == 'failed': EmailLog.set_by_id(email.id, {'status': EmailLog.SEND_FAILED}) else: EmailLog.set_by_id( email.id, { 'status': EmailLog.SEND_SUCCESSFULLY, 'updated_at': datetime.datetime.now() }) return Response(status=200)