Files @ c3fd55ec15b7
Branch filter:

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

Brett Smith
historical: Beancount can handle commas in amounts.

And having it looks nicer, is more consistent with our historical
books, is less code for me, and is no more trouble for the user.
import datetime
import json
import pathlib

import pytest

from . import any_date, relpath, StringIO
import oxrlib.cache
import oxrlib.errors

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

class FakeCacheFile(oxrlib.cache.WriteCacheFile):
    def __init__(self, path, *args, **kwargs):
        self.path = path
        assert args[0].startswith('w')
        self.open_file = StringIO()
        self.open_file.name = self.path.as_posix()
        type(self).last_file = self.open_file


class FakeRate:
    def __init__(self, date, base):
        self.timestamp = datetime.datetime(date.year, date.month, date.day)
        self.base = base

    def serialize(self):
        return "test data for {} in {}".format(self.base, self.timestamp.date())


@pytest.fixture
def dummycache():
    cache = oxrlib.cache.CacheWriter(CACHE_PATH, file_class=FakeCacheFile)
    cache.setup(historical=HISTORICAL_PATTERN)
    return cache

def test_cache_success(dummycache, any_date):
    base = 'USD'
    expect_name = CACHE_PATH / HISTORICAL_PATTERN.format(date=any_date.isoformat(), base=base)
    with dummycache.historical(any_date, base) as cache_file:
        assert pathlib.Path(cache_file.name) == expect_name

def test_save_rate(dummycache, any_date):
    rate = FakeRate(any_date, 'USD')
    dummycache.save_rate(rate)
    assert FakeCacheFile.last_file.last_value == json.dumps(rate.serialize())