notifications from test api keys dont send for real - a la research_mode

also added a bunch more tests around api keys to help ensure we're behaving in at least a consistent way
This commit is contained in:
Leo Hemsted
2016-07-05 15:48:27 +01:00
parent eee98e3e52
commit 96513442fe
4 changed files with 111 additions and 24 deletions

View File

@@ -24,7 +24,7 @@ from notifications_utils.template import (
Template Template
) )
from app.models import SMS_TYPE, EMAIL_TYPE from app.models import SMS_TYPE, EMAIL_TYPE, KEY_TYPE_TEST
def retry_iteration_to_delay(retry=0): def retry_iteration_to_delay(retry=0):
@@ -65,7 +65,7 @@ def send_sms_to_provider(self, service_id, notification_id):
prefix=service.name prefix=service.name
) )
try: try:
if service.research_mode: if service.research_mode or notification.key_type == KEY_TYPE_TEST:
send_sms_response.apply_async( send_sms_response.apply_async(
(provider.get_name(), str(notification_id), notification.to), queue='research-mode' (provider.get_name(), str(notification_id), notification.to), queue='research-mode'
) )
@@ -134,7 +134,7 @@ def send_email_to_provider(self, service_id, notification_id):
values=notification.personalisation values=notification.personalisation
) )
if service.research_mode: if service.research_mode or notification.key_type == KEY_TYPE_TEST:
reference = str(create_uuid()) reference = str(create_uuid())
send_email_response.apply_async( send_email_response.apply_async(
(provider.get_name(), reference, notification.to), queue='research-mode' (provider.get_name(), reference, notification.to), queue='research-mode'

View File

@@ -1,6 +1,7 @@
import uuid import uuid
from datetime import datetime from datetime import datetime
import pytest
from celery.exceptions import MaxRetriesExceededError from celery.exceptions import MaxRetriesExceededError
from unittest.mock import ANY, call from unittest.mock import ANY, call
from notifications_utils.recipients import validate_phone_number, format_phone_number from notifications_utils.recipients import validate_phone_number, format_phone_number
@@ -16,7 +17,7 @@ from app.clients.sms import SmsClientException
from app.dao import notifications_dao, provider_details_dao from app.dao import notifications_dao, provider_details_dao
from app.dao import provider_statistics_dao from app.dao import provider_statistics_dao
from app.dao.provider_statistics_dao import get_provider_statistics from app.dao.provider_statistics_dao import get_provider_statistics
from app.models import Notification, NotificationStatistics, Job from app.models import Notification, NotificationStatistics, Job, KEY_TYPE_NORMAL, KEY_TYPE_TEST
from tests.app.conftest import sample_notification from tests.app.conftest import sample_notification
@@ -156,15 +157,22 @@ def test_send_sms_should_use_template_version_from_notification_not_latest(
assert not persisted_notification.personalisation assert not persisted_notification.personalisation
def test_should_call_send_sms_response_task_if_research_mode(notify_db, sample_service, sample_notification, mocker): @pytest.mark.parametrize('research_mode,key_type', [
(True, KEY_TYPE_NORMAL),
(False, KEY_TYPE_TEST)
])
def test_should_call_send_sms_response_task_if_research_mode(notify_db, sample_service, sample_notification, mocker,
research_mode, key_type):
mocker.patch('app.mmg_client.send_sms') mocker.patch('app.mmg_client.send_sms')
mocker.patch('app.mmg_client.get_name', return_value="mmg") mocker.patch('app.mmg_client.get_name', return_value="mmg")
mocker.patch('app.celery.research_mode_tasks.send_sms_response.apply_async') mocker.patch('app.celery.research_mode_tasks.send_sms_response.apply_async')
sample_service.research_mode = True if research_mode:
notify_db.session.add(sample_service) sample_service.research_mode = True
notify_db.session.commit() notify_db.session.add(sample_service)
notify_db.session.commit()
sample_notification.key_type = key_type
send_sms_to_provider( send_sms_to_provider(
sample_notification.service_id, sample_notification.service_id,
@@ -190,7 +198,6 @@ def test_should_update_provider_stats_on_success(notify_db, sample_service, samp
mocker.patch('app.mmg_client.send_sms') mocker.patch('app.mmg_client.send_sms')
mocker.patch('app.mmg_client.get_name', return_value="mmg") mocker.patch('app.mmg_client.get_name', return_value="mmg")
mocker.patch('app.celery.research_mode_tasks.send_sms_response.apply_async')
send_sms_to_provider( send_sms_to_provider(
sample_notification.service_id, sample_notification.service_id,
@@ -202,18 +209,23 @@ def test_should_update_provider_stats_on_success(notify_db, sample_service, samp
assert updated_provider_stats[0].unit_count == 1 assert updated_provider_stats[0].unit_count == 1
@pytest.mark.parametrize('research_mode,key_type', [
(True, KEY_TYPE_NORMAL),
(False, KEY_TYPE_TEST)
])
def test_not_should_update_provider_stats_on_success_in_research_mode(notify_db, sample_service, sample_notification, def test_not_should_update_provider_stats_on_success_in_research_mode(notify_db, sample_service, sample_notification,
mocker): mocker, research_mode, key_type):
provider_stats = provider_statistics_dao.get_provider_statistics(sample_service).all() provider_stats = provider_statistics_dao.get_provider_statistics(sample_service).all()
assert len(provider_stats) == 0 assert len(provider_stats) == 0
mocker.patch('app.mmg_client.send_sms') mocker.patch('app.mmg_client.send_sms')
mocker.patch('app.mmg_client.get_name', return_value="mmg") mocker.patch('app.mmg_client.get_name', return_value="mmg")
mocker.patch('app.celery.research_mode_tasks.send_sms_response.apply_async') mocker.patch('app.celery.research_mode_tasks.send_sms_response.apply_async')
if research_mode:
sample_service.research_mode = True sample_service.research_mode = True
notify_db.session.add(sample_service) notify_db.session.add(sample_service)
notify_db.session.commit() notify_db.session.commit()
sample_notification.key_type = key_type
send_sms_to_provider( send_sms_to_provider(
sample_notification.service_id, sample_notification.service_id,
@@ -248,7 +260,6 @@ def test_statsd_updates(notify_db, notify_db_session, sample_service, sample_not
mocker.patch('app.statsd_client.timing') mocker.patch('app.statsd_client.timing')
mocker.patch('app.mmg_client.send_sms') mocker.patch('app.mmg_client.send_sms')
mocker.patch('app.mmg_client.get_name', return_value="mmg") mocker.patch('app.mmg_client.get_name', return_value="mmg")
mocker.patch('app.celery.research_mode_tasks.send_sms_response.apply_async')
send_sms_to_provider( send_sms_to_provider(
sample_notification.service_id, sample_notification.service_id,
@@ -328,16 +339,23 @@ def test_should_send_sms_sender_from_service_if_present(
) )
@pytest.mark.parametrize('research_mode,key_type', [
(True, KEY_TYPE_NORMAL),
(False, KEY_TYPE_TEST)
])
def test_send_email_to_provider_should_call_research_mode_task_response_task_if_research_mode( def test_send_email_to_provider_should_call_research_mode_task_response_task_if_research_mode(
notify_db, notify_db,
notify_db_session, notify_db_session,
sample_service, sample_service,
sample_email_template, sample_email_template,
ses_provider, ses_provider,
mocker): mocker,
research_mode,
key_type):
notification = sample_notification(notify_db=notify_db, notify_db_session=notify_db_session, notification = sample_notification(notify_db=notify_db, notify_db_session=notify_db_session,
template=sample_email_template, template=sample_email_template,
to_field="john@smith.com" to_field="john@smith.com",
key_type=key_type
) )
reference = uuid.uuid4() reference = uuid.uuid4()
@@ -346,9 +364,10 @@ def test_send_email_to_provider_should_call_research_mode_task_response_task_if_
mocker.patch('app.aws_ses_client.get_name', return_value="ses") mocker.patch('app.aws_ses_client.get_name', return_value="ses")
mocker.patch('app.celery.research_mode_tasks.send_email_response.apply_async') mocker.patch('app.celery.research_mode_tasks.send_email_response.apply_async')
sample_service.research_mode = True if research_mode:
notify_db.session.add(sample_service) sample_service.research_mode = True
notify_db.session.commit() notify_db.session.add(sample_service)
notify_db.session.commit()
assert not get_provider_statistics( assert not get_provider_statistics(
sample_email_template.service, sample_email_template.service,
providers=[ses_provider.identifier]).first() providers=[ses_provider.identifier]).first()
@@ -447,3 +466,31 @@ def test_send_email_to_provider_should_not_send_to_provider_when_status_is_not_c
app.aws_ses_client.send_email.assert_not_called() app.aws_ses_client.send_email.assert_not_called()
app.celery.research_mode_tasks.send_email_response.apply_async.assert_not_called() app.celery.research_mode_tasks.send_email_response.apply_async.assert_not_called()
def test_send_email_should_use_service_reply_to_email(
notify_db, notify_db_session,
sample_service,
sample_email_template,
mocker):
mocker.patch('app.statsd_client.incr')
mocker.patch('app.statsd_client.timing')
mocker.patch('app.aws_ses_client.send_email', return_value='reference')
mocker.patch('app.aws_ses_client.get_name', return_value="ses")
db_notification = sample_notification(notify_db, notify_db_session, template=sample_email_template)
sample_service.reply_to_email_address = 'foo@bar.com'
send_email_to_provider(
db_notification.service_id,
db_notification.id,
)
aws_ses_client.send_email.assert_called_once_with(
ANY,
ANY,
ANY,
body=ANY,
html_body=ANY,
reply_to_address=sample_service.reply_to_email_address
)

View File

@@ -9,7 +9,7 @@ from notifications_python_client.authentication import create_jwt_token
import app import app
from app import encryption from app import encryption
from app.models import ApiKey, KEY_TYPE_TEAM from app.models import ApiKey, KEY_TYPE_TEAM, KEY_TYPE_TEST
from app.dao.templates_dao import dao_get_all_templates_for_service, dao_update_template from app.dao.templates_dao import dao_get_all_templates_for_service, dao_update_template
from app.dao.services_dao import dao_update_service from app.dao.services_dao import dao_update_service
from app.dao.api_key_dao import save_model_api_key from app.dao.api_key_dao import save_model_api_key

View File

@@ -89,12 +89,26 @@ def test_get_notifications_empty_result(notify_api, sample_api_key):
assert response.status_code == 404 assert response.status_code == 404
def test_get_real_notification_from_team_api_key_fails(notify_api, sample_notification): @pytest.mark.parametrize('api_key_type,notification_key_type', [
(KEY_TYPE_NORMAL, KEY_TYPE_TEAM),
(KEY_TYPE_NORMAL, KEY_TYPE_TEST),
(KEY_TYPE_TEST, KEY_TYPE_NORMAL),
(KEY_TYPE_TEST, KEY_TYPE_TEAM),
(KEY_TYPE_TEAM, KEY_TYPE_NORMAL),
(KEY_TYPE_TEAM, KEY_TYPE_TEST),
])
def test_get_notification_from_different_api_key_fails(
notify_api,
sample_notification,
api_key_type,
notification_key_type
):
with notify_api.test_request_context(), notify_api.test_client() as client: with notify_api.test_request_context(), notify_api.test_client() as client:
sample_notification.key_type = notification_key_type
api_key = ApiKey(service=sample_notification.service, api_key = ApiKey(service=sample_notification.service,
name='api_key', name='api_key',
created_by=sample_notification.service.created_by, created_by=sample_notification.service.created_by,
key_type=KEY_TYPE_TEAM) key_type=api_key_type)
save_model_api_key(api_key) save_model_api_key(api_key)
response = client.get( response = client.get(
@@ -161,6 +175,32 @@ def test_get_all_notifications(notify_api, sample_notification):
assert notifications['notifications'][0]['body'] == "This is a template" # sample_template.content assert notifications['notifications'][0]['body'] == "This is a template" # sample_template.content
def test_normal_api_key_returns_notifications_created_from_jobs_and_from_api(
notify_api,
notify_db,
notify_db_session,
sample_api_key,
sample_notification
):
with notify_api.test_request_context(), notify_api.test_client() as client:
api_notification = create_sample_notification(
notify_db,
notify_db_session,
api_key_id=sample_api_key.id
)
api_notification.job = None
response = client.get(
path='/notifications',
headers=_create_auth_header_from_key(sample_api_key))
assert response.status_code == 200
notifications = json.loads(response.get_data(as_text=True))['notifications']
assert len(notifications) == 2
assert set(x['id'] for x in notifications) == set([str(sample_notification.id), str(api_notification.id)])
@pytest.mark.parametrize('key_type', [KEY_TYPE_NORMAL, KEY_TYPE_TEAM, KEY_TYPE_TEST]) @pytest.mark.parametrize('key_type', [KEY_TYPE_NORMAL, KEY_TYPE_TEAM, KEY_TYPE_TEST])
def test_get_all_notifications_only_returns_notifications_of_matching_type( def test_get_all_notifications_only_returns_notifications_of_matching_type(
notify_api, notify_api,