Files @ 5a73d3d8f8d4
Branch filter:

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

Brett Smith
historical: Move normalize_rate and _pretty_rate to base Formatter.

This reduces the number of method overrides to help readability,
and gets rid of the annoying format_rate/pretty_rate distinction.
385a492ae735
08073f752bc8
0120e4ce5a5a
0120e4ce5a5a
936237eceb32
0120e4ce5a5a
0120e4ce5a5a
0120e4ce5a5a
0120e4ce5a5a
18f7ea7038d3
0120e4ce5a5a
0120e4ce5a5a
0120e4ce5a5a
0120e4ce5a5a
0120e4ce5a5a
9b6d562d46f5
0120e4ce5a5a
0120e4ce5a5a
0120e4ce5a5a
9b6d562d46f5
9b6d562d46f5
0120e4ce5a5a
0120e4ce5a5a
0120e4ce5a5a
0120e4ce5a5a
18f7ea7038d3
0120e4ce5a5a
9b6d562d46f5
9b6d562d46f5
0120e4ce5a5a
0120e4ce5a5a
9b6d562d46f5
9b6d562d46f5
0120e4ce5a5a
0120e4ce5a5a
0120e4ce5a5a
0120e4ce5a5a
0120e4ce5a5a
0120e4ce5a5a
0120e4ce5a5a
0120e4ce5a5a
0120e4ce5a5a
0120e4ce5a5a
0120e4ce5a5a
0120e4ce5a5a
0120e4ce5a5a
0120e4ce5a5a
08073f752bc8
27dbe14b94eb
27dbe14b94eb
27dbe14b94eb
27dbe14b94eb
27dbe14b94eb
27dbe14b94eb
27dbe14b94eb
27dbe14b94eb
27dbe14b94eb
27dbe14b94eb
27dbe14b94eb
27dbe14b94eb
27dbe14b94eb
08073f752bc8
27dbe14b94eb
936237eceb32
936237eceb32
936237eceb32
08073f752bc8
27dbe14b94eb
08073f752bc8
08073f752bc8
936237eceb32
08073f752bc8
08073f752bc8
936237eceb32
27dbe14b94eb
27dbe14b94eb
08073f752bc8
08073f752bc8
08073f752bc8
08073f752bc8
08073f752bc8
08073f752bc8
08073f752bc8
08073f752bc8
baa2e883cdfe
baa2e883cdfe
27dbe14b94eb
27dbe14b94eb
27dbe14b94eb
27dbe14b94eb
08073f752bc8
08073f752bc8
08073f752bc8
08073f752bc8
08073f752bc8
08073f752bc8
08073f752bc8
08073f752bc8
08073f752bc8
385a492ae735
385a492ae735
8ab2373ba13e
8ab2373ba13e
8ab2373ba13e
8ab2373ba13e
8ab2373ba13e
385a492ae735
8ab2373ba13e
8ab2373ba13e
8ab2373ba13e
8ab2373ba13e
385a492ae735
385a492ae735
385a492ae735
385a492ae735
8ab2373ba13e
385a492ae735
385a492ae735
385a492ae735
385a492ae735
385a492ae735
385a492ae735
385a492ae735
385a492ae735
385a492ae735
385a492ae735
385a492ae735
385a492ae735
385a492ae735
385a492ae735
385a492ae735
385a492ae735
385a492ae735
385a492ae735
385a492ae735
385a492ae735
385a492ae735
385a492ae735
385a492ae735
385a492ae735
d0f5f1547ced
d0f5f1547ced
d0f5f1547ced
d0f5f1547ced
d0f5f1547ced
d0f5f1547ced
d0f5f1547ced
d0f5f1547ced
d0f5f1547ced
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"