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
Beispiel #2
0
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']
Beispiel #4
0
 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']
Beispiel #8
0
 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)