"""Tests for status module.""" import datetime import json from unittest.mock import patch import botocore import pytest from lambdacommon import common_config from lambdacommon import lambda_exceptions from lambdacommon import status general_statuses = [ ( 'some_function', 'success_status', 'filename.ext', 'test-bucket', None, { 'function': 'some_function', 'status': 'success_status', 'filename': 'filename.ext', 'bucket': 'test-bucket' } ), ( 'function', 'error_status', 'filename.ext', 'test-bucket', {'s3_metadata_missing': 'metadata not set'}, { 'function': 'function', 'status': 'error_status', 'filename': 'filename.ext', 'bucket': 'test-bucket', 'errors': {'s3_metadata_missing': 'metadata not set'} } ), ] final_statuses = [ ( 'success_status', 'filename.ext', 'test_bucket', None, [ { 'key': 'key.ext', 'bucket': 'test_bucket' } ], { 'status': 'success_status', 'final_assets': [ { 'key': 'key.ext', 'bucket': 'test_bucket' } ], 'input': { 'bucket': 'test_bucket', 'key': 'filename.ext' } } ), ( 'error_status', 'key.ext', 'test_bucket', {'audio_waveform_error': 'error generating waveform'}, None, { 'status': 'error_status', 'errors': {'audio_waveform_error': 'error generating waveform'}, 'input': { 'bucket': 'test_bucket', 'key': 'key.ext' } } ) ] @patch('lambdacommon.status.send_notification') @pytest.mark.parametrize('function,status_name,filename, bucket, errors, expected_message', general_statuses) def test_send_general_status( send_notification, function, status_name, filename, bucket, errors, expected_message): """Test sending general status.""" status.send_general_status(function, status_name, filename, bucket, errors) send_notification.assert_called_once() call_args = send_notification.call_args[0][1] status_time = call_args.pop('status_time') assert call_args == expected_message assert datetime.datetime.strptime(status_time, '%Y-%m-%dT%H:%M:%S.%fZ') @patch('lambdacommon.status.send_notification') @pytest.mark.parametrize('status_name, filename, bucket, errors, final_assets, expected_message', final_statuses) def test_send_encoding_status( send_notification, status_name, filename, bucket, errors, final_assets, expected_message): """Test sending encoding status.""" status.send_encoding_status(status_name, filename, bucket, errors, final_assets) send_notification.assert_called_once_with(common_config.SNS_ENCODING_STATUS_TOPIC_ARN, expected_message) @patch('lambdacommon.status.client') def test_send_notification_success(client_mock): """Test send_notification function success.""" expected_topic = 'topic' expected_message = { 'foo': 'bar' } status.send_notification(expected_topic, expected_message) client_mock.publish.assert_called_once_with( TopicArn=expected_topic, Message=json.dumps(expected_message) ) @patch('lambdacommon.status.client') def test_send_notification_error(client_mock): """Test send_notification function throws S3Error.""" expected_topic = 'topic' expected_message = { 'foo': 'bar' } error = { 'Error': { 'Code': 'InvalidClientTokenId', 'Message': 'The security token included in the request is invalid.' }, 'ResponseMetadata': {'HTTPStatusCode': 403} } client_mock.publish.side_effect = botocore.exceptions.ClientError(error, 'Publish') with pytest.raises(lambda_exceptions.S3Error) as err: status.send_notification(expected_topic, expected_message) assert err.value.error_code == 's3_error' assert str(err.value) == ('S3 Error 403 An error occurred (InvalidClientTokenId) when calling the ' 'Publish operation: The security token included in the request is invalid.')