"""Snapshot exchange rates processor unit tests.""" from unittest.mock import MagicMock, patch from snapshot_exchange_rates import constants from snapshot_exchange_rates.processor import SnapshotExchangeRatesProcessor @patch('snapshot_exchange_rates.processor.app_logger') @patch('snapshot_exchange_rates.processor.get_exchange_rates_by_period_id') def test_get_exchange_rates( mock_get_exchange_rates_by_period_id, mock_logger, mock_exchange_rates, mock_event ): """Test to get exchange rates by accounting period id.""" acct_period_id = 1021 mock_get_exchange_rates_by_period_id.return_value = mock_exchange_rates processor = SnapshotExchangeRatesProcessor(mock_event) processor.accounting_run = { 'accounting_period_id': acct_period_id } res = processor._get_exchange_rates() assert res == mock_exchange_rates mock_get_exchange_rates_by_period_id.assert_called_once_with(acct_period_id) assert mock_logger.info.call_count == 2 @patch('snapshot_exchange_rates.processor.app_logger') def test_log_init(mock_logger, mock_event): """Test log init is called when processor is initialized.""" SnapshotExchangeRatesProcessor(mock_event) target_id = mock_event['target_id'] mock_logger.info.assert_called_once_with(constants.PROCESSOR_MSG.format(target_id)) @patch('snapshot_exchange_rates.processor.app_logger') def test_log_success(mock_logger, mock_event): """Test processor logs a success message.""" processor = SnapshotExchangeRatesProcessor(mock_event) processor._log_success() assert mock_logger.info.call_count == 2 mock_logger.info.assert_called_with(constants.SUCCESS_MSG) @patch('snapshot_exchange_rates.processor.build_snapshot_path') def test_set_s3_path(mock_build_path, mock_event): """Test setting s3 path based on event's accounting_period.""" accounting_period_id = 1021 accounting_run = { 'run_controller_name': 'Jen Priority', 'accounting_period_name': 'January 2020', 'accounting_run_id': 1337, 'accounting_period_id': accounting_period_id, } s3_path = f's3://test-bucket/{accounting_period_id}-january-2020/' \ f'{1337}-jen-priority/snapshots' mock_build_path.return_value = s3_path processor = SnapshotExchangeRatesProcessor(mock_event) processor.accounting_run = accounting_run processor._set_s3_path() assert processor.s3_path == s3_path mock_build_path.assert_called_once_with(accounting_run) @patch('snapshot_exchange_rates.processor.app_logger') @patch('snapshot_exchange_rates.processor.awswrangler') def test_write_to_s3(mock_awswrangler, mock_logger, mock_event, mock_exchange_rates): # noqa E501 """Test processor writes exchange rates data to s3 as parquet file.""" mock_awswrangler.s3.to_parquet.return_value = {'paths': ['s3_path']} processor = SnapshotExchangeRatesProcessor(mock_event) processor._write_to_s3(mock_exchange_rates) assert mock_logger.info.call_count == 2 mock_awswrangler.s3.to_parquet.assert_called_once() @patch('snapshot_exchange_rates.processor.app_logger') def test_adjust_exchange_rates(mock_logger, mock_exchange_rates, mock_event): """Test processor's _adjust_exchange_rates method.""" processor = SnapshotExchangeRatesProcessor(mock_event) adjusted_rates = processor._adjust_exchange_rates(mock_exchange_rates) assert adjusted_rates == [ { 'exchange_rate_id': 1, 'exchange_from_currency_id': 784, 'exchange_to_currency_id': 36, 'exchange_rate': '0.393521' }, { 'exchange_rate_id': 2, 'exchange_from_currency_id': 784, 'exchange_to_currency_id': 124, 'exchange_rate': '0.356372' }, { 'exchange_rate_id': 3, 'exchange_from_currency_id': 784, 'exchange_to_currency_id': 208, 'exchange_rate': '1.826553' } ] @patch('snapshot_exchange_rates.processor.get_accounting_run') def test_set_accounting_run(get_run_mock, mock_event): # noqa E501 """Test processor sets accounting run property.""" account_run = { 'run_controller_name': 'Jen Priority', 'start_date': '2020-05-27', 'accounting_period_name': 'January 2020', 'accounting_run_id': 1337, 'accounting_period_id': 1021, 'payee_count': 21, 'accounting_run_status': 'Committed', 'run_controller_id': 2722, 'summary_export_url': 's3://qa-royalties-sales-files/summary.tsv' } get_run_mock.return_value = account_run processor = SnapshotExchangeRatesProcessor(mock_event) processor._set_accounting_run() get_run_mock.assert_called_once_with(1021) assert processor.accounting_run == account_run def test_process(mock_exchange_rates, mock_event,): """Test SnapshotExchangeRatesProcessor's main processor method.""" SnapshotExchangeRatesProcessor._get_exchange_rates = \ MagicMock(return_value=mock_exchange_rates) SnapshotExchangeRatesProcessor._log_init = MagicMock() SnapshotExchangeRatesProcessor._log_success = MagicMock() SnapshotExchangeRatesProcessor._set_s3_path = MagicMock() SnapshotExchangeRatesProcessor._set_accounting_run = MagicMock() SnapshotExchangeRatesProcessor._write_to_s3 = MagicMock() SnapshotExchangeRatesProcessor._adjust_exchange_rates = MagicMock( return_value=mock_exchange_rates ) processor = SnapshotExchangeRatesProcessor(mock_event) processor.process() assert processor.event == mock_event SnapshotExchangeRatesProcessor._log_init.assert_called_once() SnapshotExchangeRatesProcessor._set_s3_path.assert_called_once() SnapshotExchangeRatesProcessor._get_exchange_rates.assert_called_once() SnapshotExchangeRatesProcessor._write_to_s3.assert_called_once_with( mock_exchange_rates ) SnapshotExchangeRatesProcessor._log_success.assert_called_once() SnapshotExchangeRatesProcessor._set_accounting_run.assert_called_once()