Files @ 73cd942a4606
Branch filter:

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

Brett Smith
hooks: Ledger output hook uses its own config section.
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 + [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 + [
        '--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