"""Lambda test module.""" import unittest from unittest.mock import Mock from unittest.mock import patch from freezegun import freeze_time import pytest from src import index dms_delivery_spec = { 'max_num_batches': 3, 'num_per_batch': 100, 'remote_initial_dir': '/', 'batch_foldername': 'batch_foldername', 'manifest_filename': '{batch_foldername}/manifest.txt', 'delivery_complete_file': '{batch_foldername}/delivery.complete_file', 'manifest_format': 'manifest_format', 'private_key_file': 'id_rsa', 'domain_name': 'domain_name', 'user_name': 'user_name', 'password': 'password', 'port': 22, 'connection_type': 'sftp', 'authenticate_type': 'public_key' } class CreateBatchIndexTest(unittest.TestCase): """CreateBatchIndexTest class.""" @patch('src.index.queries.get_dms_delivery_spec') @patch('src.index.queries.create_delivery_batch') @patch('src.index.queries.get_open_batch_count') @patch('src.index.publish_datadog_metric') @patch('src.index.queries.get_encoded_jobs_info') @patch('src.index.write_file_to_disk') def test_handler( self, mock_write_file_to_disk, mock_get_encoded_jobs, mock_datadog, mock_open_batch_count, mock_create_delivery_batch, mock_query_delivery_spec): """Test the main handler.""" mock_get_encoded_jobs.return_value = { 'dms_master_master_id': 1, 'encoded_jobs': 500, 'highest_priority': 3 } mock_open_batch_count.return_value = { 'open_batches': 5, 'highest_priority': 3 } mock_query_delivery_spec.return_value = dms_delivery_spec class LambdaContext: aws_request_id = '1234-1234' index.handler({ 'dms_id': 1, 'batch_delivery': 'Y', 'order_type': 'release' }, LambdaContext) assert mock_datadog.call_count == 2 @patch('src.index.get_current_logger') def test_unexpected(self, mock_get_logger): """Test unexpected error handling.""" with pytest.raises(Exception): class LambdaContext: aws_request_id = '1234-1234' index.handler({}, LambdaContext) assert mock_get_logger.return_value.error.call_count == 1 @patch('src.index.queries.get_dms_delivery_spec') @patch('src.index.queries.set_job_for_delivery') @patch('src.index.publish_datadog_metric') @patch('src.index.queries.get_encoded_jobs_info') def test_handler_non_batch( self, mock_get_encoded_jobs, mock_datadog, mock_set_job_for_delivery, mock_query_delivery_spec): """Test the main handler.""" mock_get_encoded_jobs.return_value = { 'dms_master_master_id': 1, 'encoded_jobs': 500, 'highest_priority': 3 } mock_query_delivery_spec.return_value = dms_delivery_spec class LambdaContext: aws_request_id = '1234-1234' index.handler({ 'dms_id': 1, 'batch_delivery': 'N', 'order_type': 'release' }, LambdaContext) assert mock_datadog.call_count == 2 assert mock_set_job_for_delivery.call_count == 1 @freeze_time('2019-06-15 10:15:20') def test_create_remote_folder_return_folder_on_success(self): """Test create_remote_folder return folder on success.""" test_data = [ ( 'dir_{Year}_{year}_{month}_{day}_{hour}_{minute}_{second}_{unix_timestamp}', 'dir_2019_19_06_15_10_15_20_1560593720' ), ( 'dir_{Year}_{year}_{month}_{day}_{hour}_{minute}_{second}_{unix_timestamp}_{counter(2)}', 'dir_2019_19_06_15_10_15_20_1560593720_01' ) ] initial_dir = 'initial_dir' for template, output in test_data: transporter = Mock(**{'mkdir.return_value': True}) assert output == index.create_remote_folder(transporter, initial_dir, template) def test_create_remote_folder_recovers(self): """Test create_remote_folder recovers from failure.""" test_data = [ ('dir_{unix_timestamp}', 'dir_222'), ('dir_{counter(2)}', 'dir_02') ] initial_dir = 'initial_dir' for template, output in test_data: transporter = Mock() transporter.mkdir.side_effect = [False, True] with patch('time.sleep', return_value=None): with patch('time.time', side_effect=[111, 222]): assert output == index.create_remote_folder(transporter, initial_dir, template) assert transporter.mkdir.call_count == 2 def test_create_remote_folder_throws_value_error(self): """Test create_remote_folder throws value error.""" test_data = [ ('dir_{counter(2)}', 99), ('dir_{counter(3)}', 999), ('dir', 1) ] initial_dir = 'initial_dir' for batch_folder, call_count in test_data: transporter = Mock(**{'mkdir.return_value': False}) with patch('time.sleep', return_value=None): with self.assertRaises(ValueError): index.create_remote_folder(transporter, initial_dir, batch_folder) assert transporter.mkdir.call_count == call_count