diff --git a/tests/test_data_posting.py b/tests/test_data_posting.py new file mode 100644 index 0000000000000000000000000000000000000000..b9ee686cf755e80fed4dd72d0ce161ac316428ac --- /dev/null +++ b/tests/test_data_posting.py @@ -0,0 +1,94 @@ +"""Test Posting class""" +# 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 decimal import Decimal + +import beancount.core.amount as bc_amount + +from conservancy_beancount import data + +PAYMENT_ACCOUNTS = { + 'Assets:Cash', + 'Assets:Checking', +} + +NON_PAYMENT_ACCOUNTS = { + 'Accrued:AccountsReceivable', + 'Assets:PrepaidExpenses', + 'Assets:PrepaidVacation', + 'Expenses:Other', + 'Income:Other', + 'Liabilities:CreditCard', + 'UnearnedIncome:MatchPledges', +} + +def Posting(account, number, + currency='USD', cost=None, price=None, flag=None, + **meta): + if not meta: + meta = None + return data.Posting( + data.Account(account), + bc_amount.Amount(Decimal(number), currency), + cost, + price, + flag, + meta, + ) + +def check_all_thresholds(post, threshold, expected): + assert post.is_payment(threshold) is expected + assert post.is_payment(-threshold) is expected + assert post.is_payment(Decimal(threshold)) is expected + assert post.is_payment(Decimal(-threshold)) is expected + +@pytest.mark.parametrize('acct', PAYMENT_ACCOUNTS) +def test_is_payment(acct): + assert Posting(acct, -500).is_payment() + +@pytest.mark.parametrize('acct,amount,threshold', testutil.combine_values( + NON_PAYMENT_ACCOUNTS, + range(5, 20, 5), + range(0, 30, 10), +)) +def test_is_not_payment_account(acct, amount, threshold): + post = Posting(acct, -amount) + assert not post.is_payment() + check_all_thresholds(post, threshold, False) + +@pytest.mark.parametrize('acct', PAYMENT_ACCOUNTS) +def test_is_payment_with_threshold(acct): + threshold = len(acct) * 10 + post = Posting(acct, -500) + check_all_thresholds(post, threshold, True) + +@pytest.mark.parametrize('acct', PAYMENT_ACCOUNTS) +def test_is_not_payment_by_threshold(acct): + threshold = len(acct) * 10 + post = Posting(acct, -9) + check_all_thresholds(post, threshold, False) + +@pytest.mark.parametrize('acct', PAYMENT_ACCOUNTS) +def test_is_not_payment_but_credit(acct): + post = Posting(acct, 9) + assert not post.is_payment() + check_all_thresholds(post, 0, False) + check_all_thresholds(post, 5, False) + check_all_thresholds(post, 10, False)