Files @ 5a8da108b983
Branch filter:

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

bsturmfels
statement_reconciler: Add initial Chase bank CSV statement matching

We currently don't have many examples to work with, so haven't done any
significant testing of the matching accuracy between statement and books.
"""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