From a1c2a999e449054d6641bbb633954e45fcd63f90 Mon Sep 17 00:00:00 2001 From: Kristóf Marussy Date: Mon, 25 Jan 2021 01:14:28 +0100 Subject: Add plugins and importers from private config The importers are missing tests, because not having any specifications for the import formats means we must use real, private data as test inputs --- .../plugins/transfer_accounts_test.py | 628 +++++++++++++++++++++ 1 file changed, 628 insertions(+) create mode 100644 beancount_extras_kris7t/plugins/transfer_accounts_test.py (limited to 'beancount_extras_kris7t/plugins/transfer_accounts_test.py') diff --git a/beancount_extras_kris7t/plugins/transfer_accounts_test.py b/beancount_extras_kris7t/plugins/transfer_accounts_test.py new file mode 100644 index 0000000..0883522 --- /dev/null +++ b/beancount_extras_kris7t/plugins/transfer_accounts_test.py @@ -0,0 +1,628 @@ +__copyright__ = 'Copyright (c) 2020 Kristóf Marussy ' +__license__ = 'GNU GPLv2' + +import unittest + +from beancount import loader +from beancount.parser import cmptest + + +class TestTransferAccounts(cmptest.TestCase): + + @loader.load_doc() + def test_same_currency(self, entries, _, __): + ''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + + 2020-03-15 * "Taxi home from concert in Brooklyn" ^taxi + Assets:Checking -20 USD + Expenses:Taxi + transfer-account: Liabilities:CreditCard + transfer-date: 2020-03-10 + ''' + self.assertEqualEntries(''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + + 2020-03-15 * "Taxi home from concert in Brooklyn" ^taxi + Assets:Checking -20 USD + Liabilities:CreditCard 20 USD + + 2020-03-10 * "Taxi home from concert in Brooklyn" ^taxi + Expenses:Taxi 20 USD + Liabilities:CreditCard -20 USD + ''', entries) + + @loader.load_doc() + def test_missing_date(self, entries, _, __): + ''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + + 2020-03-15 * "Taxi home from concert in Brooklyn" ^taxi + Assets:Checking -20 USD + Expenses:Taxi + transfer-account: Liabilities:CreditCard + ''' + self.assertEqualEntries(''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + + 2020-03-15 * "Taxi home from concert in Brooklyn" ^taxi + Assets:Checking -20 USD + Liabilities:CreditCard 20 USD + + 2020-03-15 * "Taxi home from concert in Brooklyn" ^taxi + Expenses:Taxi 20 USD + Liabilities:CreditCard -20 USD + ''', entries) + + @loader.load_doc(expect_errors=True) + def test_missing_account_with_date(self, _, errors, __): + ''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + + 2020-03-15 * "Taxi home from concert in Brooklyn" ^taxi + Assets:Checking -20 USD + Expenses:Taxi + transfer-date: 2020-03-10 + ''' + self.assertRegex(errors[0].message, 'transfer-date was set but transfer-account was not') + + @loader.load_doc(expect_errors=True) + def test_missing_account_with_conversion(self, _, errors, __): + ''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + + 2020-03-15 * "Taxi home from concert in Brooklyn" ^taxi + Assets:Checking -25.60 CAD + Expenses:Taxi 20 USD @ 1.28 CAD + transfer-converted: FALSE + ''' + self.assertRegex( + errors[0].message, 'transfer-converted was set but transfer-account was not') + + @loader.load_doc(expect_errors=True) + def test_invalid_account(self, _, errors, __): + ''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + + 2020-03-15 * "Taxi home from concert in Brooklyn" ^taxi + Assets:Checking -20 USD + Expenses:Taxi + transfer-account: 2020-03-10 + ''' + self.assertRegex(errors[0].message, 'transfer-account must be a string.*') + + @loader.load_doc(expect_errors=True) + def test_invalid_date(self, _, errors, __): + ''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + + 2020-03-15 * "Taxi home from concert in Brooklyn" ^taxi + Assets:Checking -20 USD + Expenses:Taxi + transfer-account: Liabilities:CreditCard + transfer-date: "Ides of March" + ''' + self.assertRegex(errors[0].message, 'transfer-date must be a date.*') + + @loader.load_doc(expect_errors=True) + def test_invalid_conversion(self, _, errors, __): + ''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + + 2020-03-15 * "Taxi home from concert in Brooklyn" ^taxi + Assets:Checking -25.60 CAD + Expenses:Taxi 20 USD @ 1.28 CAD + transfer-account: Liabilities:CreditCard + transfer-converted: "indeed" + ''' + self.assertRegex(errors[0].message, 'transfer-converted must be a Boolean.*') + + @loader.load_doc(expect_errors=True) + def test_invalid_account_conversion(self, _, errors, __): + ''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Liabilities:CreditCard + transfer-converted: "Indeed" + ''' + self.assertRegex(errors[0].message, 'transfer-converted must be a Boolean.*') + + @loader.load_doc(expect_errors=True) + def test_redundant_conversion(self, _, errors, __): + ''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + + 2020-03-15 * "Taxi home from concert in Brooklyn" ^taxi + Assets:Checking -20 USD + Expenses:Taxi + transfer-account: Liabilities:CreditCard + transfer-converted: TRUE + ''' + self.assertRegex( + errors[0].message, 'transfer-converted was set, but there is no conversion.*') + + @loader.load_doc() + def test_converted_price_false(self, entries, _, __): + ''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + + 2020-03-15 * "Taxi home from concert in Brooklyn" ^taxi + Assets:Checking -25.60 CAD + Expenses:Taxi 20 USD @ 1.28 CAD + transfer-account: Liabilities:CreditCard + transfer-date: 2020-03-10 + transfer-converted: FALSE + ''' + self.assertEqualEntries(''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + + 2020-03-15 * "Taxi home from concert in Brooklyn" ^taxi + Assets:Checking -25.60 CAD + Liabilities:CreditCard 25.60 CAD + + 2020-03-10 * "Taxi home from concert in Brooklyn" ^taxi + Expenses:Taxi 20 USD @ 1.28 CAD + Liabilities:CreditCard -25.60 CAD + ''', entries) + + @loader.load_doc() + def test_converted_price_true(self, entries, _, __): + ''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + + 2020-03-15 * "Taxi home from concert in Brooklyn" ^taxi + Assets:Checking -25.60 CAD + Expenses:Taxi 20 USD @ 1.28 CAD + transfer-account: Liabilities:CreditCard + transfer-date: 2020-03-10 + transfer-converted: TRUE + ''' + self.assertEqualEntries(''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + + 2020-03-15 * "Taxi home from concert in Brooklyn" ^taxi + Assets:Checking -25.60 CAD + Liabilities:CreditCard 20 USD @ 1.28 CAD + + 2020-03-10 * "Taxi home from concert in Brooklyn" ^taxi + Expenses:Taxi 20 USD + Liabilities:CreditCard -20 USD + ''', entries) + + @loader.load_doc() + def test_converted_price_default(self, entries, _, __): + ''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + + 2020-03-15 * "Taxi home from concert in Brooklyn" ^taxi + Assets:Checking -25.60 CAD + Expenses:Taxi 20 USD @ 1.28 CAD + transfer-account: Liabilities:CreditCard + transfer-date: 2020-03-10 + ''' + self.assertEqualEntries(''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + + 2020-03-15 * "Taxi home from concert in Brooklyn" ^taxi + Assets:Checking -25.60 CAD + Liabilities:CreditCard 20 USD @ 1.28 CAD + + 2020-03-10 * "Taxi home from concert in Brooklyn" ^taxi + Expenses:Taxi 20 USD + Liabilities:CreditCard -20 USD + ''', entries) + + @loader.load_doc() + def test_converted_price_account_false(self, entries, _, __): + ''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + transfer-converted: FALSE + 2020-01-01 open Expenses:Taxi + + 2020-03-15 * "Taxi home from concert in Brooklyn" ^taxi + Assets:Checking -25.60 CAD + Expenses:Taxi 20 USD @ 1.28 CAD + transfer-account: Liabilities:CreditCard + transfer-date: 2020-03-10 + ''' + self.assertEqualEntries(''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + + 2020-03-15 * "Taxi home from concert in Brooklyn" ^taxi + Assets:Checking -25.60 CAD + Liabilities:CreditCard 25.60 CAD + + 2020-03-10 * "Taxi home from concert in Brooklyn" ^taxi + Expenses:Taxi 20 USD @ 1.28 CAD + Liabilities:CreditCard -25.60 CAD + ''', entries) + + @loader.load_doc() + def test_converted_price_account_true(self, entries, _, __): + ''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + transfer-converted: TRUE + 2020-01-01 open Expenses:Taxi + + 2020-03-15 * "Taxi home from concert in Brooklyn" ^taxi + Assets:Checking -25.60 CAD + Expenses:Taxi 20 USD @ 1.28 CAD + transfer-account: Liabilities:CreditCard + transfer-date: 2020-03-10 + ''' + self.assertEqualEntries(''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + + 2020-03-15 * "Taxi home from concert in Brooklyn" ^taxi + Assets:Checking -25.60 CAD + Liabilities:CreditCard 20 USD @ 1.28 CAD + + 2020-03-10 * "Taxi home from concert in Brooklyn" ^taxi + Expenses:Taxi 20 USD + Liabilities:CreditCard -20 USD + ''', entries) + + @loader.load_doc() + def test_converted_cost_false(self, entries, _, __): + ''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + + 2020-03-15 * "Taxi home from concert in Brooklyn" ^taxi + Assets:Checking -25.60 CAD + Expenses:Taxi 20 USD {1.28 CAD} + transfer-account: Liabilities:CreditCard + transfer-date: 2020-03-10 + transfer-converted: FALSE + ''' + self.assertEqualEntries(''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + + 2020-03-15 * "Taxi home from concert in Brooklyn" ^taxi + Assets:Checking -25.60 CAD + Liabilities:CreditCard 25.60 CAD + + 2020-03-10 * "Taxi home from concert in Brooklyn" ^taxi + Expenses:Taxi 20 USD {1.28 CAD, 2020-03-15} + Liabilities:CreditCard -25.60 CAD + ''', entries) + + @loader.load_doc() + def test_converted_cost_true(self, entries, _, __): + ''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + + 2020-03-15 * "Taxi home from concert in Brooklyn" ^taxi + Assets:Checking -25.60 CAD + Expenses:Taxi 20 USD {1.28 CAD} + transfer-account: Liabilities:CreditCard + transfer-date: 2020-03-10 + transfer-converted: TRUE + ''' + self.assertEqualEntries(''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + + 2020-03-15 * "Taxi home from concert in Brooklyn" ^taxi + Assets:Checking -25.60 CAD + Liabilities:CreditCard 20 USD {1.28 CAD, 2020-03-15} + + 2020-03-10 * "Taxi home from concert in Brooklyn" ^taxi + Expenses:Taxi 20 USD {1.28 CAD, 2020-03-15} + Liabilities:CreditCard -20 USD {1.28 CAD, 2020-03-15} + ''', entries) + + @loader.load_doc() + def test_converted_cost_and_price_false(self, entries, _, __): + ''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + + 2020-03-15 * "Taxi home from concert in Brooklyn" ^taxi + Assets:Checking -25.60 CAD + Expenses:Taxi 20 USD {1.28 CAD} @ 1.30 CAD + transfer-account: Liabilities:CreditCard + transfer-date: 2020-03-10 + transfer-converted: FALSE + ''' + self.assertEqualEntries(''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + + 2020-03-15 * "Taxi home from concert in Brooklyn" ^taxi + Assets:Checking -25.60 CAD + Liabilities:CreditCard 25.60 CAD + + 2020-03-10 * "Taxi home from concert in Brooklyn" ^taxi + Expenses:Taxi 20 USD {1.28 CAD, 2020-03-15} @ 1.30 CAD + Liabilities:CreditCard -25.60 CAD + ''', entries) + + @loader.load_doc() + def test_converted_cost_and_price_true(self, entries, _, __): + ''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + + 2020-03-15 * "Taxi home from concert in Brooklyn" ^taxi + Assets:Checking -25.60 CAD + Expenses:Taxi 20 USD {1.28 CAD} @ 1.30 CAD + transfer-account: Liabilities:CreditCard + transfer-date: 2020-03-10 + transfer-converted: TRUE + ''' + self.assertEqualEntries(''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + + 2020-03-15 * "Taxi home from concert in Brooklyn" ^taxi + Assets:Checking -25.60 CAD + Liabilities:CreditCard 20 USD {1.28 CAD, 2020-03-15} @ 1.30 CAD + + 2020-03-10 * "Taxi home from concert in Brooklyn" ^taxi + Expenses:Taxi 20 USD {1.28 CAD, 2020-03-15} + Liabilities:CreditCard -20 USD {1.28 CAD, 2020-03-15} + ''', entries) + + @loader.load_doc() + def test_multiple_separate(self, entries, _, __): + ''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + 2020-01-01 open Expenses:Food + + 2020-03-15 * "Night out in Brooklyn" ^taxi + Assets:Checking -45 USD + Expenses:Taxi 20 USD + transfer-account: Liabilities:CreditCard + transfer-date: 2020-03-10 + Expenses:Food 25 USD + transfer-account: Liabilities:CreditCard + transfer-date: 2020-03-12 + ''' + self.assertEqualEntries(''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + 2020-01-01 open Expenses:Food + + 2020-03-15 * "Night out in Brooklyn" ^taxi + Assets:Checking -45 USD + Liabilities:CreditCard 45 USD + + 2020-03-10 * "Night out in Brooklyn" ^taxi + Expenses:Taxi 20 USD + Liabilities:CreditCard -20 USD + + 2020-03-12 * "Night out in Brooklyn" ^taxi + Expenses:Food 25 USD + Liabilities:CreditCard -25 USD + ''', entries) + + @loader.load_doc() + def test_multiple_merge(self, entries, _, __): + ''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + 2020-01-01 open Expenses:Food + + 2020-03-15 * "Night out in Brooklyn" ^taxi + Assets:Checking -45 USD + Expenses:Taxi 20 USD + transfer-account: Liabilities:CreditCard + transfer-date: 2020-03-10 + Expenses:Food 25 USD + transfer-account: Liabilities:CreditCard + transfer-date: 2020-03-10 + ''' + self.assertEqualEntries(''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + 2020-01-01 open Expenses:Food + + 2020-03-15 * "Night out in Brooklyn" ^taxi + Assets:Checking -45 USD + Liabilities:CreditCard 45 USD + + 2020-03-10 * "Night out in Brooklyn" ^taxi + Expenses:Taxi 20 USD + Expenses:Food 25 USD + Liabilities:CreditCard -45 USD + ''', entries) + + @loader.load_doc() + def test_multiple_currencies_merge_converted_false(self, entries, _, __): + ''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + 2020-01-01 open Expenses:Food + + 2020-03-15 * "Night out in Brooklyn" ^taxi + Assets:Checking -50.60 CAD + Expenses:Taxi 20 USD @ 1.28 CAD + transfer-account: Liabilities:CreditCard + transfer-date: 2020-03-10 + transfer-converted: FALSE + Expenses:Food 25 CAD + transfer-account: Liabilities:CreditCard + transfer-date: 2020-03-10 + ''' + self.assertEqualEntries(''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + 2020-01-01 open Expenses:Food + + 2020-03-15 * "Night out in Brooklyn" ^taxi + Assets:Checking -50.60 CAD + Liabilities:CreditCard 50.60 CAD + + 2020-03-10 * "Night out in Brooklyn" ^taxi + Expenses:Taxi 20 USD @ 1.28 CAD + Expenses:Food 25 CAD + Liabilities:CreditCard -50.60 CAD + ''', entries) + + @loader.load_doc() + def test_multiple_currencies_merge_converted_true(self, entries, _, __): + ''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + 2020-01-01 open Expenses:Food + + 2020-03-15 * "Night out in Brooklyn" ^taxi + Assets:Checking -50.60 CAD + Expenses:Taxi 20 USD @ 1.28 CAD + transfer-account: Liabilities:CreditCard + transfer-date: 2020-03-10 + transfer-converted: TRUE + Expenses:Food 25 CAD + transfer-account: Liabilities:CreditCard + transfer-date: 2020-03-10 + ''' + self.assertEqualEntries(''' + plugin "beancount_extras_kris7t.plugins.transfer_accounts" + + 2020-01-01 open Assets:Checking + 2020-01-01 open Liabilities:CreditCard + 2020-01-01 open Expenses:Taxi + 2020-01-01 open Expenses:Food + + 2020-03-15 * "Night out in Brooklyn" ^taxi + Assets:Checking -50.60 CAD + Liabilities:CreditCard 20 USD @ 1.28 CAD + Liabilities:CreditCard 25 CAD + + 2020-03-10 * "Night out in Brooklyn" ^taxi + Expenses:Taxi 20 USD + Expenses:Food 25 CAD + Liabilities:CreditCard -20 USD + Liabilities:CreditCard -25 CAD + ''', entries) + + +if __name__ == '__main__': + unittest.main() -- cgit v1.2.3-54-g00ecf