"""Unit tests for GfK lambda.""" import csv from unittest.mock import ANY from unittest.mock import call from unittest.mock import MagicMock from unittest.mock import patch import boto3 import pysftp from secrets_manager.python_ext import PythonSecretsManager from src import app as index def test__send_sns(monkeypatch): """Test _send_sns util function.""" boto3_mock = MagicMock() monkeypatch.setattr(index, 'boto3', boto3_mock) index._send_sns() assert boto3_mock.client.call_count == 1 @patch('builtins.open') def test__upload_to_ftp(open_mock, monkeypatch): """Test _upload_to_ftp util function.""" monkeypatch.setattr( index, 'FTP_CREDENTIALS', {'host': 'testhost', 'remote_ftp_dir': 'testdir'}) cnopts_mock, sftp_mock = MagicMock(), MagicMock() monkeypatch.setattr(pysftp, 'CnOpts', cnopts_mock) monkeypatch.setattr(pysftp, 'Connection', sftp_mock) get_secret_mock = MagicMock() get_secret_mock.return_value = 'test_cred' monkeypatch.setattr(PythonSecretsManager, 'get_cred', get_secret_mock) tmpfile_mock = MagicMock() index._upload_to_ftp(tmpfile_mock) cnopts_mock.assert_called() assert 'cnopts' in sftp_mock.call_args_list[0].kwargs assert list(sftp_mock.call_args_list[0].kwargs.values()).\ count('test_cred') == 2 @patch('builtins.open') def test_handler(open_mock, monkeypatch): """Test main handler function.""" get_secret_mock = MagicMock() get_secret_mock.return_value = None monkeypatch.setattr(PythonSecretsManager, 'get_cred', get_secret_mock) sftp_mock = MagicMock() monkeypatch.setattr(pysftp, 'Connection', sftp_mock) resource_mock = MagicMock() s3_mock = MagicMock(return_value=resource_mock) monkeypatch.setattr(boto3, 'resource', s3_mock) bucket_mock = MagicMock() resource_mock.Bucket = bucket_mock csv_reader_mock = MagicMock() monkeypatch.setattr(csv, 'reader', csv_reader_mock) _upload_to_ftp_mock = MagicMock() monkeypatch.setattr(index, '_upload_to_ftp', _upload_to_ftp_mock) event = { 'detail': { 'bucket': {'name': 'foo'}, 'object': {'key': 'looker/some+file.csv'} } } index.handler(event, {}) open_mock.assert_called_with('/tmp/some file.csv') s3_mock.assert_called_with('s3') resource_mock.assert_has_calls([ call.Bucket('foo'), call.Bucket().download_file( 'looker/some file.csv', '/tmp/some file.csv') ]) assert csv_reader_mock.call_count == 1 _upload_to_ftp_mock.assert_called_with(ANY)