Files @ baa2e883cdfe
Branch filter:

Location: NPO-Accounting/oxrlib/tests/test_Configuration.py

Brett Smith
config: historical command accepts just two currency arguments.

This shows the rates between two currencies without converting a specific
amount.
import datetime
import decimal
import os

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=None):
    if arglist is None:
        arglist = ['historical', any_date().isoformat()]
    ini_path = INI_DIR_PATH / ini_filename
    return oxrlib.config.Configuration(['--config-file', ini_path.as_posix()] + arglist)

def test_full_config():
    config = config_from('full.ini')
    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():
    config = config_from('incomplete.ini')
    assert not config.get_loaders().loaders

def test_empty_config():
    config = config_from(os.devnull)
    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,preposition,to_curr', [
    (None, 'JPY', None, None),
    (None, 'gbp', None, 'Aud'),
    (None, 'CHF', 'to', 'eur'),
    (decimal.Decimal('1000'), 'chf', None, None),
    (decimal.Decimal('999'), 'Eur', None, 'Chf'),
    (decimal.Decimal('12.34'), 'gbp', 'IN', 'eur'),
])
def test_historical_argparsing_success(amount, from_curr, preposition, to_curr, any_date):
    arglist = ['historical', any_date.isoformat()]
    arglist.extend(str(s) for s in [amount, from_curr, preposition, to_curr]
                   if s is not None)
    config = config_from(os.devnull, arglist)
    assert config.args.amount == amount
    assert config.args.from_currency == from_curr.upper()
    if to_curr is not None:
        assert config.args.to_currency == to_curr.upper()

@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'],
])
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, 4, 5),
    ('05', 1965, 4, 5),
    ('3-6', 1965, 3, 6),
    ('5.10', 1965, 5, 10),
    ('06-09', 1965, 6, 9),
    ('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, 4, 3)
    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)