Files @ db59d2fc8ceb
Branch filter:

Location: NPO-Accounting/import2ledger/tests/test_main.py

Brett Smith
hooks.ledger_entry: Look up templates dynamically.

If there's a 'ledger entry' key in the entry data, use that value as the
name of the template to load. Thanks to this, nbpy2017 could collapse
multiple importers into one.

Otherwise, build a default template name based on the importer source, and
try to use that.

All the configuration names now end with "ledger entry" instead of starting
with "template". This makes it clearer what they're for, in case we
support other kinds of output templates in the future.

I ended up changing the names of some of the importers so the default
template name was nice, rather than specifying template names for all of
them, to reduce the amount of name discrepancies across the codebase.
import io
import pathlib

import pytest
from . import DATA_DIR, normalize_whitespace

from import2ledger import __main__ as i2lmain

ARGLIST = [
    '-C', (DATA_DIR / 'test_main.ini').as_posix(),
]

def run_main(arglist):
    stdout = io.StringIO()
    stderr = io.StringIO()
    exitcode = i2lmain.main(arglist, stdout, stderr)
    stdout.seek(0)
    stderr.seek(0)
    return exitcode, stdout, stderr

def iter_entries(in_file):
    lines = []
    for line in in_file:
        if line == '\n':
            if lines:
                yield ''.join(lines)
            lines = []
        else:
            lines.append(line)
    if lines:
        yield ''.join(lines)

def format_entry(entry_s, format_vars):
    return normalize_whitespace(entry_s).format_map(format_vars)

def format_entries(source, format_vars=None):
    if format_vars is None:
        format_vars = {}
    return (format_entry(e, format_vars) for e in iter_entries(source))

def expected_entries(path, format_vars=None):
    path = pathlib.Path(path)
    if not path.is_absolute():
        path = DATA_DIR / path
    with path.open() as in_file:
        return list(format_entries(in_file, format_vars))

def path_vars(path):
    return {
        'source_abspath': str(path),
        'source_name': path.name,
        'source_path': str(path),
    }

def test_fees_import():
    source_path = pathlib.Path(DATA_DIR, 'PatreonEarnings.csv')
    arglist = ARGLIST + [
        '-c', 'One',
        source_path.as_posix(),
    ]
    exitcode, stdout, _ = run_main(arglist)
    assert exitcode == 0
    actual = list(format_entries(stdout))
    expected = expected_entries('test_main_fees_import.ledger', path_vars(source_path))
    assert actual == expected

def test_date_range_import():
    source_path = pathlib.Path(DATA_DIR, 'PatreonEarnings.csv')
    arglist = ARGLIST + [
        '-c', 'One',
        '--date-range', '2017/10/01-',
        source_path.as_posix(),
    ]
    exitcode, stdout, _ = run_main(arglist)
    assert exitcode == 0
    actual = list(format_entries(stdout))
    valid = expected_entries('test_main_fees_import.ledger', path_vars(source_path))
    expected = [entry for entry in valid if entry.startswith('2017/10/')]
    assert actual == expected