"""Unit tests for snapshot_data_exchange_rates task.""" from unittest.mock import MagicMock, patch from lib.config import S3_SALES_BUCKET_NAME from lib.constants import DIRECTORY_MODULE_CALCULATE_TOTALS from lib.constants import FILE_NAME_EXCHANGE_RATES_PARQUET from tasks.accounting_run_calculate import snapshot_data_exchange_rates as task @patch( 'tasks.accounting_run_calculate.snapshot_data_exchange_rates._get_exchange_rates' ) @patch('tasks.accounting_run_calculate.snapshot_data_exchange_rates.helpers') @patch('tasks.accounting_run_calculate.snapshot_data_exchange_rates.aws') def test_snapshot_exchange_rates( mock_aws, mock_helpers, mock_get_exchange_rates, mock_accounting_run_calculate_dag_run ): """Test snapshot_exchange_rates.""" accounting_period = { 'accounting_period_id': 123, 'accounting_period_name': 'Period Name', 'statement_period_id': 123 } accounting_run = { 'accounting_run_id': 321, 'run_controller_name': 'AWAL GDA' } prefix = f's3://{S3_SALES_BUCKET_NAME}/123-period-name/321-awal-gda/snapshots' totals_dir = f'{prefix}/{DIRECTORY_MODULE_CALCULATE_TOTALS}' fx_rates_dir = f'{totals_dir}/{FILE_NAME_EXCHANGE_RATES_PARQUET}' mock_helpers.get_event_from_params.return_value = MagicMock(target_id=321) mock_helpers.get_event_records.return_value = accounting_period, accounting_run mock_helpers.build_snapshot_prefix_from_accounting_run.return_value = totals_dir mock_aws.location.return_value.url = fx_rates_dir formatted_fx_rates = [ { 'exchangeRateId': 1, 'exchangeFromCurrencyId': 840, 'exchangeToCurrencyId': 826, 'exchangeRate': '0.82' }, { 'exchangeRateId': 2, 'exchangeFromCurrencyId': 826, 'exchangeToCurrencyId': 840, 'exchangeRate': '1.23' } ] mock_get_exchange_rates.return_value = formatted_fx_rates with patch('pandas.DataFrame.to_parquet') as mock_to_parquet: task.snapshot_exchange_rates(mock_accounting_run_calculate_dag_run) mock_to_parquet.assert_called_with(fx_rates_dir, index=False) mock_helpers.get_event_from_params.assert_called_once_with( mock_accounting_run_calculate_dag_run ) mock_helpers.get_event_records.assert_called_once_with( accounting_run.get('accounting_run_id') ) mock_helpers.build_snapshot_prefix_from_accounting_run.assert_called_once_with( accounting_period, accounting_run, DIRECTORY_MODULE_CALCULATE_TOTALS ) mock_aws.location.assert_called_once_with( totals_dir, FILE_NAME_EXCHANGE_RATES_PARQUET ) mock_get_exchange_rates.assert_called_once_with( accounting_period.get('statement_period_id') ) @patch('tasks.accounting_run_calculate.snapshot_data_exchange_rates.ows') def test_get_exchange_rates(mock_ows): """Test _get_exchange_rates requests exchange_rates by statement period.""" statement_period_id = 123 fx_rates = [ { 'exchange_rate_id': 1, 'from_currency_code': 'USD', 'to_currency_code': 'GBP', 'rate': '0.82' }, { 'exchange_rate_id': 2, 'from_currency_code': 'GBP', 'to_currency_code': 'USD', 'rate': '1.23' } ] mock_ows.get_exchange_rates_by_statement_period.return_value = fx_rates result = task._get_exchange_rates(statement_period_id) assert result == [ { 'exchangeRateId': 1, 'exchangeFromCurrencyId': 840, 'exchangeToCurrencyId': 826, 'exchangeRate': '0.82' }, { 'exchangeRateId': 2, 'exchangeFromCurrencyId': 826, 'exchangeToCurrencyId': 840, 'exchangeRate': '1.23' } ] mock_ows.get_exchange_rates_by_statement_period.assert_called_once_with( statement_period_id )