summaryrefslogtreecommitdiff
path: root/test_pyproject_buildrequires.py
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2023-03-23 02:28:22 +0000
committerCoprDistGit <infra@openeuler.org>2023-03-23 02:28:22 +0000
commit6d8e39fe5ab063ff2a4c2a918cb6ad5b5d4aec45 (patch)
treebd5138cc2ba1ebbbdbc52bd269b506114f8caa12 /test_pyproject_buildrequires.py
parentb0e529d9a17eaf6cc3ff98b78de743e401913baf (diff)
automatic import of pyproject-rpm-macros
Diffstat (limited to 'test_pyproject_buildrequires.py')
-rw-r--r--test_pyproject_buildrequires.py90
1 files changed, 90 insertions, 0 deletions
diff --git a/test_pyproject_buildrequires.py b/test_pyproject_buildrequires.py
new file mode 100644
index 0000000..74f3ae8
--- /dev/null
+++ b/test_pyproject_buildrequires.py
@@ -0,0 +1,90 @@
+from pathlib import Path
+import importlib.metadata
+
+import pytest
+import yaml
+
+from pyproject_buildrequires import generate_requires
+
+
+testcases = {}
+with Path(__file__).parent.joinpath('pyproject_buildrequires_testcases.yaml').open() as f:
+ testcases = yaml.safe_load(f)
+
+
+@pytest.mark.parametrize('case_name', testcases)
+def test_data(case_name, capfd, tmp_path, monkeypatch):
+ case = testcases[case_name]
+
+ cwd = tmp_path.joinpath('cwd')
+ cwd.mkdir()
+ monkeypatch.chdir(cwd)
+ wheeldir = cwd.joinpath('wheeldir')
+ wheeldir.mkdir()
+
+ if case.get('xfail'):
+ pytest.xfail(case.get('xfail'))
+
+ for filename in case:
+ file_types = ('.toml', '.py', '.in', '.ini', '.txt')
+ if filename.endswith(file_types):
+ cwd.joinpath(filename).write_text(case[filename])
+
+ for name, value in case.get('environ', {}).items():
+ monkeypatch.setenv(name, value)
+
+ def get_installed_version(dist_name):
+ try:
+ return str(case['installed'][dist_name])
+ except (KeyError, TypeError):
+ raise importlib.metadata.PackageNotFoundError(
+ f'info not found for {dist_name}'
+ )
+ requirement_files = case.get('requirement_files', [])
+ requirement_files = [open(f) for f in requirement_files]
+ use_build_system = case.get('use_build_system', True)
+ try:
+ generate_requires(
+ get_installed_version=get_installed_version,
+ include_runtime=case.get('include_runtime', use_build_system),
+ build_wheel=case.get('build_wheel', False),
+ wheeldir=str(wheeldir),
+ extras=case.get('extras', []),
+ toxenv=case.get('toxenv', None),
+ generate_extras=case.get('generate_extras', False),
+ requirement_files=requirement_files,
+ use_build_system=use_build_system,
+ )
+ except SystemExit as e:
+ assert e.code == case['result']
+ except Exception as e:
+ if 'except' not in case:
+ raise
+ assert type(e).__name__ == case['except']
+ else:
+ assert 0 == case['result']
+
+ # this prevents us from accidentally writing "empty" tests
+ # if we ever need to do that, we can remove the check or change it:
+ assert 'expected' in case or 'stderr_contains' in case
+
+ out, err = capfd.readouterr()
+
+ if 'expected' in case:
+ expected = case['expected']
+ if isinstance(expected, list):
+ # at least one of them needs to match
+ assert any(out == e for e in expected)
+ else:
+ assert out == expected
+
+ # stderr_contains may be a string or list of strings
+ stderr_contains = case.get('stderr_contains')
+ if stderr_contains is not None:
+ if isinstance(stderr_contains, str):
+ stderr_contains = [stderr_contains]
+ for expected_substring in stderr_contains:
+ assert expected_substring.format(**locals()) in err
+ finally:
+ for req in requirement_files:
+ req.close()