Files @ 6a3d64ff2250
Branch filter:

Location: NPO-Accounting/conservancy_beancount/tests/test_data_metadata.py

Brett Smith
fields: Change FieldType capitalization.

This is friendlier to the YAML input and consistent with FieldFlags.
Less consistent with the rest of the codebase, but local consistency matters
more IMO.
"""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'),
])
def test_human_name(meta_name, expected):
    assert data.Metadata.human_name(meta_name) == expected