"""Test Posting methods""" # Copyright © 2020 Brett Smith # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import pytest from . import testutil from beancount.core import data as bc_data from conservancy_beancount import data @pytest.fixture def simple_txn(index=None, key=None): return testutil.Transaction(note='txn note', postings=[ ('Assets:Cash', 5), ('Income:Donations', -5, {'note': 'donation love', 'extra': 'Extra'}), ]) def test_from_beancount(): txn = testutil.Transaction(payee='Smith-Dakota', postings=[ ('Income:Donations', -50), ('Assets:Cash', 50, {'receipt': 'cash-donation.pdf'}), ]) post = data.Posting.from_beancount(txn, 1) # We don't just want to assert isinstance(post.attr, data.SomeClass); # we also want to double-check that attributes were instantiated correctly. assert post.account.is_under('Assets:Cash') assert post.meta['receipt'] == 'cash-donation.pdf' assert post.meta['entity'] == 'Smith-Dakota' assert post.meta.date == testutil.FY_MID_DATE def test_setting_metadata_propagates_to_source(simple_txn): src_post = simple_txn.postings[1] post = data.Posting.from_beancount(simple_txn, 1) post.meta['edited'] = 'yes' assert src_post.meta['edited'] == 'yes' assert not isinstance(src_post.meta, data.PostingMeta) def test_deleting_metadata_propagates_to_source(simple_txn): post = data.Posting.from_beancount(simple_txn, 1) del post.meta['extra'] assert 'extra' not in simple_txn.postings[1].meta def test_from_txn(simple_txn): for source, post in zip(simple_txn.postings, data.Posting.from_txn(simple_txn)): assert all(source[x] == post[x] for x in range(len(source) - 1)) assert isinstance(post.account, data.Account) assert post.meta['note'] # Only works with PostingMeta def test_from_entries_two_txns(simple_txn): entries = [simple_txn, simple_txn] sources = [post for txn in entries for post in txn.postings] for source, post in zip(sources, data.Posting.from_entries(entries)): assert all(source[x] == post[x] for x in range(len(source) - 1)) assert isinstance(post.account, data.Account) assert post.meta['note'] # Only works with PostingMeta def test_from_entries_mix_txns_and_other_directives(simple_txn): meta = { 'filename': __file__, 'lineno': 75, } entries = [ bc_data.Commodity(meta, testutil.FY_START_DATE, 'EUR'), bc_data.Commodity(meta, testutil.FY_START_DATE, 'USD'), simple_txn, ] for source, post in zip(simple_txn.postings, data.Posting.from_entries(entries)): assert all(source[x] == post[x] for x in range(len(source) - 1)) assert isinstance(post.account, data.Account) assert post.meta['note'] # Only works with PostingMeta