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)
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
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
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'
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()
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'
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'
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()
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'