diff --git a/tests/test_data_account.py b/tests/test_data_account.py index d67bd67fa62974b5898cc67dfa6a58b695ecd85e..5c312eb254e1285763e12d5e9979056c529047a1 100644 --- a/tests/test_data_account.py +++ b/tests/test_data_account.py @@ -16,8 +16,32 @@ import pytest +from . import testutil + +from datetime import date as Date + +from beancount.core.data import Open, Close, Booking + from conservancy_beancount import data +clean_account_meta = pytest.fixture()(testutil.clean_account_meta) + +def check_account_meta(acct_meta, opening, closing=None): + if isinstance(acct_meta, str): + acct_meta = data.Account(acct_meta).meta + assert acct_meta == opening.meta + assert acct_meta.account == opening.account + assert acct_meta.booking == opening.booking + assert acct_meta.currencies == opening.currencies + assert acct_meta.open_date == opening.date + assert acct_meta.open_meta == opening.meta + if closing is None: + assert acct_meta.close_date is None + assert acct_meta.close_meta is None + else: + assert acct_meta.close_date == closing.date + assert acct_meta.close_meta == closing.meta + @pytest.mark.parametrize('acct_name,under_arg,expected', [ ('Expenses:Tax:Sales', 'Expenses:Tax:Sales:', False), ('Expenses:Tax:Sales', 'Expenses:Tax:Sales', True), @@ -205,3 +229,41 @@ def test_root_part(acct_name): assert account.root_part() == parts[0] assert account.root_part(1) == parts[0] assert account.root_part(2) == ':'.join(parts[:2]) + +def test_load_opening(clean_account_meta): + opening = Open({'lineno': 210}, Date(2010, 2, 1), 'Assets:Cash', None, None) + data.Account.load_opening(opening) + check_account_meta('Assets:Cash', opening) + +def test_load_closing(clean_account_meta): + name = 'Assets:Checking' + opening = Open({'lineno': 230}, Date(2010, 10, 1), name, None, None) + closing = Close({'lineno': 235}, Date(2010, 11, 1), name) + data.Account.load_opening(opening) + data.Account.load_closing(closing) + check_account_meta(name, opening, closing) + +def test_load_closing_without_opening(clean_account_meta): + closing = Close({'lineno': 245}, Date(2010, 3, 1), 'Assets:Cash') + with pytest.raises(ValueError): + data.Account.load_closing(closing) + +def test_load_openings_and_closings(clean_account_meta): + entries = [ + Open({'lineno': 1, 'income-type': 'Donations'}, + Date(2000, 3, 1), 'Income:Donations', None, None), + Open({'lineno': 2}, + Date(2000, 3, 1), 'Income:Other', None, None), + Open({'lineno': 3, 'asset-type': 'Cash equivalent'}, + Date(2000, 4, 1), 'Assets:Checking', ['USD', 'EUR'], Booking.STRICT), + testutil.Transaction(date=Date(2000, 4, 10), postings=[ + ('Income:Donations', -10), + ('Assets:Checking', 10), + ]), + Close({'lineno': 30, 'why': 'Changed banks'}, + Date(2000, 5, 1), 'Assets:Checking') + ] + data.Account.load_openings_and_closings(iter(entries)) + check_account_meta('Income:Donations', entries[0]) + check_account_meta('Income:Other', entries[1]) + check_account_meta('Assets:Checking', entries[2], entries[-1])