def test_metadata_entry(self, entries, _, ___): """ 2020-01-01 open Assets:Test 2020-07-23 * "Test metadata" string: "foo" year: 2020 amount: 10.00 EUR date: 2020-07-19 none: bool: TRUE Assets:Test 10.00 EUR Assets:Test -10.00 EUR """ result = beancount2ledger.convert(entries, "hledger") self.assertLines( """ account Assets:Test 2020-07-23 * Test metadata ; string: foo ; year: 2020 ; amount: 10.00 EUR ; date: 2020-07-19 ; none: ; bool: True Assets:Test 10.00 EUR Assets:Test -10.00 EUR """, result, )
def test_metadata_posting(self, entries, _, ___): """ 2020-01-01 open Assets:Test 2020-07-23 * "Test metadata" Assets:Test 10.00 EUR Assets:Test -10.00 EUR string: "foo" year: 2020 amount: 10.00 EUR date: 2020-07-19 none: bool: FALSE """ result = beancount2ledger.convert(entries) self.assertLines( """ account Assets:Test 2020-07-23 * Test metadata Assets:Test 10.00 EUR Assets:Test -10.00 EUR ; string: foo ; year:: 2020 ; amount:: 10.00 EUR ; date:: [2020-07-19] ; none: ; bool:: false """, result)
def test_preserve_posting_order(self, entries, _, ___): """ 2010-01-01 open Assets:Test 2020-07-24 * "Posting order" Assets:Test 1000.00 EUR Assets:Test -1000.00 EUR Assets:Test 1000.00 EUREUREUREUREUR Assets:Test -1000.00 EUREUREUREUREUR Assets:Test 1000.00 EUR Assets:Test -1000.00 EUR """ result = beancount2ledger.convert(entries) self.assertLines( r""" account Assets:Test 2020-07-24 * Posting order Assets:Test 1000.00 EUR Assets:Test -1000.00 EUR Assets:Test 1000.00 EUREUREUREUREUR Assets:Test -1000.00 EUREUREUREUREUR Assets:Test 1000.00 EUR Assets:Test -1000.00 EUR """, result)
def test_posting(self, entries, _, __): """ 2020-01-01 open Assets:Test 2020-11-13 * "Test" Assets:Test 1000.00 EUR Assets:Test 2020-11-13 * "Test" Assets:Test 1000.00 TEST Assets:Test """ result = beancount2ledger.convert(entries, config=self.config) self.assertLines( """ account Assets:My Test 2020-11-13 * Test Assets:My Test 1000.00 € Assets:My Test 2020-11-13 * Test Assets:My Test 1000.00 "TEST1" Assets:My Test """, result)
def test_simple(self, entries, _, __): """ ;; All supported features exhibited here. 2013-01-01 open Expenses:Restaurant 2013-01-01 open Assets:Cash USD,CAD 2014-02-15 price HOOL 500.00 USD 2014-03-02 * "Something" Expenses:Restaurant 50.02 USD Assets:Cash 2015-01-01 custom "budget" Expenses:Food "yearly" 34.43 HRK """ result = beancount2ledger.convert(entries) self.assertLines( """ account Expenses:Restaurant account Assets:Cash assert commodity == "USD" | commodity == "CAD" P 2014-02-15 HOOL 500.00 USD 2014-03-02 * Something Expenses:Restaurant 50.02 USD Assets:Cash """, result)
def test_cost_and_foreign_currency(self, entries, _, __): """ plugin "beancount.plugins.implicit_prices" 2014-01-01 open Assets:CA:Investment:HOOL 2014-01-01 open Expenses:Commissions 2014-01-01 open Assets:CA:Investment:Cash 2014-11-02 * "Buy some stock with foreign currency funds" Assets:CA:Investment:HOOL 5 HOOL {520.0 USD} Expenses:Commissions 9.95 USD Assets:CA:Investment:Cash -2939.46 CAD @ 0.8879 USD """ result = beancount2ledger.convert(entries) self.assertLines( """ account Assets:CA:Investment:HOOL account Expenses:Commissions account Assets:CA:Investment:Cash 2014-11-02 * Buy some stock with foreign currency funds Assets:CA:Investment:HOOL 5 HOOL {520.0 USD} @ 520.0 USD Expenses:Commissions 9.95 USD Assets:CA:Investment:Cash -2939.46 CAD @ 0.8879 USD P 2014-11-02 HOOL 520.0 USD P 2014-11-02 CAD 0.8879 USD """, result)
def test_multiline_strings(self, entries, _, ___): """ 2010-01-01 open Assets:Test 2020-07-25 txn "Foo bar" "Foo bar bar" meta: "Foo bar" Assets:Test 10.00 EUR meta: "Foo bar" Assets:Test -10.00 EUR """ result = beancount2ledger.convert(entries) self.assertLines( r""" account Assets:Test 2020-07-25 * Foo\nbar | Foo\nbar\nbar ; meta: Foo\nbar Assets:Test 10.00 EUR ; meta: Foo\nbar Assets:Test -10.00 EUR """, result)
def test_flags(self, entries, _, ___): """ 2010-01-01 open Assets:Test 2020-07-25 txn "Valid flags" * Assets:Test 10.00 EUR ! Assets:Test 2020-07-25 R "Invalid flags" M Assets:Test 10.00 EUR S Assets:Test -10.00 EUR """ result = beancount2ledger.convert(entries) self.assertLines( r""" account Assets:Test 2020-07-25 * Valid flags * Assets:Test 10.00 EUR ! Assets:Test 2020-07-25 Invalid flags Assets:Test 10.00 EUR Assets:Test -10.00 EUR """, result)
def test_price_alignment(self, entries, _, ___): """ 2020-07-23 price EUR 1.16 USD 2020-07-24 price EUREUREUREUREUREUREUREUR 1.16 USD 2020-07-24 price EUREUREUREUREUREUREUREU1 1.16 USD """ result = beancount2ledger.convert(entries) len_pricedb = [len(line) for line in result.rstrip().split('\n')] self.assertEqual(len_pricedb[::2], [75, 75, 75])
def test_metadata_none(self, entries, _, ___): """ 2000-01-01 open Assets:Test1 2000-01-01 open Assets:Test2 2019-01-21 pad Assets:Test1 Assets:Test2 2019-01-22 balance Assets:Test1 10.00 GBP """ # padding (P) entries don't set entry.meta or posting.meta, so # convert to make sure we don't crash. _ = beancount2ledger.convert(entries)
def test_posting_no_amount(self, entries, _, ___): """ 2010-01-01 open Assets:Test 2020-07-25 txn "No amount on second posting" Assets:Test 10.00 EUR Assets:Test """ result = beancount2ledger.convert(entries) self.assertLines( """ account Assets:Test 2020-07-25 * No amount on second posting Assets:Test 10.00 EUR Assets:Test """, result)
def test_cost(self, entries, _, __): """ 2020-01-01 open Assets:Bank 2020-01-01 open Expenses:Grocery 2020-01-01 * "Grocery" "Salad" Expenses:Grocery 5 SALAD {1.00 USD} @ 1.00 USD Assets:Bank 2020-01-01 * "Grocery" "Salad" Expenses:Grocery 5 SALAD {1.00 USD} @@ 5.00 USD Assets:Bank 2020-01-01 * "Grocery" "Salad" Expenses:Grocery 5 SALAD {{5.00 USD}} @ 1.00 USD Assets:Bank 2020-01-01 * "Grocery" "Salad" Expenses:Grocery 5 SALAD {{5.00 USD}} @@ 5.00 USD Assets:Bank """ result = beancount2ledger.convert(entries, "hledger") self.assertLines( """ account Assets:Bank account Expenses:Grocery 2020-01-01 * Grocery | Salad Expenses:Grocery 5 SALAD @ 1.00 USD Assets:Bank 2020-01-01 * Grocery | Salad Expenses:Grocery 5 SALAD @ 1.00 USD Assets:Bank 2020-01-01 * Grocery | Salad Expenses:Grocery 5 SALAD @ 1.00 USD Assets:Bank 2020-01-01 * Grocery | Salad Expenses:Grocery 5 SALAD @ 1.00 USD Assets:Bank """, # NoQA: E501 line too long result, )
def test_retain_precision(self, entries, _, ___): """ 2010-01-01 open Expenses:Nutrition:Food 2010-01-01 open Assets:Bank 2010-01-01 open Assets:Investments 2020-01-10 * "Supermarket" Expenses:Nutrition:Food 150.75 THB @ 0.03310116086236 USD Assets:Bank -4.99 USD 2020-01-10 * "Supermarket" Expenses:Nutrition:Food 150.75 THB @ 0.025207296849 GBP Assets:Bank -3.80 GBP 2020-02-28 * "Bought GB00BPN5P782" Assets:Investments 1 GB00BPN5P782 {101.689996215 GBP} Assets:Investments -101.69 GBP """ result = beancount2ledger.convert(entries, "hledger") self.assertLines( r""" account Expenses:Nutrition:Food account Assets:Bank account Assets:Investments 2020-01-10 * Supermarket Expenses:Nutrition:Food 150.75 THB @ 0.03310116086236 USD Assets:Bank -4.99 USD 2020-01-10 * Supermarket Expenses:Nutrition:Food 150.75 THB @ 0.025207296849 GBP Assets:Bank -3.80 GBP 2020-02-28 * Bought GB00BPN5P782 Assets:Investments 1 "GB00BPN5P782" @ 101.689996215 GBP Assets:Investments -101.69 GBP """, # NoQA: E501 line too long result, )
def test_posting_alignment(self, entries, _, ___): """ 2020-01-01 open Assets:Test 2020-01-01 open Assets:TestTestTestTestTestTestTestTestTestTestTestTest 2020-01-01 open Assets:TestTestTestTestTestTestTestTestTestTestTestTestTestTest 2010-01-01 open Assets:TestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTest 2020-07-17 * "Test alignment of postings" * Assets:Test 1000000000.00 EUR Assets:Test -1000000000.00 EUR * Assets:TestTestTestTestTestTestTestTestTestTestTestTest 1000.00 EUR Assets:Test -1000.00 EUR * Assets:TestTestTestTestTestTestTestTestTestTestTestTestTestTest 1000.00 EUR Assets:Test -1000.00 EUR Assets:TestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTestTest 1000.00 EUR Assets:Test -1000.00 EUR * Assets:Test 100000.00 EUREUREUREUREUR Assets:Test -100000.00 EUREUREUREUREUR """ result = beancount2ledger.convert(entries) len_postings = [len(line) for line in result.rstrip().split('\n')] self.assertEqual(len_postings[-10:-1:2], [75, 75, 80, 98, 75])
def test_rounding(self, entries, _, ___): """ 2010-01-01 open Expenses:Test 2010-01-01 open Assets:Bank 2020-01-10 * "Test" Expenses:Test 4.990 USD Assets:Bank -4.990 USD 2020-01-10 * "Test: will fail in ledger due to precision of USD" Expenses:Test 150.75 THB @ 0.03344 USD Assets:Bank -5.04 USD 2020-01-10 * "Test: will fail in ledger due to precision of USD" Expenses:Test 140.1 THB @ 0.021 USD Assets:Bank -2.94 USD """ result = beancount2ledger.convert(entries, "hledger") self.assertLines( r""" account Expenses:Test account Assets:Bank 2020-01-10 * Test Expenses:Test 4.990 USD Assets:Bank -4.990 USD 2020-01-10 * Test: will fail in ledger due to precision of USD Expenses:Test 150.75 THB @ 0.03344 USD Assets:Bank -5.040 USD Equity:Rounding -0.001 USD 2020-01-10 * Test: will fail in ledger due to precision of USD Expenses:Test 140.10 THB @ 0.021 USD Assets:Bank -2.940 USD Equity:Rounding -0.002 USD """, # NoQA: E501 line too long result, )
def test_keep_zero_amounts(self, entries, _, ___): """ 2010-01-01 open Assets:Investments 2010-01-01 open Expenses:Fees:Investments 2020-05-24 * "Bought ETH" Assets:Investments 0.00000221 ETH {190.60 EUR} Expenses:Fees:Investments 0.00 EUR Assets:Investments -0.00 EUR """ result = beancount2ledger.convert(entries) self.assertLines( r""" account Assets:Investments account Expenses:Fees:Investments 2020-05-24 * Bought ETH Assets:Investments 0.00000221 ETH {190.60 EUR} @ 190.60 EUR Expenses:Fees:Investments 0.00 EUR Assets:Investments 0.00 EUR """, result)
def test_add_price_when_needed(self, entries, _, ___): """ 2020-01-01 open Assets:Property 2020-01-01 open Equity:Opening-Balance 2020-11-13 * "We need to add @ price due to ledger bug #630" Assets:Property 0.1 FOO {300.00 EUR} Assets:Property 0.2 BAR {200.00 EUR} Equity:Opening-Balance -70.00 EUR """ result = beancount2ledger.convert(entries) self.assertLines( r""" account Assets:Property account Equity:Opening-Balance 2020-11-13 * We need to add @ price due to ledger bug #630 Assets:Property 0.1 FOO {300.00 EUR} @ 300.00 EUR Assets:Property 0.2 BAR {200.00 EUR} @ 200.00 EUR Equity:Opening-Balance -70.00 EUR """, result)
def test_avoid_multiple_null_postings(self, entries, _, ___): """ 2010-01-01 open Assets:Cash 2010-01-01 open Equity:Opening-balance 2020-01-01 * "Opening balance: cash" Assets:Cash 0.10 EUR Assets:Cash 1.00 GBP Equity:Opening-balance """ result = beancount2ledger.convert(entries) self.assertLines( r""" account Assets:Cash account Equity:Opening-balance 2020-01-01 * Opening balance: cash Assets:Cash 0.10 EUR Assets:Cash 1.00 GBP Equity:Opening-balance """, result)
def test_tags_links(self, entries, _, ___): """ 2019-01-25 open Assets:A 2019-01-25 open Assets:B 2019-01-25 * "Test tags" #foo ^link2 #bar #baz ^link1 Assets:A 10.00 EUR Assets:B -10.00 EUR """ result = beancount2ledger.convert(entries) self.assertLines( """ account Assets:A account Assets:B 2019-01-25 * Test tags ; :bar:baz:foo: ; Link: link1, link2 Assets:A 10.00 EUR Assets:B -10.00 EUR """, result)
def test_cost_info(self, entries, _, ___): """ 2020-01-01 open Expenses:Computers 2020-01-01 open Assets:Bank 2020-02-01 * "Super Shop" "New computer" Expenses:Computers 1 COMPUTER {900.00 USD, 2019-12-25, "DiscountedComputer"} @ 1100.00 USD Assets:Bank 2020-02-02 * "Super Shop" "New computer" Expenses:Computers 1 COMPUTER {900.00 USD, "DiscountedComputer"} @ 1100.00 USD Assets:Bank 2020-02-03 * "Super Shop" "New computer" Expenses:Computers 1 COMPUTER {900.00 USD, 2019-12-25} @ 1100.00 USD Assets:Bank """ # NoQA: E501 line too long result = beancount2ledger.convert(entries) self.assertLines( """ account Expenses:Computers account Assets:Bank 2020-02-01 * Super Shop | New computer Expenses:Computers 1 COMPUTER {900.00 USD} [2019-12-25] (DiscountedComputer) @ 1100.00 USD Assets:Bank 2020-02-02 * Super Shop | New computer Expenses:Computers 1 COMPUTER {900.00 USD} (DiscountedComputer) @ 1100.00 USD Assets:Bank 2020-02-03 * Super Shop | New computer Expenses:Computers 1 COMPUTER {900.00 USD} [2019-12-25] @ 1100.00 USD Assets:Bank """, # NoQA: E501 line too long result, )
def test_avoid_too_much_precision(self, entries, _, ___): """ 2020-01-01 open Assets:Property 2020-01-01 open Equity:Opening-Balance 2020-10-23 * "Test of precision for EUR" Assets:Property 0.11110000 FOO {300.00 EUR} Equity:Opening-Balance -33.33 EUR 2020-10-23 * "Test of precision for EUR" Assets:Property 0.11110000 FOO {300.00 EUR} Equity:Opening-Balance 2020-10-23 * "Test of precision for EUR" Assets:Property 0.1111 FOO {300.00 EUR} Equity:Opening-Balance """ result = beancount2ledger.convert(entries, "hledger") self.assertLines( r""" account Assets:Property account Equity:Opening-Balance 2020-10-23 * Test of precision for EUR Assets:Property 0.11110000 FOO @ 300.00 EUR Equity:Opening-Balance -33.33 EUR 2020-10-23 * Test of precision for EUR Assets:Property 0.11110000 FOO @ 300.00 EUR Equity:Opening-Balance 2020-10-23 * Test of precision for EUR Assets:Property 0.11110000 FOO @ 300.00 EUR Equity:Opening-Balance """, result, )
def test_add_price_when_needed(self, entries, _, ___): """ 2020-01-01 open Assets:Property 2020-01-01 open Equity:Opening-Balance 2020-11-13 * "Cost without price" Assets:Property 0.1 FOO {300.00 EUR} Assets:Property 0.2 BAR {200.00 EUR} Equity:Opening-Balance -70.00 EUR """ result = beancount2ledger.convert(entries, "hledger") self.assertLines( r""" account Assets:Property account Equity:Opening-Balance 2020-11-13 * Cost without price Assets:Property 0.1 FOO @ 300.00 EUR Assets:Property 0.2 BAR @ 200.00 EUR Equity:Opening-Balance -70.00 EUR """, result, )
def test_code(self, entries, _, ___): """ 2020-01-01 open Assets:Test 2020-01-01 open Equity:Opening-Balance 2020-11-12 * "No code" Assets:Test 10.00 EUR Equity:Opening-Balance 2020-11-12 * "Code is integer" code: 1234 Assets:Test 10.00 EUR Equity:Opening-Balance 2020-11-12 * "Code is string" code: "string" Assets:Test 10.00 EUR Equity:Opening-Balance 2020-11-12 * "Code is date" code: 2020-11-12 Assets:Test 10.00 EUR Equity:Opening-Balance 2020-11-12 * "Code is empty" code: Assets:Test 10.00 EUR Equity:Opening-Balance 2020-11-12 * "Code and aux-date" aux-date: 2020-11-03 code: 1234 Assets:Test 10.00 EUR Equity:Opening-Balance """ result = beancount2ledger.convert(entries) self.assertLines( r""" account Assets:Test account Equity:Opening-Balance 2020-11-12 * No code Assets:Test 10.00 EUR Equity:Opening-Balance 2020-11-12 * Code is integer ; code:: 1234 Assets:Test 10.00 EUR Equity:Opening-Balance 2020-11-12 * Code is string ; code: string Assets:Test 10.00 EUR Equity:Opening-Balance 2020-11-12 * Code is date ; code:: [2020-11-12] Assets:Test 10.00 EUR Equity:Opening-Balance 2020-11-12 * Code is empty ; code: Assets:Test 10.00 EUR Equity:Opening-Balance 2020-11-12 * Code and aux-date ; aux-date:: [2020-11-03] ; code:: 1234 Assets:Test 10.00 EUR Equity:Opening-Balance """, result) config = {"code": "code", "auxdate": "aux-date"} result = beancount2ledger.convert(entries, config=config) self.assertLines( r""" account Assets:Test account Equity:Opening-Balance 2020-11-12 * No code Assets:Test 10.00 EUR Equity:Opening-Balance 2020-11-12 * (1234) Code is integer Assets:Test 10.00 EUR Equity:Opening-Balance 2020-11-12 * (string) Code is string Assets:Test 10.00 EUR Equity:Opening-Balance 2020-11-12 * (2020-11-12) Code is date Assets:Test 10.00 EUR Equity:Opening-Balance 2020-11-12 * Code is empty ; code: Assets:Test 10.00 EUR Equity:Opening-Balance 2020-11-12=2020-11-03 * (1234) Code and aux-date Assets:Test 10.00 EUR Equity:Opening-Balance """, result)
def test_auxdate(self, entries, _, ___): """ 2020-01-01 open Assets:Test 2020-01-01 open Equity:Opening-Balance 2020-11-12 * "Test with aux date" aux-date: 2020-11-03 Assets:Test 10.00 EUR Equity:Opening-Balance 2020-11-12 * "Test with transaction and posting aux date" aux-date: 2020-11-03 Assets:Test 10.00 EUR aux-date: 2020-11-04 Equity:Opening-Balance 2020-11-12 * "Test with posting date" Assets:Test 10.00 EUR date: 2020-11-03 Equity:Opening-Balance -10.00 EUR date: 2020-11-04 test: "foo" 2020-11-12 * "Testing with posting date and posting aux date" Assets:Test 10.00 EUR aux-date: 2020-11-04 date: 2020-11-03 Equity:Opening-Balance -10.00 EUR date: 2020-11-03 aux-date: 2020-11-04 test: "foo" """ result = beancount2ledger.convert(entries) self.assertLines( r""" account Assets:Test account Equity:Opening-Balance 2020-11-12 * Test with aux date ; aux-date:: [2020-11-03] Assets:Test 10.00 EUR Equity:Opening-Balance 2020-11-12 * Test with transaction and posting aux date ; aux-date:: [2020-11-03] Assets:Test 10.00 EUR ; aux-date:: [2020-11-04] Equity:Opening-Balance 2020-11-12 * Test with posting date Assets:Test 10.00 EUR ; date:: [2020-11-03] Equity:Opening-Balance -10.00 EUR ; date:: [2020-11-04] ; test: foo 2020-11-12 * Testing with posting date and posting aux date Assets:Test 10.00 EUR ; aux-date:: [2020-11-04] ; date:: [2020-11-03] Equity:Opening-Balance -10.00 EUR ; date:: [2020-11-03] ; aux-date:: [2020-11-04] ; test: foo """, result) config = {"auxdate": "aux-date", "postdate": "date"} result = beancount2ledger.convert(entries, config=config) self.assertLines( r""" account Assets:Test account Equity:Opening-Balance 2020-11-12=2020-11-03 * Test with aux date Assets:Test 10.00 EUR Equity:Opening-Balance 2020-11-12=2020-11-03 * Test with transaction and posting aux date Assets:Test 10.00 EUR ; [=2020-11-04] Equity:Opening-Balance 2020-11-12 * Test with posting date Assets:Test 10.00 EUR ; [2020-11-03] Equity:Opening-Balance -10.00 EUR ; [2020-11-04] ; test: foo 2020-11-12 * Testing with posting date and posting aux date Assets:Test 10.00 EUR ; [2020-11-03=2020-11-04] Equity:Opening-Balance -10.00 EUR ; [2020-11-03=2020-11-04] ; test: foo """, result) config = {"auxdate": "aux-date"} result = beancount2ledger.convert(entries, config=config) self.assertLines( r""" account Assets:Test account Equity:Opening-Balance 2020-11-12=2020-11-03 * Test with aux date Assets:Test 10.00 EUR Equity:Opening-Balance 2020-11-12=2020-11-03 * Test with transaction and posting aux date Assets:Test 10.00 EUR ; [=2020-11-04] Equity:Opening-Balance 2020-11-12 * Test with posting date Assets:Test 10.00 EUR ; date:: [2020-11-03] Equity:Opening-Balance -10.00 EUR ; date:: [2020-11-04] ; test: foo 2020-11-12 * Testing with posting date and posting aux date Assets:Test 10.00 EUR ; [=2020-11-04] ; date:: [2020-11-03] Equity:Opening-Balance -10.00 EUR ; [=2020-11-04] ; date:: [2020-11-03] ; test: foo """, result)
def test_account_open(self, entries, _, ___): """ 2019-01-25 open Assets:A """ result = beancount2ledger.convert(entries) self.assertEqual("account Assets:A\n", result)