diff --git a/tests/test_pdfforms_extract.py b/tests/test_pdfforms_extract.py new file mode 100644 index 0000000000000000000000000000000000000000..0f08fd6d96c26ba47d11be6cdd3a403208c91423 --- /dev/null +++ b/tests/test_pdfforms_extract.py @@ -0,0 +1,62 @@ +"""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) + 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.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)