コード例 #1
0
def test_ses_callback_should_update_multiple_notification_status_sent(
        client, notify_db_session, sample_email_template, mocker):

    send_mock = mocker.patch(
        'app.celery.service_callback_tasks.send_delivery_status_to_service.apply_async'
    )
    create_notification(
        template=sample_email_template,
        status='sending',
        reference='ref1',
    )
    create_notification(
        template=sample_email_template,
        status='sending',
        reference='ref2',
    )
    create_notification(
        template=sample_email_template,
        status='sending',
        reference='ref3',
    )
    create_service_callback_api(service=sample_email_template.service,
                                url="https://original_url.com")
    assert process_ses_results(ses_notification_callback(reference='ref1'))
    assert process_ses_results(ses_notification_callback(reference='ref2'))
    assert process_ses_results(ses_notification_callback(reference='ref3'))
    assert send_mock.called
def test_make_ses_callback(notify_api, mocker):
    mock_task = mocker.patch('app.celery.research_mode_tasks.process_ses_receipts_tasks.process_ses_results')
    some_ref = str(uuid.uuid4())
    send_email_response(reference=some_ref, to="*****@*****.**")

    mock_task.apply_async.assert_called_once_with(ANY, queue=QueueNames.RESEARCH_MODE)
    assert mock_task.apply_async.call_args[0][0][0] == ses_notification_callback(some_ref)
コード例 #3
0
def test_process_ses_results_retry_called(sample_email_template, notify_db, mocker):
    create_notification(sample_email_template, reference='ref1', sent_at=datetime.utcnow(), status='sending')

    mocker.patch("app.dao.notifications_dao._update_notification_status", side_effect=Exception("EXPECTED"))
    mocked = mocker.patch('app.celery.process_ses_receipts_tasks.process_ses_results_task.retry')
    process_ses_results_task(response=ses_notification_callback(reference='ref1'))
    assert mocked.call_count != 0
コード例 #4
0
def test_ses_callback_does_not_call_send_delivery_status_if_no_db_entry(
        client,
        notify_db,
        notify_db_session,
        sample_email_template,
        mocker):
    with freeze_time('2001-01-01T12:00:00'):

        send_mock = mocker.patch(
            'app.celery.service_callback_tasks.send_delivery_status_to_service.apply_async'
        )
        notification = create_sample_notification(
            notify_db,
            notify_db_session,
            template=sample_email_template,
            reference='ref',
            status='sending',
            sent_at=datetime.utcnow()
        )

        assert get_notification_by_id(notification.id).status == 'sending'

        assert process_ses_results_task(ses_notification_callback(reference='ref'))
        assert get_notification_by_id(notification.id).status == 'delivered'

        send_mock.assert_not_called()
コード例 #5
0
def test_ses_callback_should_update_notification_status(
        notify_db, notify_db_session, sample_email_template, mocker):
    with freeze_time("2001-01-01T12:00:00"):
        mocker.patch("app.statsd_client.incr")
        mocker.patch("app.statsd_client.timing_with_dates")
        send_mock = mocker.patch(
            "app.celery.service_callback_tasks.send_delivery_status_to_service.apply_async"
        )
        notification = create_sample_notification(
            notify_db,
            notify_db_session,
            template=sample_email_template,
            reference="ref",
            status="sending",
            sent_at=datetime.utcnow(),
        )
        callback_api = create_service_callback_api(
            service=sample_email_template.service,
            url="https://original_url.com")
        assert get_notification_by_id(notification.id).status == "sending"

        assert process_ses_results(ses_notification_callback(reference="ref"))
        notification = get_notification_by_id(notification.id)
        assert notification.status == "delivered"
        assert notification.provider_response is None
        statsd_client.timing_with_dates.assert_any_call(
            "callback.ses.elapsed-time", datetime.utcnow(),
            notification.sent_at)
        statsd_client.incr.assert_any_call("callback.ses.delivered")
        updated_notification = Notification.query.get(notification.id)
        encrypted_data = create_delivery_status_callback_data(
            updated_notification, callback_api)
        send_mock.assert_called_once_with(
            [str(notification.id), encrypted_data], queue="service-callbacks")
コード例 #6
0
def test_ses_callback_should_update_notification_status(
        client, notify_db_session, sample_email_template, mocker):
    with freeze_time('2001-01-01T12:00:00'):
        mocker.patch('app.statsd_client.incr')
        mocker.patch('app.statsd_client.timing_with_dates')
        send_mock = mocker.patch(
            'app.celery.service_callback_tasks.send_delivery_status_to_service.apply_async'
        )
        notification = create_notification(
            template=sample_email_template,
            status='sending',
            reference='ref',
        )
        callback_api = create_service_callback_api(
            service=sample_email_template.service,
            url="https://original_url.com")
        assert get_notification_by_id(notification.id).status == 'sending'

        assert process_ses_results(ses_notification_callback(reference='ref'))
        assert get_notification_by_id(notification.id).status == 'delivered'
        statsd_client.timing_with_dates.assert_any_call(
            "callback.ses.elapsed-time", datetime.utcnow(),
            notification.sent_at)
        statsd_client.incr.assert_any_call("callback.ses.delivered")
        updated_notification = Notification.query.get(notification.id)
        encrypted_data = create_delivery_status_callback_data(
            updated_notification, callback_api)
        send_mock.assert_called_once_with(
            [str(notification.id), encrypted_data], queue="service-callbacks")
コード例 #7
0
def test_ses_callback_should_log_if_notification_is_missing(client, notify_db, mocker):
    mock_retry = mocker.patch('app.celery.process_ses_receipts_tasks.process_ses_results_task.retry')
    mock_logger = mocker.patch('app.notifications.notifications_ses_callback.current_app.logger.warning')

    with freeze_time('2017-11-17T12:34:03.646Z'):
        assert process_ses_results_task(ses_notification_callback(reference='ref')) is None
        assert mock_retry.call_count == 0
        mock_logger.assert_called_once_with('notification not found for reference: ref (update to delivered)')
コード例 #8
0
def test_ses_callback_should_not_retry_if_notification_is_old(client, notify_db, mocker):
    mock_retry = mocker.patch('app.celery.process_ses_receipts_tasks.process_ses_results_task.retry')
    mock_logger = mocker.patch('app.notifications.notifications_ses_callback.current_app.logger.error')

    with freeze_time('2017-11-21T12:14:03.646Z'):
        assert process_ses_results_task(ses_notification_callback(reference='ref')) is None
        assert mock_logger.call_count == 0
        assert mock_retry.call_count == 0
コード例 #9
0
def test_process_ses_results(sample_email_template):
    create_notification(sample_email_template,
                        reference='ref1',
                        sent_at=datetime.utcnow(),
                        status='sending')

    assert process_ses_results(response=ses_notification_callback(
        reference='ref1'))
コード例 #10
0
def test_ses_callback_should_not_update_notification_status_if_already_delivered(sample_email_template, mocker):
    mock_dup = mocker.patch('app.notifications.notifications_ses_callback.notifications_dao._duplicate_update_warning')
    mock_upd = mocker.patch('app.notifications.notifications_ses_callback.notifications_dao._update_notification_status')
    notification = create_notification(template=sample_email_template, reference='ref', status='delivered')

    assert process_ses_results_task(ses_notification_callback(reference='ref')) is None
    assert get_notification_by_id(notification.id).status == 'delivered'

    mock_dup.assert_called_once_with(notification, 'delivered')
    assert mock_upd.call_count == 0
コード例 #11
0
def test_ses_callback_should_retry_if_notification_is_new(notify_db, mocker):
    mock_retry = mocker.patch(
        "app.celery.process_ses_receipts_tasks.process_ses_results.retry")
    mock_logger = mocker.patch(
        "app.celery.process_ses_receipts_tasks.current_app.logger.error")

    with freeze_time("2017-11-17T12:14:03.646Z"):
        assert process_ses_results(
            ses_notification_callback(reference="ref")) is None
        assert mock_logger.call_count == 0
        assert mock_retry.call_count == 1
コード例 #12
0
def test_ses_callback_should_log_if_notification_is_missing(notify_db, mocker):
    mock_retry = mocker.patch(
        "app.celery.process_ses_receipts_tasks.process_ses_results.retry")
    mock_logger = mocker.patch(
        "app.celery.process_ses_receipts_tasks.current_app.logger.warning")

    with freeze_time("2017-11-17T12:34:03.646Z"):
        assert process_ses_results(
            ses_notification_callback(reference="ref")) is None
        assert mock_retry.call_count == 0
        mock_logger.assert_called_once_with(
            "notification not found for reference: ref (update to delivered)")
コード例 #13
0
def test_ses_callback_should_update_multiple_notification_status_sent(
        notify_db, notify_db_session, sample_email_template, mocker):
    send_mock = mocker.patch(
        "app.celery.service_callback_tasks.send_delivery_status_to_service.apply_async"
    )
    create_sample_notification(
        notify_db,
        notify_db_session,
        template=sample_email_template,
        reference="ref1",
        sent_at=datetime.utcnow(),
        status="sending",
    )

    create_sample_notification(
        notify_db,
        notify_db_session,
        template=sample_email_template,
        reference="ref2",
        sent_at=datetime.utcnow(),
        status="sending",
    )

    create_sample_notification(
        notify_db,
        notify_db_session,
        template=sample_email_template,
        reference="ref3",
        sent_at=datetime.utcnow(),
        status="sending",
    )
    create_service_callback_api(service=sample_email_template.service,
                                url="https://original_url.com")
    assert process_ses_results(ses_notification_callback(reference="ref1"))
    assert process_ses_results(ses_notification_callback(reference="ref2"))
    assert process_ses_results(ses_notification_callback(reference="ref3"))
    assert send_mock.called
コード例 #14
0
def test_ses_callback_should_send_statsd_statistics(client, notify_db_session,
                                                    sample_email_template,
                                                    mocker):
    with freeze_time('2001-01-01T12:00:00'):
        mocker.patch('app.statsd_client.incr')
        mocker.patch('app.statsd_client.timing_with_dates')

        notification = create_notification(
            template=sample_email_template,
            status='sending',
            reference='ref',
        )

        process_ses_receipts_tasks.process_ses_results(
            ses_notification_callback(reference='ref'))

        statsd_client.timing_with_dates.assert_any_call(
            "callback.ses.elapsed-time", datetime.utcnow(),
            notification.sent_at)
        statsd_client.incr.assert_any_call("callback.ses.delivered")
コード例 #15
0
def test_ses_callback_should_call_send_delivery_status_to_service(
        client, sample_email_template, mocker):
    send_mock = mocker.patch(
        'app.celery.service_callback_tasks.send_delivery_status_to_service.apply_async'
    )
    notification = create_notification(
        template=sample_email_template,
        status='sending',
        reference='ref',
    )

    callback_api = create_service_callback_api(
        service=sample_email_template.service, url="https://original_url.com")
    mocked_callback_api = mocker.Mock(url=callback_api.url,
                                      bearer_token=callback_api.bearer_token)
    process_ses_receipts_tasks.process_ses_results(
        ses_notification_callback(reference='ref'))

    updated_notification = Notification.query.get(notification.id)

    encrypted_data = create_delivery_status_callback_data(
        updated_notification, mocked_callback_api)
    send_mock.assert_called_once_with([str(notification.id), encrypted_data],
                                      queue="service-callbacks")
コード例 #16
0
def test_ses_callback_does_not_call_send_delivery_status_if_no_db_entry(
        notify_db, notify_db_session, sample_email_template, mocker):
    with freeze_time("2001-01-01T12:00:00"):

        send_mock = mocker.patch(
            "app.celery.service_callback_tasks.send_delivery_status_to_service.apply_async"
        )
        notification = create_sample_notification(
            notify_db,
            notify_db_session,
            template=sample_email_template,
            reference="ref",
            status="sending",
            sent_at=datetime.utcnow(),
        )

        assert get_notification_by_id(notification.id).status == "sending"

        assert process_ses_results(ses_notification_callback(reference="ref"))
        notification = get_notification_by_id(notification.id)
        assert notification.status == "delivered"
        assert notification.provider_response is None

        send_mock.assert_not_called()
コード例 #17
0
def test_delivered_ses_callback():
    assert ses_notification_callback("my-reference") == '{  "Type" : "Notification",  "MessageId" : "my-reference",  "TopicArn" : "arn:aws:sns:eu-west-1:123456789012:testing",  "Message" : "{\\"notificationType\\":\\"Delivery\\",\\"mail\\":{\\"timestamp\\":\\"2016-03-14T12:35:25.909Z\\",\\"source\\":\\"[email protected]\\",\\"sourceArn\\":\\"arn:aws:ses:eu-west-1:123456789012:identity/testing-notify\\",\\"sendingAccountId\\":\\"123456789012\\",\\"messageId\\":\\"my-reference\\",\\"destination\\":[\\"[email protected]\\"]},\\"delivery\\":{\\"timestamp\\":\\"2016-03-14T12:35:26.567Z\\",\\"processingTimeMillis\\":658,\\"recipients\\":[\\"[email protected]\\"],\\"smtpResponse\\":\\"250 2.0.0 OK 1457958926 uo5si26480932wjc.221 - gsmtp\\",\\"reportingMTA\\":\\"a6-238.smtp-out.eu-west-1.amazonses.com\\"}}",  "Timestamp" : "2016-03-14T12:35:26.665Z",  "SignatureVersion" : "1",  "Signature" : "X8d7eTAOZ6wlnrdVVPYanrAlsX0SMPfOzhoTEBnQqYkrNWTqQY91C0f3bxtPdUhUtOowyPAOkTQ4KnZuzphfhVb2p1MyVYMxNKcBFB05/qaCX99+92fjw4x9LeUOwyGwMv5F0Vkfi5qZCcEw69uVrhYLVSTFTrzi/yCtru+yFULMQ6UhbY09GwiP6hjxZMVr8aROQy5lLHglqQzOuSZ4KeD85JjifHdKzlx8jjQ+uj+FLzHXPMAPmPU1JK9kpoHZ1oPshAFgPDpphJe+HwcJ8ezmk+3AEUr3wWli3xF+49y8Z2anASSVp6YI2YP95UT8Rlh3qT3T+V9V8rbSVislxA==",  "SigningCertURL" : "https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-bb750dd426d95ee9390147a5624348ee.pem",  "UnsubscribeURL" : "https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:302763885840:preview-emails:d6aad3ef-83d6-4cf3-a470-54e2e75916da"}'  # noqa