27dbe14b94
For output formats that can show both a cost and a price, this will be used to distinguish them.
149 lines
5.2 KiB
Python
149 lines
5.2 KiB
Python
import datetime
|
|
import decimal
|
|
import os
|
|
|
|
import babel
|
|
import pytest
|
|
|
|
from . import any_date, relpath
|
|
|
|
import oxrlib.cache
|
|
import oxrlib.config
|
|
import oxrlib.loaders
|
|
|
|
INI_DIR_PATH = relpath('config_ini')
|
|
|
|
def config_from(ini_filename, arglist):
|
|
ini_path = INI_DIR_PATH / ini_filename
|
|
return oxrlib.config.Configuration(['--config-file', ini_path.as_posix()] + arglist)
|
|
|
|
def test_full_config(any_date):
|
|
config = config_from('full.ini', ['historical', any_date.isoformat()])
|
|
loaders = config.get_loaders().loaders
|
|
assert type(loaders[0]) is oxrlib.loaders.FileCache
|
|
assert type(loaders[1]) is oxrlib.loaders.OXRAPIRequest
|
|
assert len(loaders) == 2
|
|
assert type(config.cache) is oxrlib.cache.CacheWriter
|
|
|
|
def test_incomplete_config(any_date):
|
|
config = config_from('incomplete.ini', ['historical', any_date.isoformat()])
|
|
assert not config.get_loaders().loaders
|
|
|
|
def test_empty_config(any_date):
|
|
config = config_from(os.devnull, ['historical', any_date.isoformat()])
|
|
assert not config.get_loaders().loaders
|
|
|
|
@pytest.mark.parametrize('ini_filename,expected_currency,use_switch', [
|
|
(os.devnull, 'USD', False),
|
|
('full.ini', 'INI', False),
|
|
('full.ini', 'EUR', True),
|
|
])
|
|
def test_historical_default_base(ini_filename, expected_currency, use_switch, any_date):
|
|
arglist = ['historical']
|
|
if use_switch:
|
|
arglist.extend(['--base', expected_currency])
|
|
arglist.append(any_date.isoformat())
|
|
config = config_from(ini_filename, arglist)
|
|
assert config.args.base == expected_currency
|
|
|
|
@pytest.mark.parametrize('amount,from_curr,prep1,to_curr,prep2,from_date', [
|
|
(None, 'JPY', None, None, None, None),
|
|
(None, 'gbp', None, 'Aud', None, None),
|
|
(None, 'CHF', 'to', 'eur', None, None),
|
|
(decimal.Decimal('1000'), 'chf', None, None, None, None),
|
|
(decimal.Decimal('999'), 'Eur', None, 'Chf', None, None),
|
|
(decimal.Decimal('12.34'), 'gbp', 'IN', 'eur', None, None),
|
|
(None, 'JPY', None, None, None, '12-15'),
|
|
(None, 'gbp', None, 'Aud', 'From', '12.15'),
|
|
(None, 'CHF', 'to', 'eur', 'from', '15'),
|
|
(decimal.Decimal('1000'), 'chf', None, None, None, '12-15'),
|
|
(decimal.Decimal('999'), 'Eur', None, 'Chf', None, '2016.12.15'),
|
|
(decimal.Decimal('12.34'), 'gbp', 'IN', 'eur', 'from', '2016-12-15'),
|
|
])
|
|
def test_historical_argparsing_success(amount, from_curr, prep1, to_curr, prep2, from_date, any_date):
|
|
oxrlib.config.Configuration.TODAY = datetime.date(2017, 1, 1)
|
|
# This locale's currency should not be used in any test cases above.
|
|
oxrlib.config.Configuration.LOCALE = babel.core.Locale('en', 'IN')
|
|
arglist = ['historical', any_date.isoformat()]
|
|
arglist.extend(str(s) for s in [amount, from_curr, prep1, to_curr, prep2, from_date]
|
|
if s is not None)
|
|
config = config_from(os.devnull, arglist)
|
|
expect_to_curr = 'INR' if to_curr is None else to_curr.upper()
|
|
assert config.args.amount == amount
|
|
assert config.args.from_currency == from_curr.upper()
|
|
assert config.args.to_currency == expect_to_curr
|
|
expect_from_date = None if from_date is None else datetime.date(2016, 12, 15)
|
|
assert config.args.from_date == expect_from_date
|
|
|
|
@pytest.mark.parametrize('arglist', [
|
|
['100'],
|
|
['120', 'dollars'],
|
|
['to', '42', 'usd'],
|
|
['99', 'usd', 'minus', 'jpy'],
|
|
['usdjpy'],
|
|
['44', 'eur', 'in', 'chf', 'pronto'],
|
|
['eur', 'into'],
|
|
['50', 'jpy', 'in'],
|
|
['115', 'usd', 'in', '12-15'],
|
|
['125', 'jpy', 'from', 'chf'],
|
|
['135', 'chf', 'eur', 'gbp'],
|
|
['145', 'brl', '12-16', '2020-12-18'],
|
|
])
|
|
def test_historical_argparsing_failure(arglist, any_date):
|
|
arglist = ['historical', any_date.isoformat()] + arglist
|
|
try:
|
|
config = config_from(os.devnull, arglist)
|
|
except SystemExit:
|
|
pass
|
|
else:
|
|
assert not vars(config.args), "bad arglist succeeded"
|
|
|
|
@pytest.mark.parametrize('date_s,expect_year,expect_month,expect_day', [
|
|
('5', 1965, 7, 5),
|
|
('05', 1965, 7, 5),
|
|
('14', 1965, 7, 14),
|
|
('15', 1965, 7, 15),
|
|
('16', 1965, 6, 16),
|
|
('3-6', 1965, 3, 6),
|
|
('11.10', 1964, 11, 10),
|
|
('07-14', 1965, 7, 14),
|
|
('07/15', 1965, 7, 15),
|
|
('7.16', 1964, 7, 16),
|
|
('917/12/12', 917, 12, 12),
|
|
('2017-11-1', 2017, 11, 1),
|
|
])
|
|
def test_good_date_parsing(date_s, expect_year, expect_month, expect_day):
|
|
oxrlib.config.Configuration.TODAY = datetime.date(1965, 7, 15)
|
|
config = config_from(os.devnull, ['historical', date_s])
|
|
actual_date = config.args.date
|
|
assert actual_date.year == expect_year
|
|
assert actual_date.month == expect_month
|
|
assert actual_date.day == expect_day
|
|
|
|
@pytest.mark.parametrize('date_s', [
|
|
'99',
|
|
'8-88',
|
|
'77-7',
|
|
'0xf-1-2',
|
|
'0b1-3-4',
|
|
'2017/5.9',
|
|
'2018-6/10',
|
|
'1-2-3-4',
|
|
'12/11/10',
|
|
])
|
|
def test_bad_date_parsing(date_s):
|
|
try:
|
|
config = config_from(os.devnull, ['historical', date_s])
|
|
except SystemExit:
|
|
pass
|
|
else:
|
|
assert not config.args.date, "date parsed from {!r}".format(date_s)
|
|
|
|
def test_ambiguous_arglist_failure():
|
|
try:
|
|
# It's ambiguous if "2" is "the 2nd" or "2 EUR".
|
|
config = config_from(os.devnull, ['historical', '2', 'eur'])
|
|
except SystemExit:
|
|
pass
|
|
else:
|
|
assert not config.args, "ambiguous args parsed"
|