"""Test Metadata class""" # 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. import pytest from . import testutil from conservancy_beancount import data @pytest.fixture def simple_txn(index=None, key=None): return testutil.Transaction(note='txn note', postings=[ ('Assets:Cash', 5), ('Income:Donations', -5, {'note': 'donation love', 'extra': 'Extra'}), ]) SIMPLE_TXN_METAKEYS = frozenset(['filename', 'lineno', 'note']) LINK_STRINGS = [ '', 'link', ' link', 'link ', 'link1 link2', ' link1 link2 link3 ', ] def test_metadata_transforms_source(): source = {'1': 'one'} meta = data.Metadata(source) meta['2'] = 'two' assert source['2'] == 'two' del meta['1'] assert set(source) == {'2'} @pytest.mark.parametrize('value', LINK_STRINGS) def test_get_links(value): meta = data.Metadata({'key': value}) assert list(meta.get_links('key')) == value.split() def test_get_links_missing(): meta = data.Metadata({}) assert not meta.get_links('key') @pytest.mark.parametrize('value', testutil.NON_STRING_METADATA_VALUES) def test_get_links_bad_type(value): meta = data.Metadata({'key': value}) with pytest.raises(TypeError): meta.get_links('key') @pytest.mark.parametrize('value', LINK_STRINGS) def test_report_links(value): meta = data.Metadata({'key': value}) assert list(meta.report_links('key')) == value.split() def test_report_links_missing(): meta = data.Metadata({}) assert not meta.report_links('key') @pytest.mark.parametrize('value', testutil.NON_STRING_METADATA_VALUES) def test_report_links_bad_type(value): meta = data.Metadata({'key': value}) assert not meta.report_links('key') def test_first_link_from_txn(simple_txn): meta = data.PostingMeta(simple_txn, 0) assert meta.first_link('note') == 'txn' def test_first_link_from_post_override(simple_txn): meta = data.PostingMeta(simple_txn, 1) assert meta.first_link('note') == 'donation' def test_first_link_is_only_link(simple_txn): meta = data.PostingMeta(simple_txn, 1) assert meta.first_link('extra') == 'Extra' def test_first_link_nonexistent_metadata(simple_txn): meta = data.PostingMeta(simple_txn, 1) assert meta.first_link('Nonexistent') is None def test_first_link_nonexistent_default(simple_txn): meta = data.PostingMeta(simple_txn, 1) assert meta.first_link('Nonexistent', 'missing') == 'missing' @pytest.mark.parametrize('meta_value', testutil.NON_STRING_METADATA_VALUES) def test_first_link_bad_type_metadata(simple_txn, meta_value): simple_txn.meta['badmeta'] = meta_value meta = data.PostingMeta(simple_txn, 1) assert meta.first_link('badmeta') is None @pytest.mark.parametrize('meta_value', testutil.NON_STRING_METADATA_VALUES) def test_first_link_bad_type_default(simple_txn, meta_value): simple_txn.meta['badmeta'] = meta_value meta = data.PostingMeta(simple_txn, 1) assert meta.first_link('badmeta', '_') == '_' @pytest.mark.parametrize('meta_name,expected', [ ('approval', 'Approval'), ('bank-id', 'Bank ID'), ('bank-statement', 'Bank Statement'), ('check-id', 'Check Number'), ('paypal-id', 'PayPal ID'), ('purchase-order', 'Purchase Order'), ('receipt', 'Receipt'), ('rt-id', 'Ticket'), ('tax-statement', 'Tax Statement'), ('meta_key', 'Meta Key'), ('meta_id', 'Meta ID'), ]) def test_human_name(meta_name, expected): assert data.Metadata.human_name(meta_name) == expected