"""Test the currency object.""" from os import environ from unittest.mock import patch import pytest from abacus_common_data.currency import Currency from abacus_common_data.currency import CURRENT_ISO_FILE from abacus_common_data.currency import get_currency_object_from_code def test_currency_create_usd(): """Test USD currency.""" usd = Currency('USD') assert usd.code == 'USD' assert usd.number == 840 assert usd.currency_name == 'US Dollar' def test_currency_parse_xml(): """Tests parsing XML""" currency_data = Currency.parse_iso_xml( CURRENT_ISO_FILE, 'CcyTbl/CcyNtry') assert len(currency_data) == 180 @patch( 'abacus_common_data.currency.Currency._get_user_params', return_value=[]) def test_currency_loads_once(mock_user_params): """Test that the currency module only parses the xml once.""" Currency.currency_map = None Currency('USD') Currency('CAD') assert mock_user_params.call_count == 1 def test_currency_unknown_code(): """Tests passing an unknown code.""" with pytest.raises(KeyError): Currency('NOTACODE') def test_currency_user_params(): """Test adding a historical code via env vars.""" Currency.currency_map = None Currency('USD') with pytest.raises(KeyError): Currency('ALK') Currency.currency_map = None environ['HISTORICAL_ISO_CODES'] = 'ALK' alk = Currency('ALK') assert alk.code == 'ALK' def test_get_currency_object_from_code(): """Test get_currency_object_from_code.""" test_currency_code = 'CAD' result = get_currency_object_from_code(test_currency_code) assert result == { 'currency_id': 124, 'currency_code': 'CAD', 'currency_name': 'Canadian Dollar' } def test_get_currency_object_from_code_keyerror(): """Test KeyError exception for invalid currency.""" currency_code = '111' with pytest.raises(KeyError): get_currency_object_from_code(currency_code)