Files @ 5784068904e8
Branch filter:

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

bkuhn
payroll-type — US:403b:Employee:Roth — needed separate since taxable

Since Roth contributions are taxable, there are some reports that
need to include these amounts in total salary (i.e., when running a
report that seeks to show total taxable income for an employee). As
such, we need a `payroll-type` specifically for Roth 403(b)
contributions.
"""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