diff --git a/tests/test_reports_related_postings.py b/tests/test_reports_related_postings.py index 13d8ee90fa53d15d560c4380961f879d237e022f..6707a2414ed8626cfc0375695511341368750b31 100644 --- a/tests/test_reports_related_postings.py +++ b/tests/test_reports_related_postings.py @@ -80,42 +80,27 @@ def test_balance_empty(): assert not balance assert balance.is_zero() -def test_balance_credit_card(credit_card_cycle): - related = core.RelatedPostings() - assert related.balance() == testutil.balance_map() - expected = Decimal() - for txn in credit_card_cycle: - post = txn.postings[0] - expected += post.units.number - related.add(post) - assert related.balance() == testutil.balance_map(USD=expected) - assert expected == 0 - -def test_clear_after_add(): - related = core.RelatedPostings() - related.add(testutil.Posting('Income:Donations', -10)) - assert related.balance() - related.clear() - assert not related.balance() - -def test_clear_after_initialization(): - related = core.RelatedPostings([ - testutil.Posting('Income:Donations', -12), - ]) - assert related.balance() - related.clear() - assert not related.balance() +@pytest.mark.parametrize('index,expected', enumerate([ + -110, + 0, + -120, + 0, +])) +def test_balance_credit_card(credit_card_cycle, index, expected): + related = core.RelatedPostings( + txn.postings[0] for txn in credit_card_cycle[:index + 1] + ) + assert related.balance() == testutil.balance_map(USD=expected) def check_iter_with_balance(entries): expect_posts = [txn.postings[0] for txn in entries] expect_balances = [] balance_tally = collections.defaultdict(Decimal) - related = core.RelatedPostings() for post in expect_posts: number, currency = post.units balance_tally[currency] += number expect_balances.append(testutil.balance_map(balance_tally.items())) - related.add(post) + related = core.RelatedPostings(expect_posts) for (post, balance), exp_post, exp_balance in zip( related.iter_with_balance(), expect_posts, @@ -195,48 +180,56 @@ def test_meta_values_empty(): assert related.meta_values('key') == set() def test_meta_values_no_match(): - related = core.RelatedPostings() - related.add(testutil.Posting('Income:Donations', -1, metakey='metavalue')) + related = core.RelatedPostings([ + testutil.Posting('Income:Donations', -1, metakey='metavalue'), + ]) assert related.meta_values('key') == {None} def test_meta_values_no_match_default_given(): - related = core.RelatedPostings() - related.add(testutil.Posting('Income:Donations', -1, metakey='metavalue')) + related = core.RelatedPostings([ + testutil.Posting('Income:Donations', -1, metakey='metavalue'), + ]) assert related.meta_values('key', '') == {''} def test_meta_values_one_match(): - related = core.RelatedPostings() - related.add(testutil.Posting('Income:Donations', -1, key='metavalue')) + related = core.RelatedPostings([ + testutil.Posting('Income:Donations', -1, key='metavalue'), + ]) assert related.meta_values('key') == {'metavalue'} def test_meta_values_some_match(): - related = core.RelatedPostings() - related.add(testutil.Posting('Income:Donations', -1, key='1')) - related.add(testutil.Posting('Income:Donations', -2, metakey='2')) + related = core.RelatedPostings([ + testutil.Posting('Income:Donations', -1, key='1'), + testutil.Posting('Income:Donations', -2, metakey='2'), + ]) assert related.meta_values('key') == {'1', None} def test_meta_values_some_match_default_given(): - related = core.RelatedPostings() - related.add(testutil.Posting('Income:Donations', -1, key='1')) - related.add(testutil.Posting('Income:Donations', -2, metakey='2')) + related = core.RelatedPostings([ + testutil.Posting('Income:Donations', -1, key='1'), + testutil.Posting('Income:Donations', -2, metakey='2'), + ]) assert related.meta_values('key', '') == {'1', ''} def test_meta_values_all_match(): - related = core.RelatedPostings() - related.add(testutil.Posting('Income:Donations', -1, key='1')) - related.add(testutil.Posting('Income:Donations', -2, key='2')) + related = core.RelatedPostings([ + testutil.Posting('Income:Donations', -1, key='1'), + testutil.Posting('Income:Donations', -2, key='2'), + ]) assert related.meta_values('key') == {'1', '2'} def test_meta_values_all_match_one_value(): - related = core.RelatedPostings() - related.add(testutil.Posting('Income:Donations', -1, key='1')) - related.add(testutil.Posting('Income:Donations', -2, key='1')) + related = core.RelatedPostings([ + testutil.Posting('Income:Donations', -1, key='1'), + testutil.Posting('Income:Donations', -2, key='1'), + ]) assert related.meta_values('key') == {'1'} def test_meta_values_all_match_default_given(): - related = core.RelatedPostings() - related.add(testutil.Posting('Income:Donations', -1, key='1')) - related.add(testutil.Posting('Income:Donations', -2, key='2')) + related = core.RelatedPostings([ + testutil.Posting('Income:Donations', -1, key='1'), + testutil.Posting('Income:Donations', -2, key='2'), + ]) assert related.meta_values('key', '') == {'1', '2'} def test_meta_values_many_types(): @@ -246,9 +239,10 @@ def test_meta_values_many_types(): testutil.Amount(5), 'rt:42', } - related = core.RelatedPostings() - for index, value in enumerate(expected): - related.add(testutil.Posting('Income:Donations', -index, key=value)) + related = core.RelatedPostings( + testutil.Posting('Income:Donations', -index, key=value) + for index, value in enumerate(expected) + ) assert related.meta_values('key') == expected @pytest.mark.parametrize('count', range(3)) @@ -289,23 +283,18 @@ def test_all_meta_links_multiples(): assert related.all_meta_links('approval') == testutil.LINK_METADATA_STRINGS def test_group_by_meta_zero(): - assert len(core.RelatedPostings.group_by_meta([], 'metacurrency')) == 0 - -def test_group_by_meta_key_error(): - # Make sure the return value doesn't act like a defaultdict. - with pytest.raises(KeyError): - core.RelatedPostings.group_by_meta([], 'metakey')['metavalue'] + assert not list(core.RelatedPostings.group_by_meta([], 'metacurrency')) def test_group_by_meta_one(credit_card_cycle): posting = next(post for post in data.Posting.from_entries(credit_card_cycle) if post.account.is_credit_card()) actual = core.RelatedPostings.group_by_meta([posting], 'metacurrency') - assert set(actual) == {'USD'} + assert set(key for key, _ in actual) == {'USD'} def test_group_by_meta_many(two_accruals_three_payments): postings = [post for post in data.Posting.from_entries(two_accruals_three_payments) if post.account == 'Assets:Receivable:Accounts'] - actual = core.RelatedPostings.group_by_meta(postings, 'metacurrency') + actual = dict(core.RelatedPostings.group_by_meta(postings, 'metacurrency')) assert set(actual) == {'USD', 'EUR'} for key, group in actual.items(): assert 2 <= len(group) <= 3 @@ -314,6 +303,6 @@ def test_group_by_meta_many(two_accruals_three_payments): def test_group_by_meta_many_single_posts(two_accruals_three_payments): postings = [post for post in data.Posting.from_entries(two_accruals_three_payments) if post.account == 'Assets:Receivable:Accounts'] - actual = core.RelatedPostings.group_by_meta(postings, 'metanumber') + actual = dict(core.RelatedPostings.group_by_meta(postings, 'metanumber')) assert set(actual) == {post.units.number for post in postings} assert len(actual) == len(postings)