From 6a416b162d8aa316efaa0846dc354cb32aa649f4 2017-05-12 17:48:21 From: Brett Smith Date: 2017-05-12 17:48:21 Subject: [PATCH] cache: Add CacheWriter.save_rate method. --- diff --git a/oxrlib/cache.py b/oxrlib/cache.py index 03511d49d7f5de148ae2e9611226160bf291a97c..6792c3cf0649acfeccc08d83df6b157d5c3e5467 100644 --- a/oxrlib/cache.py +++ b/oxrlib/cache.py @@ -1,4 +1,5 @@ import functools +import json from . import errors @@ -77,3 +78,10 @@ class CacheWriter(CacheBase): def open(self, path): return self.CacheFile(path, 'w') + + def write_json(self, cache_file, thing): + json.dump(thing, cache_file, indent=2) + + def save_rate(self, rate): + with self.historical(rate.timestamp.date(), rate.base) as cache_file: + self.write_json(cache_file, rate.serialize()) diff --git a/tests/__init__.py b/tests/__init__.py index 98cfa519c320355fbef71071ba04837dd58cfef2..a891b6c9cc42e5dbb6b165c03e88e17b0ef6c204 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1,4 +1,5 @@ import datetime +import io import pathlib import random @@ -6,6 +7,11 @@ import pytest TEST_DIR = pathlib.Path(__file__).parent +class StringIO(io.StringIO): + def close(self): + self.last_value = self.getvalue() + super().close() + def relpath(*parts): return TEST_DIR / pathlib.Path(*parts) diff --git a/tests/test_CacheWriter.py b/tests/test_CacheWriter.py index b9330757e412328ce149382f35c15dd38a21e4d3..1ceadce2cfe17eaadd3af6a004282dab688312a7 100644 --- a/tests/test_CacheWriter.py +++ b/tests/test_CacheWriter.py @@ -1,10 +1,10 @@ import datetime -import io +import json import pathlib import pytest -from . import any_date, relpath +from . import any_date, relpath, StringIO import oxrlib.cache import oxrlib.errors @@ -17,9 +17,19 @@ class TestCacheFile(oxrlib.cache.WriteCacheFile): assert args[0].startswith('w') def open(self): - open_file = io.StringIO() - open_file.name = self.path.as_posix() - return open_file + last_file = StringIO() + last_file.name = self.path.as_posix() + type(self).last_file = last_file + return self.last_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 @@ -33,3 +43,8 @@ def test_cache_success(dummycache, any_date): 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 TestCacheFile.last_file.last_value == json.dumps(rate.serialize())