From 99aeb6bbc7a747e183543b8526cdeffdffdcab10 Mon Sep 17 00:00:00 2001 From: Chris Berkhout Date: Mon, 4 Apr 2022 15:33:40 +0200 Subject: [PATCH] Test json and jsonl output formats. --- src/pricehist/outputs/json.py | 4 +- tests/pricehist/outputs/test_json.py | 127 +++++++++++++++++++++++++++ 2 files changed, 129 insertions(+), 2 deletions(-) create mode 100644 tests/pricehist/outputs/test_json.py diff --git a/src/pricehist/outputs/json.py b/src/pricehist/outputs/json.py index 7e0f674..9deb90e 100644 --- a/src/pricehist/outputs/json.py +++ b/src/pricehist/outputs/json.py @@ -45,10 +45,10 @@ class JSON(BaseOutput): if self.jsonl: for row in data: - json.dump(row, output) + json.dump(row, output, ensure_ascii=False) output.write("\n") else: - json.dump(data, output, indent=2) + json.dump(data, output, ensure_ascii=False, indent=2) output.write("\n") return output.getvalue() diff --git a/tests/pricehist/outputs/test_json.py b/tests/pricehist/outputs/test_json.py new file mode 100644 index 0000000..608007e --- /dev/null +++ b/tests/pricehist/outputs/test_json.py @@ -0,0 +1,127 @@ +from decimal import Decimal +from textwrap import dedent + +import pytest + +from pricehist.format import Format +from pricehist.outputs.json import JSON +from pricehist.price import Price +from pricehist.series import Series + + +@pytest.fixture +def json_out(): + return JSON() + + +@pytest.fixture +def jsonl_out(): + return JSON(jsonl=True) + + +@pytest.fixture +def series(): + prices = [ + Price("2021-01-01", Decimal("24139.4648")), + Price("2021-01-02", Decimal("26533.576")), + Price("2021-01-03", Decimal("27001.2846")), + ] + return Series("BTC", "EUR", "close", "2021-01-01", "2021-01-03", prices) + + +def test_format_basics(json_out, series, mocker): + source = mocker.MagicMock() + source.id = mocker.MagicMock(return_value="sourceid") + result = json_out.format(series, source, Format()) + assert ( + result + == dedent( + """ + [ + { + "date": "2021-01-01", + "base": "BTC", + "quote": "EUR", + "amount": "24139.4648", + "source": "sourceid", + "type": "close" + }, + { + "date": "2021-01-02", + "base": "BTC", + "quote": "EUR", + "amount": "26533.576", + "source": "sourceid", + "type": "close" + }, + { + "date": "2021-01-03", + "base": "BTC", + "quote": "EUR", + "amount": "27001.2846", + "source": "sourceid", + "type": "close" + } + ] + """ + ).strip() + + "\n" + ) + + +def test_format_basic_jsonl(jsonl_out, series, mocker): + source = mocker.MagicMock() + source.id = mocker.MagicMock(return_value="sourceid") + result = jsonl_out.format(series, source, Format()) + assert ( + result + == dedent( + """ + {"date": "2021-01-01", "base": "BTC", "quote": "EUR", "amount": "24139.4648", "source": "sourceid", "type": "close"} + {"date": "2021-01-02", "base": "BTC", "quote": "EUR", "amount": "26533.576", "source": "sourceid", "type": "close"} + {"date": "2021-01-03", "base": "BTC", "quote": "EUR", "amount": "27001.2846", "source": "sourceid", "type": "close"} + """ # noqa + ).strip() + + "\n" + ) + + +def test_format_custom(json_out, series, mocker): + source = mocker.MagicMock() + source.id = mocker.MagicMock(return_value="sourceid") + fmt = Format(base="XBT", quote="€", thousands=".", decimal=",", datesep="/") + result = json_out.format(series, source, fmt) + assert ( + result + == dedent( + """ + [ + { + "date": "2021/01/01", + "base": "XBT", + "quote": "€", + "amount": "24.139,4648", + "source": "sourceid", + "type": "close" + }, + { + "date": "2021/01/02", + "base": "XBT", + "quote": "€", + "amount": "26.533,576", + "source": "sourceid", + "type": "close" + }, + { + "date": "2021/01/03", + "base": "XBT", + "quote": "€", + "amount": "27.001,2846", + "source": "sourceid", + "type": "close" + } + ] + """ + ).strip() + + "\n" + )