"""Test data.balance_of function""" # Copyright © 2020 Brett Smith # License: AGPLv3-or-later WITH Beancount-Plugin-Additional-Permission-1.0 # # Full copyright and licensing details can be found at toplevel file # LICENSE.txt in the repository. from decimal import Decimal from operator import methodcaller import pytest from . import testutil from conservancy_beancount import data is_cash_eq = data.Account.is_cash_equivalent USD = testutil.Amount @pytest.fixture def payable_payment_txn(): return testutil.Transaction(postings=[ ('Liabilities:Payable:Accounts', 50), ('Assets:Checking', -50), ('Expenses:BankingFees', 5), ('Assets:Checking', -5), ]) @pytest.fixture def fx_donation_txn(): return testutil.Transaction(postings=[ ('Income:Donations', -500, 'EUR', ('.9', 'USD')), ('Assets:Checking', 445), ('Expenses:BankingFees', 5), ]) def balance_under(txn, *accts): pred = methodcaller('is_under', *accts) return data.balance_of(txn, pred) def test_balance_of_simple_txn(): txn = testutil.Transaction(postings=[ ('Assets:Cash', 50), ('Income:Donations', -50), ]) assert balance_under(txn, 'Assets') == USD(50) assert balance_under(txn, 'Income') == USD(-50) def test_zero_balance_of(payable_payment_txn): expected = testutil.Amount(0, '') assert balance_under(payable_payment_txn, 'Equity') == expected assert balance_under(payable_payment_txn, 'Assets:Cash') == expected assert balance_under(payable_payment_txn, 'Liabilities:CreditCard') == expected def test_nonzero_balance_of(payable_payment_txn): assert balance_under(payable_payment_txn, 'Assets', 'Expenses') == USD(-50) assert balance_under(payable_payment_txn, 'Assets', 'Liabilities') == USD(-5) def test_multiarg_balance_of(): txn = testutil.Transaction(postings=[ ('Liabilities:CreditCard', 650), ('Expenses:BankingFees', 5), ('Assets:Checking', -655), ]) assert data.balance_of(txn, is_cash_eq, data.Account.is_credit_card) == USD(-5) def test_balance_of_multipost_txn(payable_payment_txn): assert data.balance_of(payable_payment_txn, is_cash_eq) == USD(-55) def test_balance_of_multicurrency_txn(fx_donation_txn): assert balance_under(fx_donation_txn, 'Income') == USD(-450) assert balance_under(fx_donation_txn, 'Income', 'Assets') == USD(-5) assert balance_under(fx_donation_txn, 'Income', 'Expenses') == USD(-445)