Blame test_pyproject_buildrequires.py

50645e1
from pathlib import Path
390b971
import importlib.metadata
50645e1
9d4e88e
import packaging.version
50645e1
import pytest
9d4e88e
import setuptools
50645e1
import yaml
50645e1
50645e1
from pyproject_buildrequires import generate_requires
50645e1
9d4e88e
SETUPTOOLS_VERSION = packaging.version.parse(setuptools.__version__)
9d4e88e
SETUPTOOLS_60 = SETUPTOOLS_VERSION >= packaging.version.parse('60')
d262d90
50645e1
testcases = {}
2800b49
with Path(__file__).parent.joinpath('pyproject_buildrequires_testcases.yaml').open() as f:
50645e1
    testcases = yaml.safe_load(f)
50645e1
50645e1
50645e1
@pytest.mark.parametrize('case_name', testcases)
40f6765
def test_data(case_name, capfd, tmp_path, monkeypatch):
50645e1
    case = testcases[case_name]
50645e1
50645e1
    cwd = tmp_path.joinpath('cwd')
50645e1
    cwd.mkdir()
50645e1
    monkeypatch.chdir(cwd)
40f6765
    wheeldir = cwd.joinpath('wheeldir')
40f6765
    wheeldir.mkdir()
4569036
    output = tmp_path.joinpath('output.txt')
50645e1
aca2f6a
    if case.get('xfail'):
aca2f6a
        pytest.xfail(case.get('xfail'))
aca2f6a
9d4e88e
    if case.get('skipif') and eval(case.get('skipif')):
9d4e88e
        pytest.skip(case.get('skipif'))
9d4e88e
d6ad9a7
    for filename in case:
9d4e88e
        file_types = ('.toml', '.py', '.in', '.ini', '.txt', '.cfg')
d6ad9a7
        if filename.endswith(file_types):
8a60635
            cwd.joinpath(filename).write_text(case[filename])
50645e1
aeb21f6
    for name, value in case.get('environ', {}).items():
aeb21f6
        monkeypatch.setenv(name, value)
aeb21f6
d262d90
    def get_installed_version(dist_name):
d262d90
        try:
d262d90
            return str(case['installed'][dist_name])
d262d90
        except (KeyError, TypeError):
390b971
            raise importlib.metadata.PackageNotFoundError(
d262d90
                f'info not found for {dist_name}'
d262d90
            )
d6ad9a7
    requirement_files = case.get('requirement_files', [])
d6ad9a7
    requirement_files = [open(f) for f in requirement_files]
8c8afba
    use_build_system = case.get('use_build_system', True)
50645e1
    try:
50645e1
        generate_requires(
d262d90
            get_installed_version=get_installed_version,
8c8afba
            include_runtime=case.get('include_runtime', use_build_system),
40f6765
            build_wheel=case.get('build_wheel', False),
40f6765
            wheeldir=str(wheeldir),
2ecbed7
            extras=case.get('extras', []),
8a60635
            toxenv=case.get('toxenv', None),
a613e17
            generate_extras=case.get('generate_extras', False),
d6ad9a7
            requirement_files=requirement_files,
8c8afba
            use_build_system=use_build_system,
4569036
            output=output,
156e2fc
            config_settings=case.get('config_settings'),
50645e1
        )
50645e1
    except SystemExit as e:
50645e1
        assert e.code == case['result']
50645e1
    except Exception as e:
bc156c4
        if 'except' not in case:
bc156c4
            raise
50645e1
        assert type(e).__name__ == case['except']
50645e1
    else:
50645e1
        assert 0 == case['result']
50645e1
ddaf2e9
        # this prevents us from accidentally writing "empty" tests
ddaf2e9
        # if we ever need to do that, we can remove the check or change it:
ddaf2e9
        assert 'expected' in case or 'stderr_contains' in case
ddaf2e9
40f6765
        out, err = capfd.readouterr()
4569036
        dependencies = output.read_text()
ddaf2e9
ddaf2e9
        if 'expected' in case:
d06c69a
            expected = case['expected']
d06c69a
            if isinstance(expected, list):
d06c69a
                # at least one of them needs to match
ef9a286
                assert dependencies in expected
d06c69a
            else:
4569036
                assert dependencies == expected
aeb21f6
aeb21f6
        # stderr_contains may be a string or list of strings
aeb21f6
        stderr_contains = case.get('stderr_contains')
aeb21f6
        if stderr_contains is not None:
aeb21f6
            if isinstance(stderr_contains, str):
aeb21f6
                stderr_contains = [stderr_contains]
aeb21f6
            for expected_substring in stderr_contains:
40f6765
                assert expected_substring.format(**locals()) in err
d6ad9a7
    finally:
d6ad9a7
        for req in requirement_files:
d6ad9a7
            req.close()