"""Test exchange rate logic.""" from unittest.mock import patch import pytest from royalties.constants.error import ERROR_CSV_EMPTY from royalties.logic.exchange_rate import ( bulk_load_exchange_rates, bulk_save_exchange_rates, ) from royalties.tests.utils.factories import StatementPeriodFactory @pytest.fixture def valid_exchange_rate_data(): """Return valid exchange rate json.""" return '\n'.join( [ '\t'.join(['period_id', 'from', 'USD', 'GBP', 'EUR']), '\t'.join(['1', 'GBP', '0.50', '1', '0.4444']), '\t'.join(['1', 'EUR', '0.4444', '0.5', '1']), '\t'.join(['1', 'USD', '2.00', '0.444', '1']), ] ) def test_bulk_load_exchange_rates_empty_csv_data(): """Tests bulk_load_exchange_rates method for empty exchange rates.""" params = {'statement_period_id': 12345, 'exchange_rates': []} result = bulk_load_exchange_rates(params) assert result.status == 400 assert result.errors['message'] == ERROR_CSV_EMPTY @patch('royalties.logic.exchange_rate.models') @patch('royalties.logic.exchange_rate.exchange_rates_schema') def test_bulk_save_exchange_rates_success( mock_schema, mock_models, valid_exchange_rate_data, fresh_db ): """Tests successfully loading exchange rates.""" mock_models.Currency.get_currency_codes.return_value = ['USD', 'GBP', 'EUR'] mock_statement_period = StatementPeriodFactory.build() mock_models.ExchangeRate.commit_changes.return_value = None result = bulk_save_exchange_rates( mock_statement_period.statement_period_id, valid_exchange_rate_data ) assert result.status == 201 assert mock_models.ExchangeRate.commit_changes.call_count == 1 assert mock_schema.dump.call_count == 1 def test_bulk_save_exchange_rates_sets_period_id(valid_exchange_rate_data, fresh_db): """Tests dynamic setting of statement period id.""" open_period_id = 87 StatementPeriodFactory.create(statement_period_id=open_period_id, closed_date=None) result = bulk_save_exchange_rates(open_period_id, valid_exchange_rate_data) for rate in result.message.get('rows'): assert rate.get('statement_period_id') is open_period_id assert result.status == 201