Files @ ae3e4617d31e
Branch filter:

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

Brett Smith
historical: Always format rates with the same precision.

When we format a rate as a price, we don't know how much precision
is "enough" to do the conversion, because we don't know what's
being converted to. As a result, we may (=will almost certainly)
end up formatting the rate with different precision on the cost
date vs. the price date, and that causes Beancount/Ledger to fail
to make the connection between them.

Using a constant of 6 is enough to make the current test for
"enough" precision pass, so just do that for now. This might need
further refinement in the future.
import datetime
import pathlib

import pytest

from . import any_date, relpath
import oxrlib.errors
import oxrlib.loaders

CACHE_PATH = relpath('filecache')
HISTORICAL_PATTERN = '{date}_{base}_cache.json'

@pytest.fixture
def dummycache():
    cache = oxrlib.loaders.FileCache(CACHE_PATH)
    cache.setup(historical=HISTORICAL_PATTERN)
    return cache

@pytest.mark.parametrize('date,base', [
    (datetime.date(1999, 2, 1), 'USD'),
    (datetime.date(1999, 3, 1), 'EUR'),
])
def test_cache_success(dummycache, date, base):
    expect_name = CACHE_PATH / HISTORICAL_PATTERN.format(date=date.isoformat(), base=base)
    with dummycache.historical(date, base) as cache_file:
        assert pathlib.Path(cache_file.name) == expect_name

@pytest.mark.parametrize('date,base,exc_type', [
    (datetime.date(1999, 2, 1), 'EUR', oxrlib.errors.LoaderNoDataError),
    (datetime.date(1999, 3, 1), 'USD', oxrlib.errors.LoaderNoDataError),
    (datetime.date(1200, 12, 31), 'USD', oxrlib.errors.LoaderSourceError),
])
def test_cache_read_error(dummycache, date, base, exc_type):
    try:
        with dummycache.historical(date, base):
            assert False, "{e.__name__} not raised".format(e=exc_type)
    except exc_type:
        pass

def test_cache_unconfigured(any_date):
    cache = oxrlib.loaders.FileCache(CACHE_PATH)
    try:
        cache.historical(any_date, 'USD')
    except oxrlib.errors.CacheLoaderConfigurationError:
        pass
    else:
        assert False, "CacheLoaderConfigurationError not raised"