Files @ 5784068904e8
Branch filter:

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

bkuhn
payroll-type — US:403b:Employee:Roth — needed separate since taxable

Since Roth contributions are taxable, there are some reports that
need to include these amounts in total salary (i.e., when running a
report that seeks to show total taxable income for an employee). As
such, we need a `payroll-type` specifically for Roth 403(b)
contributions.
"""test_pdfforms_extract.py - Unit tests for PDF form extractor"""
# 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 itertools

import pytest
import yaml

from . import testutil

from pathlib import Path

from conservancy_beancount.pdfforms import extract as extractmod

def compare_to_yaml(actual, yaml_path, from_file, form_key):
    if isinstance(yaml_path, str):
        yaml_path = testutil.test_path(f'pdfforms/{yaml_path}')
    with yaml_path.open() as yaml_file:
        expect_fields = yaml.safe_load(yaml_file)['fields']
    assert actual.get('from file') == from_file
    assert actual.get('form key') == form_key
    for act_f, exp_f in itertools.zip_longest(actual.get('fields', ()), expect_fields):
        for key, exp_value in exp_f.items():
            assert act_f[key] == exp_value

@pytest.mark.parametrize('fdf_filename,form_key,fields_yaml', [
    ('form1.fdf', 'FDF', 'form1.yml'),
])
def test_extract_from_path(fdf_filename, form_key, fields_yaml):
    fdf_path = testutil.test_path(f'pdfforms/{fdf_filename}')
    with extractmod.FormExtractor.from_path(fdf_path) as extractor:
        actual = extractor.extract()
    compare_to_yaml(actual, fields_yaml, fdf_filename, form_key)

@pytest.mark.parametrize('fdf_filename,form_key,fields_yaml', [
    ('form1.fdf', 'FDF', 'form1.yml'),
])
def test_extract_from_file(fdf_filename, form_key, fields_yaml):
    with testutil.test_path(f'pdfforms/{fdf_filename}').open('rb') as fdf_file:
        extractor = extractmod.FormExtractor.from_file(fdf_file)
        actual = extractor.extract()
    compare_to_yaml(actual, fields_yaml, fdf_filename, form_key)

@pytest.mark.parametrize('fdf_filename,form_key,fields_yaml', [
    ('form1_fill.fdf', 'FDF', 'form1_fill.yml'),
])
def test_extract_from_file(fdf_filename, form_key, fields_yaml):
    with testutil.test_path(f'pdfforms/{fdf_filename}').open('rb') as fdf_file:
        extractor = extractmod.FormExtractor.from_file(fdf_file)
        actual = extractor.extract()
    compare_to_yaml(actual, fields_yaml, fdf_filename, form_key)

@pytest.mark.parametrize('fdf_filename,form_key,fields_yaml', [
    ('form1.fdf', 'FDF', 'form1.yml'),
])
def test_main(fdf_filename, form_key, fields_yaml):
    fdf_path = testutil.test_path(f'pdfforms/{fdf_filename}')
    arglist = [str(fdf_path)]
    stdout = io.StringIO()
    stderr = io.StringIO()
    returncode = extractmod.main(arglist, stdout, stderr)
    assert returncode == 0
    assert not stderr.getvalue()
    stdout.seek(0)
    actual = yaml.safe_load(stdout)
    compare_to_yaml(actual, fields_yaml, fdf_filename, form_key)