|
1 | 1 | import re |
| 2 | +from itertools import chain |
2 | 3 | from pathlib import Path |
3 | 4 |
|
4 | 5 | import pytest |
5 | 6 | from pytest_cases import parametrize_with_cases |
6 | 7 |
|
7 | | -from tests.helpers import run_command |
8 | | -from tests.test_venv_install_cases import CasesVenvInstallDevRequirementstxt, CasesVenvInstallRequirementstxt |
| 8 | +from tests.helpers import run_command, write_files |
| 9 | +from tests.test_venv_install_cases import CasesVenvInstallRequirementstxt |
| 10 | +from tests.types import RequirementsBase, RequirementsDict |
9 | 11 |
|
10 | | -_package_regex = re.compile(r"^([a-zA-Z0-9_-]+)\b") |
| 12 | +_package_name_regex = re.compile(r"^([a-zA-Z0-9_-]+)\b") |
11 | 13 |
|
12 | 14 |
|
13 | | -@pytest.mark.order(after="test_venv_activate.py::test_venv_activate") |
14 | | -@pytest.mark.parametrize("command_arg", ["", "requirements.txt"]) |
15 | | -@parametrize_with_cases(argnames=["files"], cases=CasesVenvInstallRequirementstxt) |
16 | | -def test_venv_install_requirements_txt( |
17 | | - command_arg: str, |
18 | | - files: dict[str, str], |
19 | | - tmp_path: Path, |
20 | | - capfd: pytest.CaptureFixture, |
21 | | -): |
22 | | - (tmp_path / "requirements.txt").write_text(files["requirements.txt"]) |
23 | | - |
24 | | - # Install the requirements |
25 | | - run_command(f"venv install {command_arg} --skip-lock", cwd=tmp_path, activated=True) |
26 | | - |
27 | | - # Check pip install log output |
28 | | - output: str = capfd.readouterr().out |
29 | | - assert "Installing requirements from requirements.txt" in output |
30 | | - |
31 | | - installed_line = [line for line in output.splitlines() if line.startswith("Successfully installed")][0] |
32 | | - for requirement in files["requirements.txt"].splitlines(): |
33 | | - re_match = _package_regex.match(requirement) |
34 | | - if re_match is None: |
35 | | - raise ValueError(f"Could not extract package name from requirement '{requirement}'") |
| 15 | +def _check_package_was_installed(requirement: str, installed_line: str) -> None: |
| 16 | + """Check the 'Succesfully installed ...' output from 'pip install' to see that requirement was installed""" |
| 17 | + re_match = _package_name_regex.match(requirement) |
| 18 | + if re_match is None: |
| 19 | + raise ValueError(f"Could not extract package name from requirement '{requirement}'") |
36 | 20 |
|
37 | | - package_name = re_match.group() |
38 | | - assert package_name in installed_line |
| 21 | + package_name = re_match.group() |
| 22 | + assert package_name in installed_line, f"Package {package_name} was not installed succesfully" |
39 | 23 |
|
40 | 24 |
|
41 | 25 | @pytest.mark.order(after="test_venv_activate.py::test_venv_activate") |
42 | | -@parametrize_with_cases(argnames=["files"], cases=CasesVenvInstallDevRequirementstxt) |
43 | | -def test_venv_install_dev_requirements_txt( |
44 | | - files: dict[str, str], |
| 26 | +@parametrize_with_cases(argnames=["files", "requirements_base"], cases=CasesVenvInstallRequirementstxt) |
| 27 | +@pytest.mark.parametrize("use_file_name", [True, False]) |
| 28 | +def test_venv_install_requirements( |
| 29 | + files: RequirementsDict, |
| 30 | + requirements_base: RequirementsBase, |
| 31 | + use_file_name: bool, |
45 | 32 | tmp_path: Path, |
46 | 33 | capfd: pytest.CaptureFixture, |
47 | 34 | ): |
48 | | - for file_name, contents in files.items(): |
49 | | - (tmp_path / file_name).write_text(contents) |
| 35 | + write_files(files=files, dir=tmp_path) |
50 | 36 |
|
51 | 37 | # Install the requirements |
52 | | - run_command("venv install dev-requirements.txt --skip-lock", cwd=tmp_path, activated=True) |
| 38 | + if not (requirements_base is RequirementsBase.requirements or use_file_name): |
| 39 | + pytest.skip(f"Empty file name case only valid for requirements.txt, not {requirements_base}") |
| 40 | + |
| 41 | + install_file_name = "" |
| 42 | + if use_file_name: |
| 43 | + install_file_name = f"{requirements_base.value}.txt" |
| 44 | + |
| 45 | + run_command( |
| 46 | + f"venv install {install_file_name} --skip-lock", |
| 47 | + cwd=tmp_path, |
| 48 | + activated=True, |
| 49 | + ) |
53 | 50 |
|
54 | 51 | # Check pip install log output |
55 | 52 | output: str = capfd.readouterr().out |
56 | | - assert "Installing requirements from dev-requirements.txt" in output |
| 53 | + assert f"Installing requirements from {requirements_base.value}.txt" in output |
57 | 54 |
|
58 | 55 | installed_line = [line for line in output.splitlines() if line.startswith("Successfully installed")][0] |
59 | | - for requirement in [ |
60 | | - *files["requirements.txt"].splitlines(), |
61 | | - *files["dev-requirements.txt"].splitlines(), |
62 | | - ]: |
| 56 | + requirement_lines = chain.from_iterable(contents.splitlines() for contents in files.values()) |
| 57 | + for requirement in requirement_lines: |
63 | 58 | if requirement.startswith("-r"): |
64 | 59 | # Skip '-r requirements.txt' line |
65 | 60 | continue |
66 | 61 |
|
67 | 62 | _check_package_was_installed(requirement=requirement, installed_line=installed_line) |
68 | | - |
69 | | - |
70 | | -def _check_package_was_installed(requirement: str, installed_line: str) -> None: |
71 | | - re_match = _package_regex.match(requirement) |
72 | | - if re_match is None: |
73 | | - raise ValueError(f"Could not extract package name from requirement '{requirement}'") |
74 | | - |
75 | | - package_name = re_match.group() |
76 | | - assert package_name in installed_line |
0 commit comments