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