Example #1
0
def test_provider_to_use_raises_if_no_active_providers(mocker,
                                                       notify_db_session):
    for provider in get_all_active_providers():
        provider.active = False

    with pytest.raises(Exception):
        send_to_providers.provider_to_use('sms', international=True)
def test_should_return_highest_priority_active_provider(notify_db, notify_db_session):
    providers = provider_details_dao.get_provider_details_by_notification_type('sms')

    first = providers[0]
    second = providers[1]

    assert send_to_providers.provider_to_use('sms', '1234').name == first.identifier

    first.priority = 20
    second.priority = 10

    provider_details_dao.dao_update_provider_details(first)
    provider_details_dao.dao_update_provider_details(second)

    assert send_to_providers.provider_to_use('sms', '1234').name == second.identifier

    first.priority = 10
    first.active = False
    second.priority = 20

    provider_details_dao.dao_update_provider_details(first)
    provider_details_dao.dao_update_provider_details(second)

    assert send_to_providers.provider_to_use('sms', '1234').name == second.identifier

    first.active = True
    provider_details_dao.dao_update_provider_details(first)

    assert send_to_providers.provider_to_use('sms', '1234').name == first.identifier
def test_should_return_highest_priority_active_provider(restore_provider_details):
    providers = provider_details_dao.get_provider_details_by_notification_type('sms')

    first = providers[0]
    second = providers[1]

    assert send_to_providers.provider_to_use('sms', '1234').name == first.identifier

    first.priority, second.priority = second.priority, first.priority

    provider_details_dao.dao_update_provider_details(first)
    provider_details_dao.dao_update_provider_details(second)

    assert send_to_providers.provider_to_use('sms', '1234').name == second.identifier

    first.priority, second.priority = second.priority, first.priority
    first.active = False

    provider_details_dao.dao_update_provider_details(first)
    provider_details_dao.dao_update_provider_details(second)

    assert send_to_providers.provider_to_use('sms', '1234').name == second.identifier

    first.active = True
    provider_details_dao.dao_update_provider_details(first)

    assert send_to_providers.provider_to_use('sms', '1234').name == first.identifier
def test_should_return_highest_priority_active_provider(restore_provider_details):
    providers = provider_details_dao.get_provider_details_by_notification_type("sms")
    providers = [provider for provider in providers if provider.active]

    first = providers[0]
    second = providers[1]

    assert send_to_providers.provider_to_use("sms", "1234").name == first.identifier

    first.priority = 12
    second.priority = 10

    provider_details_dao.dao_update_provider_details(first)
    provider_details_dao.dao_update_provider_details(second)

    assert send_to_providers.provider_to_use("sms", "1234").name == second.identifier

    first.priority = 10
    first.active = False
    second.priority = 12

    provider_details_dao.dao_update_provider_details(first)
    provider_details_dao.dao_update_provider_details(second)

    assert send_to_providers.provider_to_use("sms", "1234").name == second.identifier

    first.active = True
    provider_details_dao.dao_update_provider_details(first)

    assert send_to_providers.provider_to_use("sms", "1234").name == first.identifier
def test_provider_to_use_raises_if_no_active_providers(
        mocker, restore_provider_details):
    mmg = get_provider_details_by_identifier('mmg')
    mmg.active = False

    with pytest.raises(Exception):
        send_to_providers.provider_to_use('sms', international=True)
Example #6
0
def test_should_not_use_active_but_disabled_provider(mocker):
    active_provider = mocker.Mock(active=True)
    mocker.patch(
        'app.delivery.send_to_providers.get_provider_details_by_notification_type',
        return_value=[active_provider])

    mocker.patch('app.delivery.send_to_providers.is_provider_enabled',
                 return_value=False)

    with pytest.raises(Exception, match="No active email providers"):
        send_to_providers.provider_to_use('email', '1234')
def test_provider_to_use(restore_provider_details):
    providers = provider_details_dao.get_provider_details_by_notification_type("sms")
    first = providers[0]

    assert first.identifier == "sns"

    # provider is still SNS if SMS and sender is set
    provider = send_to_providers.provider_to_use("sms", "1234", False, "+12345678901")
    assert first.identifier == provider.name

    # provider is highest priority sms provider if sender is not set
    provider = send_to_providers.provider_to_use("sms", "1234", False)
    assert first.identifier == provider.name
Example #8
0
def test_provider_to_use(restore_provider_details):
    providers = provider_details_dao.get_provider_details_by_notification_type(
        'sms')
    first = providers[0]

    # provider is pinpoint if sms and sender is set
    provider = send_to_providers.provider_to_use('sms', '1234', False,
                                                 '+12345678901')
    assert "pinpoint" == provider.name

    # provider is highest priority sms provider if sender is not set
    provider = send_to_providers.provider_to_use('sms', '1234', False)
    assert first.identifier == provider.name
def test_provider_to_use_should_return_template_provider(fake_uuid, mocker):
    mocker.patch.dict(os.environ, {'TEMPLATE_SERVICE_PROVIDERS_ENABLED': 'True'})
    client_name = 'template-client'
    mocked_client = mocker.Mock(EmailClient)
    mocker.patch.object(mocked_client, 'get_name', return_value=client_name)

    mocked_template_provider_details = mocker.Mock(ProviderDetails)
    mocked_template_provider_details.active = True
    mocked_template_provider_details.notification_type = EMAIL_TYPE
    mocked_template_provider_details.id = fake_uuid
    mocked_template_provider_details.identifier = client_name

    mocked_notification = mocker.Mock(Notification)

    mocked_template = mocker.Mock(TemplateBase)
    mocked_template.provider_id = fake_uuid
    mocked_notification.template = mocked_template

    mocker.patch(
        'app.delivery.send_to_providers.get_provider_details_by_id',
        return_value=mocked_template_provider_details
    )
    mocked_get_client_by_name_and_type = mocker.patch(
        'app.delivery.send_to_providers.clients.get_client_by_name_and_type',
        return_value=mocked_client
    )

    client = send_to_providers.provider_to_use(EMAIL_TYPE, mocked_notification)

    mocked_get_client_by_name_and_type.assert_called_once_with(client_name, EMAIL_TYPE)

    assert client.get_name() == client_name
Example #10
0
def test_provider_to_use_should_only_return_mmg_for_international(mocker, notify_db_session):
    mmg = get_provider_details_by_identifier('mmg')
    mock_choices = mocker.patch('app.delivery.send_to_providers.random.choices', return_value=[mmg])

    ret = send_to_providers.provider_to_use('sms', international=True)

    mock_choices.assert_called_once_with([mmg], weights=[100])
    assert ret.get_name() == 'mmg'
Example #11
0
def test_provider_to_use_should_only_return_active_providers(mocker, restore_provider_details):
    mmg = get_provider_details_by_identifier('mmg')
    firetext = get_provider_details_by_identifier('firetext')
    mmg.active = False
    mock_choices = mocker.patch('app.delivery.send_to_providers.random.choices', return_value=[firetext])

    ret = send_to_providers.provider_to_use('sms')

    mock_choices.assert_called_once_with([firetext], weights=[0])
    assert ret.get_name() == 'firetext'
def test_provider_to_use_should_use_template_provider_and_raise_exception(mocker):
    mocker.patch.dict(os.environ, {'TEMPLATE_SERVICE_PROVIDERS_ENABLED': 'True'})
    template_provider_id = uuid.uuid4()
    mocked_template_provider_details = mocker.Mock(ProviderDetails)
    mocked_template_provider_details.active = False
    mocked_template_provider_details.notification_type = EMAIL_TYPE
    mocked_template_provider_details.id = template_provider_id

    mocked_notification = mocker.Mock(Notification)

    mocked_template = mocker.Mock(TemplateBase)
    mocked_template.provider_id = template_provider_id
    mocked_notification.template = mocked_template

    service_email_provider_id = uuid.uuid4()
    mocked_service = mocker.Mock(Service)
    mocked_service.email_provider_id = service_email_provider_id
    mocked_notification.service = mocked_service
    mocked_service_provider_details = mocker.Mock(ProviderDetails)
    mocked_service_provider_details.active = True
    mocked_service_provider_details.notification_type = EMAIL_TYPE
    mocked_service_provider_details.id = service_email_provider_id

    def return_provider(provider_details_id):
        if provider_details_id == template_provider_id:
            return mocked_template_provider_details
        elif provider_details_id == service_email_provider_id:
            return mocked_service_provider_details

    mocker.patch(
        'app.delivery.send_to_providers.get_provider_details_by_id',
        return_value=mocked_template_provider_details,
        side_effect=return_provider
    )

    mocked_get_client_by_name_and_type = mocker.patch(
        'app.delivery.send_to_providers.clients.get_client_by_name_and_type'
    )

    with pytest.raises(InvalidProviderException, match=f'^provider {str(template_provider_id)} is not active$'):
        send_to_providers.provider_to_use(EMAIL_TYPE, mocked_notification)

    mocked_get_client_by_name_and_type.assert_not_called()
Example #13
0
def test_provider_to_use_should_only_return_twilio_for_international(
        mocker, notify_db_session, twilio_provider):
    mock_choices = mocker.patch(
        'app.delivery.send_to_providers.random.choices',
        return_value=[twilio_provider])

    ret = send_to_providers.provider_to_use('sms', international=True)

    mock_choices.assert_called_once_with([twilio_provider], weights=[10])
    assert ret.get_name() == 'twilio'
Example #14
0
def test_provider_to_use_should_return_random_provider(mocker, notify_db_session):
    mmg = get_provider_details_by_identifier('mmg')
    firetext = get_provider_details_by_identifier('firetext')
    mmg.priority = 25
    firetext.priority = 75
    mock_choices = mocker.patch('app.delivery.send_to_providers.random.choices', return_value=[mmg])

    ret = send_to_providers.provider_to_use('sms', international=False)

    mock_choices.assert_called_once_with([mmg, firetext], weights=[25, 75])
    assert ret.get_name() == 'mmg'
Example #15
0
def test_provider_to_use_should_only_return_active_providers(
        mocker, notify_db_session, twilio_provider, firetext_provider):
    firetext_provider.active = False
    mock_choices = mocker.patch(
        'app.delivery.send_to_providers.random.choices',
        return_value=[twilio_provider])

    ret = send_to_providers.provider_to_use('sms')

    mock_choices.assert_called_once_with([twilio_provider], weights=[10])
    assert ret.get_name() == 'twilio'
def test_provider_to_use_should_cache_repeated_calls(mocker, notify_db_session):
    mock_choices = mocker.patch(
        'app.delivery.send_to_providers.random.choices',
        wraps=send_to_providers.random.choices,
    )

    results = [
        send_to_providers.provider_to_use('sms', international=False)
        for _ in range(10)
    ]

    assert all(result == results[0] for result in results)
    assert len(mock_choices.call_args_list) == 1
def test_provider_to_use_should_return_template_provider_if_valid_template_and_service_providers(mocker):
    mocker.patch.dict(os.environ, {'TEMPLATE_SERVICE_PROVIDERS_ENABLED': 'True'})
    client_name = 'template-client'
    mocked_client = mocker.Mock(EmailClient)
    mocker.patch.object(mocked_client, 'get_name', return_value=client_name)

    template_provider_id = uuid.uuid4()
    mocked_template_provider_details = mocker.Mock(ProviderDetails)
    mocked_template_provider_details.active = True
    mocked_template_provider_details.notification_type = EMAIL_TYPE
    mocked_template_provider_details.id = template_provider_id
    mocked_template_provider_details.identifier = client_name

    mocked_notification = mocker.Mock(Notification)

    mocked_template = mocker.Mock(TemplateBase)
    mocked_template.provider_id = template_provider_id
    mocked_notification.template = mocked_template

    service_email_provider_id = uuid.uuid4()
    mocked_service = mocker.Mock(Service)
    mocked_service.email_provider_id = service_email_provider_id
    mocked_notification.service = mocked_service
    mocked_service_provider_details = mocker.Mock(ProviderDetails)
    mocked_service_provider_details.active = True
    mocked_service_provider_details.notification_type = EMAIL_TYPE
    mocked_service_provider_details.id = service_email_provider_id
    mocked_service_provider_details.identifier = None

    def return_provider(provider_details_id):
        if provider_details_id == template_provider_id:
            return mocked_template_provider_details
        elif provider_details_id == service_email_provider_id:
            return mocked_service_provider_details

    mocker.patch(
        'app.delivery.send_to_providers.get_provider_details_by_id',
        return_value=mocked_template_provider_details,
        side_effect=return_provider
    )

    mocked_get_client_by_name_and_type = mocker.patch(
        'app.delivery.send_to_providers.clients.get_client_by_name_and_type',
        return_value=mocked_client
    )

    client = send_to_providers.provider_to_use(EMAIL_TYPE, mocked_notification)

    mocked_get_client_by_name_and_type.assert_called_once_with(client_name, EMAIL_TYPE)

    assert client.get_name() == client_name
def test_template_or_service_provider_is_not_used_when_feature_flag_is_off(mocker, fake_uuid):
    mocker.patch.dict(os.environ, {'TEMPLATE_SERVICE_PROVIDERS_ENABLED': 'False'})
    mocked_client = mocker.Mock(EmailClient)

    mocker.patch(
        'app.delivery.send_to_providers.clients.get_client_by_name_and_type',
        return_value=mocked_client
    )

    mock_load_provider = mocker.patch(
        'app.delivery.send_to_providers.load_provider'
    )

    active_provider = mocker.Mock(active=True)
    mocker.patch(
        'app.delivery.send_to_providers.get_provider_details_by_notification_type',
        return_value=[active_provider]
    )

    mocked_notification = mocker.Mock(Notification)
    send_to_providers.provider_to_use(EMAIL_TYPE, mocked_notification)

    mock_load_provider.assert_not_called()
Example #19
0
def test_provider_to_use_should_return_random_provider(mocker,
                                                       notify_db_session,
                                                       twilio_provider,
                                                       firetext_provider):
    twilio_provider.priority = 25
    firetext_provider.priority = 75
    mock_choices = mocker.patch(
        'app.delivery.send_to_providers.random.choices',
        return_value=[twilio_provider])

    ret = send_to_providers.provider_to_use('sms', international=False)

    mock_choices.assert_called_once_with([twilio_provider, firetext_provider],
                                         weights=[25, 75])
    assert ret.get_name() == 'twilio'