File diff 1b7fdf4f3b00 → 13c66e8ce296
tests/test_pdfforms_extract.py
Show inline comments
 
new file 100644
 
"""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)