celery test cleanup

* Alter config so an error will be raised if you forget to mock out a
  celery call in one of your tests
* Remove an unneeded exception type that was masking errors
This commit is contained in:
Leo Hemsted
2017-06-19 14:58:38 +01:00
parent 88a479a4bb
commit ac7665bfc6
8 changed files with 16 additions and 33 deletions

View File

@@ -297,6 +297,8 @@ class Test(Config):
STATSD_HOST = "localhost" STATSD_HOST = "localhost"
STATSD_PORT = 1000 STATSD_PORT = 1000
BROKER_URL = 'you-forgot-to-mock-celery-in-your-tests://'
for queue in QueueNames.all_queues(): for queue in QueueNames.all_queues():
Config.CELERY_QUEUES.append( Config.CELERY_QUEUES.append(
Queue(queue, Exchange('default'), routing_key=queue) Queue(queue, Exchange('default'), routing_key=queue)

View File

@@ -7,7 +7,6 @@ from sqlalchemy.orm.exc import NoResultFound
from marshmallow import ValidationError from marshmallow import ValidationError
from jsonschema import ValidationError as JsonSchemaValidationError from jsonschema import ValidationError as JsonSchemaValidationError
from app.authentication.auth import AuthError from app.authentication.auth import AuthError
from app.notifications import SendNotificationToQueueError
class InvalidRequest(Exception): class InvalidRequest(Exception):
@@ -90,11 +89,6 @@ def register_errors(blueprint):
current_app.logger.exception(e) current_app.logger.exception(e)
return jsonify(result='error', message="No result found"), 404 return jsonify(result='error', message="No result found"), 404
@blueprint.errorhandler(SendNotificationToQueueError)
def failed_to_create_notification(e):
current_app.logger.exception(e)
return jsonify(result='error', message=e.message), 500
@blueprint.errorhandler(SQLAlchemyError) @blueprint.errorhandler(SQLAlchemyError)
def db_error(e): def db_error(e):
current_app.logger.exception(e) current_app.logger.exception(e)

View File

@@ -1,7 +0,0 @@
class SendNotificationToQueueError(Exception):
status_code = 500
def __init__(self):
self.message = "Failed to create the notification"

View File

@@ -17,7 +17,7 @@ from app.models import SMS_TYPE, Notification, KEY_TYPE_TEST, EMAIL_TYPE, Schedu
from app.dao.notifications_dao import (dao_create_notification, from app.dao.notifications_dao import (dao_create_notification,
dao_delete_notifications_and_history_by_id, dao_delete_notifications_and_history_by_id,
dao_created_scheduled_notification) dao_created_scheduled_notification)
from app.v2.errors import BadRequestError, SendNotificationToQueueError from app.v2.errors import BadRequestError
from app.utils import get_template_instance, cache_key_for_service_template_counter, convert_bst_to_utc from app.utils import get_template_instance, cache_key_for_service_template_counter, convert_bst_to_utc
@@ -110,10 +110,9 @@ def send_notification_to_queue(notification, research_mode, queue=None):
try: try:
deliver_task.apply_async([str(notification.id)], queue=queue) deliver_task.apply_async([str(notification.id)], queue=queue)
except Exception as e: except Exception:
current_app.logger.exception(e)
dao_delete_notifications_and_history_by_id(notification.id) dao_delete_notifications_and_history_by_id(notification.id)
raise SendNotificationToQueueError() raise
current_app.logger.info( current_app.logger.info(
"{} {} sent to the {} queue for delivery".format(notification.notification_type, "{} {} sent to the {} queue for delivery".format(notification.notification_type,

View File

@@ -5,7 +5,6 @@ from sqlalchemy.exc import DataError
from sqlalchemy.orm.exc import NoResultFound from sqlalchemy.orm.exc import NoResultFound
from app.authentication.auth import AuthError from app.authentication.auth import AuthError
from app.errors import InvalidRequest from app.errors import InvalidRequest
from app.notifications import SendNotificationToQueueError
class TooManyRequestsError(InvalidRequest): class TooManyRequestsError(InvalidRequest):
@@ -61,13 +60,6 @@ def register_errors(blueprint):
def auth_error(error): def auth_error(error):
return jsonify(error.to_dict_v2()), error.code return jsonify(error.to_dict_v2()), error.code
@blueprint.errorhandler(SendNotificationToQueueError)
def failed_to_create_notification(error):
current_app.logger.exception(error)
return jsonify(
status_code=500,
errors=[{"error": error.__class__.__name__, "message": error.message}]), 500
@blueprint.errorhandler(Exception) @blueprint.errorhandler(Exception)
def internal_server_error(error): def internal_server_error(error):
current_app.logger.exception(error) current_app.logger.exception(error)

View File

@@ -755,13 +755,15 @@ def test_should_delete_notification_and_return_error_if_sqs_fails(
save_model_api_key(api_key) save_model_api_key(api_key)
auth_header = create_jwt_token(secret=api_key.secret, client_id=str(api_key.service_id)) auth_header = create_jwt_token(secret=api_key.secret, client_id=str(api_key.service_id))
response = client.post( with pytest.raises(Exception) as e:
path='/notifications/{}'.format(template_type), client.post(
data=json.dumps(data), path='/notifications/{}'.format(template_type),
headers=[('Content-Type', 'application/json'), ('Authorization', 'Bearer {}'.format(auth_header))]) data=json.dumps(data),
headers=[('Content-Type', 'application/json'), ('Authorization', 'Bearer {}'.format(auth_header))]
)
assert str(e.value) == 'failed to talk to SQS'
mocked.assert_called_once_with([fake_uuid], queue='send-tasks') mocked.assert_called_once_with([fake_uuid], queue='send-tasks')
assert response.status_code == 500
assert not notifications_dao.get_notification_by_id(fake_uuid) assert not notifications_dao.get_notification_by_id(fake_uuid)
assert not NotificationHistory.query.get(fake_uuid) assert not NotificationHistory.query.get(fake_uuid)

View File

@@ -8,7 +8,6 @@ from freezegun import freeze_time
from collections import namedtuple from collections import namedtuple
from app.models import Template, Notification, NotificationHistory, ScheduledNotification from app.models import Template, Notification, NotificationHistory, ScheduledNotification
from app.notifications import SendNotificationToQueueError
from app.notifications.process_notifications import ( from app.notifications.process_notifications import (
create_content_for_notification, create_content_for_notification,
persist_notification, persist_notification,
@@ -238,7 +237,7 @@ def test_send_notification_to_queue(notify_db, notify_db_session,
def test_send_notification_to_queue_throws_exception_deletes_notification(sample_notification, mocker): def test_send_notification_to_queue_throws_exception_deletes_notification(sample_notification, mocker):
mocked = mocker.patch('app.celery.provider_tasks.deliver_sms.apply_async', side_effect=Boto3Error("EXPECTED")) mocked = mocker.patch('app.celery.provider_tasks.deliver_sms.apply_async', side_effect=Boto3Error("EXPECTED"))
with pytest.raises(SendNotificationToQueueError): with pytest.raises(Boto3Error):
send_notification_to_queue(sample_notification, False) send_notification_to_queue(sample_notification, False)
mocked.assert_called_once_with([(str(sample_notification.id))], queue='send-sms') mocked.assert_called_once_with([(str(sample_notification.id))], queue='send-sms')

View File

@@ -2247,7 +2247,9 @@ def test_fetch_service_inbound_api(client, sample_service):
assert json.loads(response.get_data(as_text=True))["data"] == service_inbound_api.serialize() assert json.loads(response.get_data(as_text=True))["data"] == service_inbound_api.serialize()
def test_send_one_off_notification(admin_request, sample_template): def test_send_one_off_notification(admin_request, sample_template, mocker):
mocker.patch('app.service.send_notification.send_notification_to_queue')
response = admin_request.post( response = admin_request.post(
'service.create_one_off_notification', 'service.create_one_off_notification',
service_id=sample_template.service_id, service_id=sample_template.service_id,