114 lines
3.6 KiB
Python
114 lines
3.6 KiB
Python
"""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
|