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