Files @ 5a8da108b983
Branch filter:

Location: NPO-Accounting/conservancy_beancount/tests/test_extract_odf_links.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_extract_odf_links.py - Unit tests for ODF link extraction"""
# 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 io
import sys

import pytest

from pathlib import Path

from . import testutil

from conservancy_beancount.tools import extract_odf_links

SRC_PATH = testutil.test_path('repository/LinksReport.ods')
BAD_PATH_S = str(testutil.test_path('repository/Projects/Bad Link.txt'))

INCLUDED_FILE_LINKS = {
    Path('/repository/Projects/project-data.yml'),
    Path('Projects/project-data.yml'),
    Path('Projects/Bad Link.txt'),
}

def expected_links(rel_path):
    return frozenset(
        str(path if path.is_absolute() else rel_path / path)
        for path in INCLUDED_FILE_LINKS
    )

def check_output(stdout, sep, rel_path):
    actual = stdout.getvalue().split(sep)
    if actual and not actual[-1]:
        actual.pop()
    expected = expected_links(rel_path)
    assert len(actual) == len(expected)
    assert set(actual) == expected

@pytest.mark.parametrize('arglist,sep', [
    (['-0'], '\0'),
    (['-d', '\\v'], '\v'),
    ([str(SRC_PATH)], '\n'),  # Test that links aren't duplicated
])
def test_extract_file_links(arglist, sep, caplog):
    arglist.append(str(SRC_PATH))
    stdout = io.StringIO()
    stderr = io.StringIO()
    exitcode = extract_odf_links.main(arglist, stdout, stderr)
    assert exitcode == 0
    assert not stderr.getvalue()
    check_output(stdout, sep, SRC_PATH.parent)
    assert caplog.records
    assert any(
        log.levelname == 'WARNING'
        and log.message.startswith('link path not found: ')
        and log.message.endswith(BAD_PATH_S)
        for log in caplog.records
    )

@pytest.mark.parametrize('rel_path', [
    Path('/run'),
    Path('/tmp'),
])
def test_extract_relative_to(rel_path):
    arglist = ['--relative', str(rel_path), '-0', '-']
    stdout = io.StringIO()
    stderr = io.StringIO()
    orig_stdin = sys.stdin
    try:
        sys.stdin = SRC_PATH.open('rb')
        exitcode = extract_odf_links.main(arglist, stdout, stderr)
    finally:
        sys.stdin = orig_stdin
    assert exitcode == 0
    assert not stderr.getvalue()
    check_output(stdout, '\0', rel_path)

def test_reading_stdin_requires_relative_to():
    with pytest.raises(SystemExit) as exc_check:
        extract_odf_links.main(['-'])
    assert exc_check.value.args[0] == 2