Commit 7f2d405a by David Hotham Committed by GitHub

unit test type annotations (#7820)

parent 735235a0
...@@ -28,7 +28,7 @@ def test_cache_clear_all( ...@@ -28,7 +28,7 @@ def test_cache_clear_all(
repository_one: str, repository_one: str,
repository_cache_dir: Path, repository_cache_dir: Path,
cache: CacheManager, cache: CacheManager,
): ) -> None:
exit_code = tester.execute(f"cache clear {repository_one} --all", inputs="yes") exit_code = tester.execute(f"cache clear {repository_one} --all", inputs="yes")
repository_one_dir = repository_cache_dir / repository_one repository_one_dir = repository_cache_dir / repository_one
...@@ -45,7 +45,7 @@ def test_cache_clear_all_no( ...@@ -45,7 +45,7 @@ def test_cache_clear_all_no(
repository_one: str, repository_one: str,
repository_cache_dir: Path, repository_cache_dir: Path,
cache: CacheManager, cache: CacheManager,
): ) -> None:
exit_code = tester.execute(f"cache clear {repository_one} --all", inputs="no") exit_code = tester.execute(f"cache clear {repository_one} --all", inputs="no")
assert exit_code == 0 assert exit_code == 0
...@@ -62,7 +62,7 @@ def test_cache_clear_pkg( ...@@ -62,7 +62,7 @@ def test_cache_clear_pkg(
repository_one: str, repository_one: str,
cache: CacheManager, cache: CacheManager,
package_name: str, package_name: str,
): ) -> None:
exit_code = tester.execute( exit_code = tester.execute(
f"cache clear {repository_one}:{package_name}:0.1", inputs="yes" f"cache clear {repository_one}:{package_name}:0.1", inputs="yes"
) )
...@@ -77,7 +77,7 @@ def test_cache_clear_pkg_no( ...@@ -77,7 +77,7 @@ def test_cache_clear_pkg_no(
tester: ApplicationTester, tester: ApplicationTester,
repository_one: str, repository_one: str,
cache: CacheManager, cache: CacheManager,
): ) -> None:
exit_code = tester.execute(f"cache clear {repository_one}:cachy:0.1", inputs="no") exit_code = tester.execute(f"cache clear {repository_one}:cachy:0.1", inputs="no")
assert exit_code == 0 assert exit_code == 0
......
...@@ -32,7 +32,7 @@ def tester(command_tester_factory: CommandTesterFactory) -> CommandTester: ...@@ -32,7 +32,7 @@ def tester(command_tester_factory: CommandTesterFactory) -> CommandTester:
return command_tester_factory("env info") return command_tester_factory("env info")
def test_env_info_displays_complete_info(tester: CommandTester): def test_env_info_displays_complete_info(tester: CommandTester) -> None:
tester.execute() tester.execute()
expected = f""" expected = f"""
...@@ -54,13 +54,13 @@ Executable: python ...@@ -54,13 +54,13 @@ Executable: python
assert tester.io.fetch_output() == expected assert tester.io.fetch_output() == expected
def test_env_info_displays_path_only(tester: CommandTester): def test_env_info_displays_path_only(tester: CommandTester) -> None:
tester.execute("--path") tester.execute("--path")
expected = str(Path("/prefix")) + "\n" expected = str(Path("/prefix")) + "\n"
assert tester.io.fetch_output() == expected assert tester.io.fetch_output() == expected
def test_env_info_displays_executable_only(tester: CommandTester): def test_env_info_displays_executable_only(tester: CommandTester) -> None:
tester.execute("--executable") tester.execute("--executable")
expected = str(sys.executable) + "\n" expected = str(sys.executable) + "\n"
assert tester.io.fetch_output() == expected assert tester.io.fetch_output() == expected
...@@ -87,7 +87,7 @@ def test_source_add_secondary_legacy( ...@@ -87,7 +87,7 @@ def test_source_add_secondary_legacy(
source_existing: Source, source_existing: Source,
source_secondary: Source, source_secondary: Source,
poetry_with_source: Poetry, poetry_with_source: Poetry,
): ) -> None:
tester.execute(f"--secondary {source_secondary.name} {source_secondary.url}") tester.execute(f"--secondary {source_secondary.name} {source_secondary.url}")
assert_source_added_legacy( assert_source_added_legacy(
tester, poetry_with_source, source_existing, source_secondary tester, poetry_with_source, source_existing, source_secondary
...@@ -99,7 +99,7 @@ def test_source_add_default( ...@@ -99,7 +99,7 @@ def test_source_add_default(
source_existing: Source, source_existing: Source,
source_default: Source, source_default: Source,
poetry_with_source: Poetry, poetry_with_source: Poetry,
): ) -> None:
tester.execute(f"--priority=default {source_default.name} {source_default.url}") tester.execute(f"--priority=default {source_default.name} {source_default.url}")
assert_source_added(tester, poetry_with_source, source_existing, source_default) assert_source_added(tester, poetry_with_source, source_existing, source_default)
...@@ -109,7 +109,7 @@ def test_source_add_second_default_fails( ...@@ -109,7 +109,7 @@ def test_source_add_second_default_fails(
source_existing: Source, source_existing: Source,
source_default: Source, source_default: Source,
poetry_with_source: Poetry, poetry_with_source: Poetry,
): ) -> None:
tester.execute(f"--priority=default {source_default.name} {source_default.url}") tester.execute(f"--priority=default {source_default.name} {source_default.url}")
assert_source_added(tester, poetry_with_source, source_existing, source_default) assert_source_added(tester, poetry_with_source, source_existing, source_default)
poetry_with_source.pyproject.reload() poetry_with_source.pyproject.reload()
...@@ -155,7 +155,7 @@ def test_source_add_error_default_and_secondary_legacy(tester: CommandTester) -> ...@@ -155,7 +155,7 @@ def test_source_add_error_default_and_secondary_legacy(tester: CommandTester) ->
assert tester.status_code == 1 assert tester.status_code == 1
def test_source_add_error_priority_and_deprecated_legacy(tester: CommandTester): def test_source_add_error_priority_and_deprecated_legacy(tester: CommandTester) -> None:
tester.execute("--priority secondary --secondary error https://error.com") tester.execute("--priority secondary --secondary error https://error.com")
assert ( assert (
tester.io.fetch_error().strip() tester.io.fetch_error().strip()
...@@ -204,7 +204,7 @@ def test_source_add_existing_legacy( ...@@ -204,7 +204,7 @@ def test_source_add_existing_legacy(
def test_source_add_existing_no_change( def test_source_add_existing_no_change(
tester: CommandTester, source_existing: Source, poetry_with_source: Poetry tester: CommandTester, source_existing: Source, poetry_with_source: Poetry
): ) -> None:
tester.execute(f"--priority=primary {source_existing.name} {source_existing.url}") tester.execute(f"--priority=primary {source_existing.name} {source_existing.url}")
assert ( assert (
tester.io.fetch_output().strip() tester.io.fetch_output().strip()
...@@ -220,7 +220,7 @@ def test_source_add_existing_no_change( ...@@ -220,7 +220,7 @@ def test_source_add_existing_no_change(
def test_source_add_existing_updating( def test_source_add_existing_updating(
tester: CommandTester, source_existing: Source, poetry_with_source: Poetry tester: CommandTester, source_existing: Source, poetry_with_source: Poetry
): ) -> None:
tester.execute(f"--priority=default {source_existing.name} {source_existing.url}") tester.execute(f"--priority=default {source_existing.name} {source_existing.url}")
assert ( assert (
tester.io.fetch_output().strip() tester.io.fetch_output().strip()
...@@ -243,7 +243,7 @@ def test_source_add_existing_fails_due_to_other_default( ...@@ -243,7 +243,7 @@ def test_source_add_existing_fails_due_to_other_default(
source_existing: Source, source_existing: Source,
source_default: Source, source_default: Source,
poetry_with_source: Poetry, poetry_with_source: Poetry,
): ) -> None:
tester.execute(f"--priority=default {source_default.name} {source_default.url}") tester.execute(f"--priority=default {source_default.name} {source_default.url}")
tester.io.fetch_output() tester.io.fetch_output()
......
...@@ -4,12 +4,14 @@ import sys ...@@ -4,12 +4,14 @@ import sys
from pathlib import Path from pathlib import Path
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from typing import cast
import pytest import pytest
from poetry.core.constraints.version import Version from poetry.core.constraints.version import Version
from poetry.core.packages.package import Package from poetry.core.packages.package import Package
from poetry.console.commands.installer_command import InstallerCommand
from poetry.puzzle.exceptions import SolverProblemError from poetry.puzzle.exceptions import SolverProblemError
from poetry.repositories.legacy_repository import LegacyRepository from poetry.repositories.legacy_repository import LegacyRepository
from tests.helpers import get_dependency from tests.helpers import get_dependency
...@@ -21,6 +23,7 @@ if TYPE_CHECKING: ...@@ -21,6 +23,7 @@ if TYPE_CHECKING:
from cleo.testers.command_tester import CommandTester from cleo.testers.command_tester import CommandTester
from pytest_mock import MockerFixture from pytest_mock import MockerFixture
from tomlkit import TOMLDocument
from poetry.poetry import Poetry from poetry.poetry import Poetry
from poetry.utils.env import MockEnv from poetry.utils.env import MockEnv
...@@ -86,9 +89,11 @@ Writing lock file ...@@ -86,9 +89,11 @@ Writing lock file
""" """
assert tester.io.fetch_output() == expected assert tester.io.fetch_output() == expected
assert isinstance(tester.command, InstallerCommand)
assert tester.command.installer.executor.installations_count == 1 assert tester.command.installer.executor.installations_count == 1
content = app.poetry.file.read()["tool"]["poetry"] pyproject: dict[str, Any] = app.poetry.file.read()
content = pyproject["tool"]["poetry"]
assert "cachy" in content["dependencies"] assert "cachy" in content["dependencies"]
assert content["dependencies"]["cachy"] == "^0.2.0" assert content["dependencies"]["cachy"] == "^0.2.0"
...@@ -115,9 +120,11 @@ Package operations: 1 install, 0 updates, 0 removals ...@@ -115,9 +120,11 @@ Package operations: 1 install, 0 updates, 0 removals
Writing lock file Writing lock file
""" """
assert tester.io.fetch_output() == expected assert tester.io.fetch_output() == expected
assert isinstance(tester.command, InstallerCommand)
assert tester.command.installer.executor.installations_count == 1 assert tester.command.installer.executor.installations_count == 1
content = app.poetry.file.read()["tool"]["poetry"] pyproject: dict[str, Any] = app.poetry.file.read()
content = pyproject["tool"]["poetry"]
assert "cachy" in content["dependencies"] assert "cachy" in content["dependencies"]
assert content["dependencies"]["cachy"] == "^0.2.0" assert content["dependencies"]["cachy"] == "^0.2.0"
...@@ -135,7 +142,8 @@ Writing lock file ...@@ -135,7 +142,8 @@ Writing lock file
""" """
assert tester.io.fetch_output() == expected assert tester.io.fetch_output() == expected
content = app.poetry.file.read()["tool"]["poetry"] pyproject2: dict[str, Any] = app.poetry.file.read()
content = pyproject2["tool"]["poetry"]
assert "cachy" in content["dependencies"] assert "cachy" in content["dependencies"]
assert content["dependencies"]["cachy"] == "0.1.0" assert content["dependencies"]["cachy"] == "0.1.0"
...@@ -144,7 +152,8 @@ Writing lock file ...@@ -144,7 +152,8 @@ Writing lock file
def test_add_no_constraint_editable_error( def test_add_no_constraint_editable_error(
app: PoetryTestApplication, repo: TestRepository, tester: CommandTester app: PoetryTestApplication, repo: TestRepository, tester: CommandTester
) -> None: ) -> None:
content = app.poetry.file.read()["tool"]["poetry"] pyproject: dict[str, Any] = app.poetry.file.read()
content = pyproject["tool"]["poetry"]
repo.add_package(get_package("cachy", "0.2.0")) repo.add_package(get_package("cachy", "0.2.0"))
...@@ -158,8 +167,11 @@ No changes were applied. ...@@ -158,8 +167,11 @@ No changes were applied.
""" """
assert tester.status_code == 1 assert tester.status_code == 1
assert tester.io.fetch_error() == expected assert tester.io.fetch_error() == expected
assert isinstance(tester.command, InstallerCommand)
assert tester.command.installer.executor.installations_count == 0 assert tester.command.installer.executor.installations_count == 0
assert content == app.poetry.file.read()["tool"]["poetry"]
pyproject2: dict[str, Any] = app.poetry.file.read()
assert content == pyproject2["tool"]["poetry"]
def test_add_equal_constraint( def test_add_equal_constraint(
...@@ -183,6 +195,7 @@ Writing lock file ...@@ -183,6 +195,7 @@ Writing lock file
""" """
assert tester.io.fetch_output() == expected assert tester.io.fetch_output() == expected
assert isinstance(tester.command, InstallerCommand)
assert tester.command.installer.executor.installations_count == 1 assert tester.command.installer.executor.installations_count == 1
...@@ -207,6 +220,7 @@ Writing lock file ...@@ -207,6 +220,7 @@ Writing lock file
""" """
assert tester.io.fetch_output() == expected assert tester.io.fetch_output() == expected
assert isinstance(tester.command, InstallerCommand)
assert tester.command.installer.executor.installations_count == 1 assert tester.command.installer.executor.installations_count == 1
...@@ -242,6 +256,7 @@ Writing lock file ...@@ -242,6 +256,7 @@ Writing lock file
""" """
assert tester.io.fetch_output() == expected assert tester.io.fetch_output() == expected
assert isinstance(tester.command, InstallerCommand)
assert tester.command.installer.executor.installations_count == 2 assert tester.command.installer.executor.installations_count == 2
...@@ -272,6 +287,7 @@ Writing lock file ...@@ -272,6 +287,7 @@ Writing lock file
""" """
assert tester.io.fetch_output() == expected assert tester.io.fetch_output() == expected
assert isinstance(tester.command, InstallerCommand)
assert tester.command.installer.executor.installations_count == 2 assert tester.command.installer.executor.installations_count == 2
...@@ -281,6 +297,7 @@ def test_add_git_constraint( ...@@ -281,6 +297,7 @@ def test_add_git_constraint(
tester: CommandTester, tester: CommandTester,
tmp_venv: VirtualEnv, tmp_venv: VirtualEnv,
) -> None: ) -> None:
assert isinstance(tester.command, InstallerCommand)
tester.command.set_env(tmp_venv) tester.command.set_env(tmp_venv)
repo.add_package(get_package("pendulum", "1.4.4")) repo.add_package(get_package("pendulum", "1.4.4"))
...@@ -304,7 +321,8 @@ Writing lock file ...@@ -304,7 +321,8 @@ Writing lock file
assert tester.io.fetch_output() == expected assert tester.io.fetch_output() == expected
assert tester.command.installer.executor.installations_count == 2 assert tester.command.installer.executor.installations_count == 2
content = app.poetry.file.read()["tool"]["poetry"] pyproject: dict[str, Any] = app.poetry.file.read()
content = pyproject["tool"]["poetry"]
assert "demo" in content["dependencies"] assert "demo" in content["dependencies"]
assert content["dependencies"]["demo"] == { assert content["dependencies"]["demo"] == {
...@@ -318,6 +336,7 @@ def test_add_git_constraint_with_poetry( ...@@ -318,6 +336,7 @@ def test_add_git_constraint_with_poetry(
tester: CommandTester, tester: CommandTester,
tmp_venv: VirtualEnv, tmp_venv: VirtualEnv,
) -> None: ) -> None:
assert isinstance(tester.command, InstallerCommand)
tester.command.set_env(tmp_venv) tester.command.set_env(tmp_venv)
repo.add_package(get_package("pendulum", "1.4.4")) repo.add_package(get_package("pendulum", "1.4.4"))
...@@ -349,6 +368,7 @@ def test_add_git_constraint_with_extras( ...@@ -349,6 +368,7 @@ def test_add_git_constraint_with_extras(
tmp_venv: VirtualEnv, tmp_venv: VirtualEnv,
extra_name: str, extra_name: str,
) -> None: ) -> None:
assert isinstance(tester.command, InstallerCommand)
tester.command.set_env(tmp_venv) tester.command.set_env(tmp_venv)
repo.add_package(get_package("pendulum", "1.4.4")) repo.add_package(get_package("pendulum", "1.4.4"))
...@@ -375,7 +395,8 @@ Writing lock file ...@@ -375,7 +395,8 @@ Writing lock file
assert tester.io.fetch_output().strip() == expected.strip() assert tester.io.fetch_output().strip() == expected.strip()
assert tester.command.installer.executor.installations_count == 4 assert tester.command.installer.executor.installations_count == 4
content = app.poetry.file.read()["tool"]["poetry"] pyproject: dict[str, Any] = app.poetry.file.read()
content = pyproject["tool"]["poetry"]
assert "demo" in content["dependencies"] assert "demo" in content["dependencies"]
assert content["dependencies"]["demo"] == { assert content["dependencies"]["demo"] == {
...@@ -415,9 +436,11 @@ Package operations: 1 install, 0 updates, 0 removals ...@@ -415,9 +436,11 @@ Package operations: 1 install, 0 updates, 0 removals
Writing lock file Writing lock file
""" """
assert tester.io.fetch_output().strip() == expected.strip() assert tester.io.fetch_output().strip() == expected.strip()
assert isinstance(tester.command, InstallerCommand)
assert tester.command.installer.executor.installations_count == 1 assert tester.command.installer.executor.installations_count == 1
content = app.poetry.file.read()["tool"]["poetry"] pyproject: dict[str, Any] = app.poetry.file.read()
content = pyproject["tool"]["poetry"]
constraint = { constraint = {
"git": "https://github.com/demo/subdirectories.git", "git": "https://github.com/demo/subdirectories.git",
...@@ -439,6 +462,7 @@ def test_add_git_ssh_constraint( ...@@ -439,6 +462,7 @@ def test_add_git_ssh_constraint(
tester: CommandTester, tester: CommandTester,
tmp_venv: VirtualEnv, tmp_venv: VirtualEnv,
) -> None: ) -> None:
assert isinstance(tester.command, InstallerCommand)
tester.command.set_env(tmp_venv) tester.command.set_env(tmp_venv)
repo.add_package(get_package("pendulum", "1.4.4")) repo.add_package(get_package("pendulum", "1.4.4"))
...@@ -463,7 +487,8 @@ Writing lock file ...@@ -463,7 +487,8 @@ Writing lock file
assert tester.io.fetch_output() == expected assert tester.io.fetch_output() == expected
assert tester.command.installer.executor.installations_count == 2 assert tester.command.installer.executor.installations_count == 2
content = app.poetry.file.read()["tool"]["poetry"] pyproject: dict[str, Any] = app.poetry.file.read()
content = pyproject["tool"]["poetry"]
assert "demo" in content["dependencies"] assert "demo" in content["dependencies"]
...@@ -508,9 +533,11 @@ Writing lock file ...@@ -508,9 +533,11 @@ Writing lock file
""" """
assert tester.io.fetch_output() == expected assert tester.io.fetch_output() == expected
assert isinstance(tester.command, InstallerCommand)
assert tester.command.installer.executor.installations_count == 2 assert tester.command.installer.executor.installations_count == 2
content = app.poetry.file.read()["tool"]["poetry"] pyproject: dict[str, Any] = app.poetry.file.read()
content = pyproject["tool"]["poetry"]
assert "demo" in content["dependencies"] assert "demo" in content["dependencies"]
...@@ -549,6 +576,7 @@ Writing lock file ...@@ -549,6 +576,7 @@ Writing lock file
""" """
assert tester.io.fetch_output() == expected assert tester.io.fetch_output() == expected
assert isinstance(tester.command, InstallerCommand)
assert tester.command.installer.executor.installations_count == 2 assert tester.command.installer.executor.installations_count == 2
...@@ -581,9 +609,11 @@ Writing lock file ...@@ -581,9 +609,11 @@ Writing lock file
""" """
assert tester.io.fetch_output() == expected assert tester.io.fetch_output() == expected
assert isinstance(tester.command, InstallerCommand)
assert tester.command.installer.executor.installations_count == 2 assert tester.command.installer.executor.installations_count == 2
content = app.poetry.file.read()["tool"]["poetry"] pyproject: dict[str, Any] = app.poetry.file.read()
content = pyproject["tool"]["poetry"]
assert "demo" in content["dependencies"] assert "demo" in content["dependencies"]
assert content["dependencies"]["demo"] == {"path": path} assert content["dependencies"]["demo"] == {"path": path}
...@@ -617,9 +647,11 @@ Writing lock file ...@@ -617,9 +647,11 @@ Writing lock file
""" """
assert tester.io.fetch_output() == expected assert tester.io.fetch_output() == expected
assert isinstance(tester.command, InstallerCommand)
assert tester.command.installer.executor.installations_count == 2 assert tester.command.installer.executor.installations_count == 2
content = app.poetry.file.read()["tool"]["poetry"] pyproject: dict[str, Any] = app.poetry.file.read()
content = pyproject["tool"]["poetry"]
assert "demo" in content["dependencies"] assert "demo" in content["dependencies"]
assert content["dependencies"]["demo"] == {"path": path} assert content["dependencies"]["demo"] == {"path": path}
...@@ -657,9 +689,11 @@ Writing lock file ...@@ -657,9 +689,11 @@ Writing lock file
""" """
assert tester.io.fetch_output() == expected assert tester.io.fetch_output() == expected
assert isinstance(tester.command, InstallerCommand)
assert tester.command.installer.executor.installations_count == 2 assert tester.command.installer.executor.installations_count == 2
content = app.poetry.file.read()["tool"]["poetry"] pyproject: dict[str, Any] = app.poetry.file.read()
content = pyproject["tool"]["poetry"]
assert "cachy" in content["dependencies"] assert "cachy" in content["dependencies"]
assert content["dependencies"]["cachy"] == { assert content["dependencies"]["cachy"] == {
...@@ -698,9 +732,11 @@ Writing lock file ...@@ -698,9 +732,11 @@ Writing lock file
""" """
assert tester.io.fetch_output() == expected assert tester.io.fetch_output() == expected
assert isinstance(tester.command, InstallerCommand)
assert tester.command.installer.executor.installations_count == 2 assert tester.command.installer.executor.installations_count == 2
content = app.poetry.file.read()["tool"]["poetry"] pyproject: dict[str, Any] = app.poetry.file.read()
content = pyproject["tool"]["poetry"]
assert "demo" in content["dependencies"] assert "demo" in content["dependencies"]
assert content["dependencies"]["demo"] == { assert content["dependencies"]["demo"] == {
...@@ -744,9 +780,11 @@ Writing lock file ...@@ -744,9 +780,11 @@ Writing lock file
expected = set(expected.splitlines()) expected = set(expected.splitlines())
output = set(tester.io.fetch_output().splitlines()) output = set(tester.io.fetch_output().splitlines())
assert output == expected assert output == expected
assert isinstance(tester.command, InstallerCommand)
assert tester.command.installer.executor.installations_count == 4 assert tester.command.installer.executor.installations_count == 4
content = app.poetry.file.read()["tool"]["poetry"] pyproject: dict[str, Any] = app.poetry.file.read()
content = pyproject["tool"]["poetry"]
assert "demo" in content["dependencies"] assert "demo" in content["dependencies"]
assert content["dependencies"]["demo"] == { assert content["dependencies"]["demo"] == {
...@@ -780,9 +818,11 @@ Writing lock file ...@@ -780,9 +818,11 @@ Writing lock file
""" """
assert tester.io.fetch_output() == expected assert tester.io.fetch_output() == expected
assert isinstance(tester.command, InstallerCommand)
assert tester.command.installer.executor.installations_count == 1 assert tester.command.installer.executor.installations_count == 1
content = app.poetry.file.read()["tool"]["poetry"] pyproject: dict[str, Any] = app.poetry.file.read()
content = pyproject["tool"]["poetry"]
assert "cachy" in content["dependencies"] assert "cachy" in content["dependencies"]
assert content["dependencies"]["cachy"] == {"version": "0.2.0", "python": ">=2.7"} assert content["dependencies"]["cachy"] == {"version": "0.2.0", "python": ">=2.7"}
...@@ -817,9 +857,11 @@ Writing lock file ...@@ -817,9 +857,11 @@ Writing lock file
""" """
assert tester.io.fetch_output() == expected assert tester.io.fetch_output() == expected
assert isinstance(tester.command, InstallerCommand)
assert tester.command.installer.executor.installations_count == 1 assert tester.command.installer.executor.installations_count == 1
content = app.poetry.file.read()["tool"]["poetry"] pyproject: dict[str, Any] = app.poetry.file.read()
content = pyproject["tool"]["poetry"]
assert "cachy" in content["dependencies"] assert "cachy" in content["dependencies"]
assert content["dependencies"]["cachy"] == { assert content["dependencies"]["cachy"] == {
...@@ -868,9 +910,11 @@ Writing lock file ...@@ -868,9 +910,11 @@ Writing lock file
""" """
assert tester.io.fetch_output() == expected assert tester.io.fetch_output() == expected
assert isinstance(tester.command, InstallerCommand)
assert tester.command.installer.executor.installations_count == 1 assert tester.command.installer.executor.installations_count == 1
content = app.poetry.file.read()["tool"]["poetry"] pyproject: dict[str, Any] = app.poetry.file.read()
content = pyproject["tool"]["poetry"]
assert "cachy" in content["dependencies"] assert "cachy" in content["dependencies"]
assert content["dependencies"]["cachy"] == { assert content["dependencies"]["cachy"] == {
...@@ -930,9 +974,11 @@ Writing lock file ...@@ -930,9 +974,11 @@ Writing lock file
""" """
assert tester.io.fetch_output() == expected assert tester.io.fetch_output() == expected
assert isinstance(tester.command, InstallerCommand)
assert tester.command.installer.executor.installations_count == 1 assert tester.command.installer.executor.installations_count == 1
content = app.poetry.file.read()["tool"]["poetry"] pyproject: dict[str, Any] = app.poetry.file.read()
content = pyproject["tool"]["poetry"]
assert "cachy" in content["group"]["dev"]["dependencies"] assert "cachy" in content["group"]["dev"]["dependencies"]
assert content["group"]["dev"]["dependencies"]["cachy"] == "^0.2.0" assert content["group"]["dev"]["dependencies"]["cachy"] == "^0.2.0"
...@@ -978,9 +1024,11 @@ Writing lock file ...@@ -978,9 +1024,11 @@ Writing lock file
assert tester.io.fetch_error() == warning assert tester.io.fetch_error() == warning
assert tester.io.fetch_output() == expected assert tester.io.fetch_output() == expected
assert isinstance(tester.command, InstallerCommand)
assert tester.command.installer.executor.installations_count == 1 assert tester.command.installer.executor.installations_count == 1
content = app.poetry.file.read()["tool"]["poetry"] pyproject: dict[str, Any] = app.poetry.file.read()
content = pyproject["tool"]["poetry"]
assert "cachy" in content["group"]["dev"]["dependencies"] assert "cachy" in content["group"]["dev"]["dependencies"]
assert content["group"]["dev"]["dependencies"]["cachy"] == "^0.2.0" assert content["group"]["dev"]["dependencies"]["cachy"] == "^0.2.0"
...@@ -1008,9 +1056,11 @@ Writing lock file ...@@ -1008,9 +1056,11 @@ Writing lock file
""" """
assert tester.io.fetch_output() == expected assert tester.io.fetch_output() == expected
assert isinstance(tester.command, InstallerCommand)
assert tester.command.installer.executor.installations_count == 1 assert tester.command.installer.executor.installations_count == 1
content = app.poetry.file.read()["tool"]["poetry"] pyproject: dict[str, Any] = app.poetry.file.read()
content = pyproject["tool"]["poetry"]
assert "pyyaml" in content["dependencies"] assert "pyyaml" in content["dependencies"]
assert content["dependencies"]["pyyaml"] == "^3.13" assert content["dependencies"]["pyyaml"] == "^3.13"
...@@ -1019,9 +1069,10 @@ Writing lock file ...@@ -1019,9 +1069,10 @@ Writing lock file
def test_add_should_skip_when_adding_existing_package_with_no_constraint( def test_add_should_skip_when_adding_existing_package_with_no_constraint(
app: PoetryTestApplication, repo: TestRepository, tester: CommandTester app: PoetryTestApplication, repo: TestRepository, tester: CommandTester
) -> None: ) -> None:
content = app.poetry.file.read() pyproject: dict[str, Any] = app.poetry.file.read()
content["tool"]["poetry"]["dependencies"]["foo"] = "^1.0" pyproject["tool"]["poetry"]["dependencies"]["foo"] = "^1.0"
app.poetry.file.write(content) pyproject = cast("TOMLDocument", pyproject)
app.poetry.file.write(pyproject)
repo.add_package(get_package("foo", "1.1.2")) repo.add_package(get_package("foo", "1.1.2"))
tester.execute("foo") tester.execute("foo")
...@@ -1043,9 +1094,10 @@ If you prefer to upgrade it to the latest available version,\ ...@@ -1043,9 +1094,10 @@ If you prefer to upgrade it to the latest available version,\
def test_add_should_skip_when_adding_canonicalized_existing_package_with_no_constraint( def test_add_should_skip_when_adding_canonicalized_existing_package_with_no_constraint(
app: PoetryTestApplication, repo: TestRepository, tester: CommandTester app: PoetryTestApplication, repo: TestRepository, tester: CommandTester
) -> None: ) -> None:
content = app.poetry.file.read() pyproject: dict[str, Any] = app.poetry.file.read()
content["tool"]["poetry"]["dependencies"]["foo-bar"] = "^1.0" pyproject["tool"]["poetry"]["dependencies"]["foo-bar"] = "^1.0"
app.poetry.file.write(content) pyproject = cast("TOMLDocument", pyproject)
app.poetry.file.write(pyproject)
repo.add_package(get_package("foo-bar", "1.1.2")) repo.add_package(get_package("foo-bar", "1.1.2"))
tester.execute("Foo_Bar") tester.execute("Foo_Bar")
...@@ -1098,28 +1150,29 @@ def test_add_latest_should_not_create_duplicate_keys( ...@@ -1098,28 +1150,29 @@ def test_add_latest_should_not_create_duplicate_keys(
""" """
poetry = project_factory(name="simple-project", pyproject_content=pyproject_content) poetry = project_factory(name="simple-project", pyproject_content=pyproject_content)
content = poetry.file.read() pyproject: dict[str, Any] = poetry.file.read()
assert "Foo" in content["tool"]["poetry"]["dependencies"] assert "Foo" in pyproject["tool"]["poetry"]["dependencies"]
assert content["tool"]["poetry"]["dependencies"]["Foo"] == "^0.6" assert pyproject["tool"]["poetry"]["dependencies"]["Foo"] == "^0.6"
assert "foo" not in content["tool"]["poetry"]["dependencies"] assert "foo" not in pyproject["tool"]["poetry"]["dependencies"]
tester = command_tester_factory("add", poetry=poetry) tester = command_tester_factory("add", poetry=poetry)
repo.add_package(get_package("foo", "1.1.2")) repo.add_package(get_package("foo", "1.1.2"))
tester.execute("foo@latest") tester.execute("foo@latest")
updated_content = poetry.file.read() updated_pyproject: dict[str, Any] = poetry.file.read()
assert "Foo" in updated_content["tool"]["poetry"]["dependencies"] assert "Foo" in updated_pyproject["tool"]["poetry"]["dependencies"]
assert updated_content["tool"]["poetry"]["dependencies"]["Foo"] == "^1.1.2" assert updated_pyproject["tool"]["poetry"]["dependencies"]["Foo"] == "^1.1.2"
assert "foo" not in updated_content["tool"]["poetry"]["dependencies"] assert "foo" not in updated_pyproject["tool"]["poetry"]["dependencies"]
def test_add_should_work_when_adding_existing_package_with_latest_constraint( def test_add_should_work_when_adding_existing_package_with_latest_constraint(
app: PoetryTestApplication, repo: TestRepository, tester: CommandTester app: PoetryTestApplication, repo: TestRepository, tester: CommandTester
) -> None: ) -> None:
content = app.poetry.file.read() pyproject: dict[str, Any] = app.poetry.file.read()
content["tool"]["poetry"]["dependencies"]["foo"] = "^1.0" pyproject["tool"]["poetry"]["dependencies"]["foo"] = "^1.0"
app.poetry.file.write(content) pyproject = cast("TOMLDocument", pyproject)
app.poetry.file.write(pyproject)
repo.add_package(get_package("foo", "1.1.2")) repo.add_package(get_package("foo", "1.1.2"))
...@@ -1140,7 +1193,8 @@ Writing lock file ...@@ -1140,7 +1193,8 @@ Writing lock file
assert expected in tester.io.fetch_output() assert expected in tester.io.fetch_output()
content = app.poetry.file.read()["tool"]["poetry"] pyproject2: dict[str, Any] = app.poetry.file.read()
content = pyproject2["tool"]["poetry"]
assert "foo" in content["dependencies"] assert "foo" in content["dependencies"]
assert content["dependencies"]["foo"] == "^1.1.2" assert content["dependencies"]["foo"] == "^1.1.2"
...@@ -1239,38 +1293,16 @@ Writing lock file ...@@ -1239,38 +1293,16 @@ Writing lock file
assert tester.io.fetch_output() == expected assert tester.io.fetch_output() == expected
assert isinstance(tester.command, InstallerCommand)
assert tester.command.installer.executor.installations_count == 1 assert tester.command.installer.executor.installations_count == 1
content = app.poetry.file.read()["tool"]["poetry"] pyproject: dict[str, Any] = app.poetry.file.read()
content = pyproject["tool"]["poetry"]
assert "cachy" in content["group"]["dev"]["dependencies"] assert "cachy" in content["group"]["dev"]["dependencies"]
assert content["group"]["dev"]["dependencies"]["cachy"] == "^0.2.0" assert content["group"]["dev"]["dependencies"]["cachy"] == "^0.2.0"
def test_add_preferes_stable_releases(
app: PoetryTestApplication,
repo: TestRepository,
tester: CommandTester,
) -> None:
repo.add_package(get_package("foo", "1.2.3"))
repo.add_package(get_package("foo", "1.2.4b1"))
tester.execute("foo")
expected = """\
Using version ^1.2.3 for foo
Updating dependencies
Resolving dependencies...
Package operations: 1 install, 0 updates, 0 removals
• Installing foo (1.2.3)
"""
assert expected in tester.io.fetch_output()
def test_add_keyboard_interrupt_restore_content( def test_add_keyboard_interrupt_restore_content(
poetry_with_up_to_date_lockfile: Poetry, poetry_with_up_to_date_lockfile: Poetry,
repo: TestRepository, repo: TestRepository,
......
...@@ -14,9 +14,9 @@ import pytest ...@@ -14,9 +14,9 @@ import pytest
from cleo.testers.command_tester import CommandTester from cleo.testers.command_tester import CommandTester
from packaging.utils import canonicalize_name from packaging.utils import canonicalize_name
from poetry.console.application import Application
from poetry.console.commands.init import InitCommand from poetry.console.commands.init import InitCommand
from poetry.repositories import RepositoryPool from poetry.repositories import RepositoryPool
from tests.helpers import PoetryTestApplication
from tests.helpers import get_package from tests.helpers import get_package
...@@ -29,6 +29,7 @@ if TYPE_CHECKING: ...@@ -29,6 +29,7 @@ if TYPE_CHECKING:
from poetry.config.config import Config from poetry.config.config import Config
from poetry.poetry import Poetry from poetry.poetry import Poetry
from tests.helpers import PoetryTestApplication
from tests.helpers import TestRepository from tests.helpers import TestRepository
from tests.types import FixtureDirGetter from tests.types import FixtureDirGetter
...@@ -54,8 +55,7 @@ def patches(mocker: MockerFixture, source_dir: Path, repo: TestRepository) -> No ...@@ -54,8 +55,7 @@ def patches(mocker: MockerFixture, source_dir: Path, repo: TestRepository) -> No
@pytest.fixture @pytest.fixture
def tester(patches: None) -> CommandTester: def tester(patches: None) -> CommandTester:
# we need a test application without poetry here. app = Application()
app = PoetryTestApplication(None)
return CommandTester(app.find("init")) return CommandTester(app.find("init"))
...@@ -108,6 +108,7 @@ def test_noninteractive( ...@@ -108,6 +108,7 @@ def test_noninteractive(
tmp_path: Path, tmp_path: Path,
) -> None: ) -> None:
command = app.find("init") command = app.find("init")
assert isinstance(command, InitCommand)
command._pool = poetry.pool command._pool = poetry.pool
repo.add_package(get_package("pytest", "3.6.0")) repo.add_package(get_package("pytest", "3.6.0"))
...@@ -328,7 +329,8 @@ _generate_choice_list_packages_params: list[list[Package]] = [ ...@@ -328,7 +329,8 @@ _generate_choice_list_packages_params: list[list[Package]] = [
@pytest.fixture(params=_generate_choice_list_packages_params) @pytest.fixture(params=_generate_choice_list_packages_params)
def _generate_choice_list_packages(request: FixtureRequest) -> list[Package]: def _generate_choice_list_packages(request: FixtureRequest) -> list[Package]:
return request.param packages: list[Package] = request.param
return packages
@pytest.mark.parametrize("package_name", ["flask", "Flask", "flAsK"]) @pytest.mark.parametrize("package_name", ["flask", "Flask", "flAsK"])
...@@ -338,6 +340,7 @@ def test_generate_choice_list( ...@@ -338,6 +340,7 @@ def test_generate_choice_list(
_generate_choice_list_packages: list[Package], _generate_choice_list_packages: list[Package],
) -> None: ) -> None:
init_command = tester.command init_command = tester.command
assert isinstance(init_command, InitCommand)
packages = _generate_choice_list_packages packages = _generate_choice_list_packages
choices = init_command._generate_choice_list( choices = init_command._generate_choice_list(
...@@ -880,7 +883,9 @@ pytest = "^3.6.0" ...@@ -880,7 +883,9 @@ pytest = "^3.6.0"
def test_add_package_with_extras_and_whitespace(tester: CommandTester) -> None: def test_add_package_with_extras_and_whitespace(tester: CommandTester) -> None:
result = tester.command._parse_requirements(["databases[postgresql, sqlite]"]) command = tester.command
assert isinstance(command, InitCommand)
result = command._parse_requirements(["databases[postgresql, sqlite]"])
assert result[0]["name"] == "databases" assert result[0]["name"] == "databases"
assert len(result[0]["extras"]) == 2 assert len(result[0]["extras"]) == 2
...@@ -1087,7 +1092,8 @@ def test_respect_prefer_active_on_init( ...@@ -1087,7 +1092,8 @@ def test_respect_prefer_active_on_init(
if GET_PYTHON_VERSION_ONELINER in cmd: if GET_PYTHON_VERSION_ONELINER in cmd:
return "1.1.1" return "1.1.1"
return orig_check_output(cmd, *_, **__) result: str = orig_check_output(cmd, *_, **__)
return result
mocker.patch("subprocess.check_output", side_effect=mock_check_output) mocker.patch("subprocess.check_output", side_effect=mock_check_output)
......
...@@ -9,7 +9,9 @@ import pytest ...@@ -9,7 +9,9 @@ import pytest
from poetry.core.masonry.utils.module import ModuleOrPackageNotFound from poetry.core.masonry.utils.module import ModuleOrPackageNotFound
from poetry.core.packages.dependency_group import MAIN_GROUP from poetry.core.packages.dependency_group import MAIN_GROUP
from poetry.console.commands.installer_command import InstallerCommand
from poetry.console.exceptions import GroupNotFound from poetry.console.exceptions import GroupNotFound
from tests.helpers import TestLocker
if TYPE_CHECKING: if TYPE_CHECKING:
...@@ -123,6 +125,7 @@ def test_group_options_are_passed_to_the_installer( ...@@ -123,6 +125,7 @@ def test_group_options_are_passed_to_the_installer(
""" """
Group options are passed properly to the installer. Group options are passed properly to the installer.
""" """
assert isinstance(tester.command, InstallerCommand)
mocker.patch.object(tester.command.installer, "run", return_value=0) mocker.patch.object(tester.command.installer, "run", return_value=0)
editable_builder_mock = mocker.patch( editable_builder_mock = mocker.patch(
"poetry.masonry.builders.editable.EditableBuilder", "poetry.masonry.builders.editable.EditableBuilder",
...@@ -140,8 +143,8 @@ def test_group_options_are_passed_to_the_installer( ...@@ -140,8 +143,8 @@ def test_group_options_are_passed_to_the_installer(
else: else:
assert status_code == 0 assert status_code == 0
package_groups = set(tester.command.poetry.package._dependency_groups.keys()) package_groups = set(tester.command.poetry.package._dependency_groups)
installer_groups = set(tester.command.installer._groups) installer_groups = set(tester.command.installer._groups or [])
assert installer_groups <= package_groups assert installer_groups <= package_groups
assert set(installer_groups) == groups assert set(installer_groups) == groups
...@@ -159,6 +162,7 @@ def test_sync_option_is_passed_to_the_installer( ...@@ -159,6 +162,7 @@ def test_sync_option_is_passed_to_the_installer(
""" """
The --sync option is passed properly to the installer. The --sync option is passed properly to the installer.
""" """
assert isinstance(tester.command, InstallerCommand)
mocker.patch.object(tester.command.installer, "run", return_value=1) mocker.patch.object(tester.command.installer, "run", return_value=1)
tester.execute("--sync") tester.execute("--sync")
...@@ -173,6 +177,7 @@ def test_compile_option_is_passed_to_the_installer( ...@@ -173,6 +177,7 @@ def test_compile_option_is_passed_to_the_installer(
""" """
The --compile option is passed properly to the installer. The --compile option is passed properly to the installer.
""" """
assert isinstance(tester.command, InstallerCommand)
mocker.patch.object(tester.command.installer, "run", return_value=1) mocker.patch.object(tester.command.installer, "run", return_value=1)
enable_bytecode_compilation_mock = mocker.patch.object( enable_bytecode_compilation_mock = mocker.patch.object(
tester.command.installer.executor._wheel_installer, tester.command.installer.executor._wheel_installer,
...@@ -192,6 +197,7 @@ def test_no_directory_is_passed_to_installer( ...@@ -192,6 +197,7 @@ def test_no_directory_is_passed_to_installer(
The --no-directory option is passed to the installer. The --no-directory option is passed to the installer.
""" """
assert isinstance(tester.command, InstallerCommand)
mocker.patch.object(tester.command.installer, "run", return_value=1) mocker.patch.object(tester.command.installer, "run", return_value=1)
if skip_directory_cli_value is True: if skip_directory_cli_value is True:
...@@ -208,6 +214,7 @@ def test_no_all_extras_doesnt_populate_installer( ...@@ -208,6 +214,7 @@ def test_no_all_extras_doesnt_populate_installer(
""" """
Not passing --all-extras means the installer doesn't see any extras. Not passing --all-extras means the installer doesn't see any extras.
""" """
assert isinstance(tester.command, InstallerCommand)
mocker.patch.object(tester.command.installer, "run", return_value=1) mocker.patch.object(tester.command.installer, "run", return_value=1)
tester.execute() tester.execute()
...@@ -221,6 +228,7 @@ def test_all_extras_populates_installer( ...@@ -221,6 +228,7 @@ def test_all_extras_populates_installer(
""" """
The --all-extras option results in extras passed to the installer. The --all-extras option results in extras passed to the installer.
""" """
assert isinstance(tester.command, InstallerCommand)
mocker.patch.object(tester.command.installer, "run", return_value=1) mocker.patch.object(tester.command.installer, "run", return_value=1)
tester.execute("--all-extras") tester.execute("--all-extras")
...@@ -232,6 +240,7 @@ def test_extras_are_parsed_and_populate_installer( ...@@ -232,6 +240,7 @@ def test_extras_are_parsed_and_populate_installer(
tester: CommandTester, tester: CommandTester,
mocker: MockerFixture, mocker: MockerFixture,
) -> None: ) -> None:
assert isinstance(tester.command, InstallerCommand)
mocker.patch.object(tester.command.installer, "run", return_value=0) mocker.patch.object(tester.command.installer, "run", return_value=0)
tester.execute('--extras "first second third"') tester.execute('--extras "first second third"')
...@@ -245,6 +254,7 @@ def test_extras_conflicts_all_extras( ...@@ -245,6 +254,7 @@ def test_extras_conflicts_all_extras(
""" """
The --extras doesn't make sense with --all-extras. The --extras doesn't make sense with --all-extras.
""" """
assert isinstance(tester.command, InstallerCommand)
mocker.patch.object(tester.command.installer, "run", return_value=0) mocker.patch.object(tester.command.installer, "run", return_value=0)
tester.execute("--extras foo --all-extras") tester.execute("--extras foo --all-extras")
...@@ -271,6 +281,7 @@ def test_only_root_conflicts_with_without_only( ...@@ -271,6 +281,7 @@ def test_only_root_conflicts_with_without_only(
tester: CommandTester, tester: CommandTester,
mocker: MockerFixture, mocker: MockerFixture,
) -> None: ) -> None:
assert isinstance(tester.command, InstallerCommand)
mocker.patch.object(tester.command.installer, "run", return_value=0) mocker.patch.object(tester.command.installer, "run", return_value=0)
tester.execute(f"{options} --only-root") tester.execute(f"{options} --only-root")
...@@ -305,6 +316,7 @@ def test_invalid_groups_with_without_only( ...@@ -305,6 +316,7 @@ def test_invalid_groups_with_without_only(
valid_groups: set[str], valid_groups: set[str],
should_raise: bool, should_raise: bool,
) -> None: ) -> None:
assert isinstance(tester.command, InstallerCommand)
mocker.patch.object(tester.command.installer, "run", return_value=0) mocker.patch.object(tester.command.installer, "run", return_value=0)
cmd_args = " ".join(f"{flag} {groups}" for (flag, groups) in options.items()) cmd_args = " ".join(f"{flag} {groups}" for (flag, groups) in options.items())
...@@ -329,6 +341,7 @@ def test_remove_untracked_outputs_deprecation_warning( ...@@ -329,6 +341,7 @@ def test_remove_untracked_outputs_deprecation_warning(
tester: CommandTester, tester: CommandTester,
mocker: MockerFixture, mocker: MockerFixture,
) -> None: ) -> None:
assert isinstance(tester.command, InstallerCommand)
mocker.patch.object(tester.command.installer, "run", return_value=0) mocker.patch.object(tester.command.installer, "run", return_value=0)
tester.execute("--remove-untracked") tester.execute("--remove-untracked")
...@@ -348,6 +361,7 @@ def test_dry_run_populates_installer( ...@@ -348,6 +361,7 @@ def test_dry_run_populates_installer(
The --dry-run option results in extras passed to the installer. The --dry-run option results in extras passed to the installer.
""" """
assert isinstance(tester.command, InstallerCommand)
mocker.patch.object(tester.command.installer, "run", return_value=1) mocker.patch.object(tester.command.installer, "run", return_value=1)
tester.execute("--dry-run") tester.execute("--dry-run")
...@@ -356,6 +370,7 @@ def test_dry_run_populates_installer( ...@@ -356,6 +370,7 @@ def test_dry_run_populates_installer(
def test_dry_run_does_not_build(tester: CommandTester, mocker: MockerFixture) -> None: def test_dry_run_does_not_build(tester: CommandTester, mocker: MockerFixture) -> None:
assert isinstance(tester.command, InstallerCommand)
mocker.patch.object(tester.command.installer, "run", return_value=0) mocker.patch.object(tester.command.installer, "run", return_value=0)
mocked_editable_builder = mocker.patch( mocked_editable_builder = mocker.patch(
"poetry.masonry.builders.editable.EditableBuilder" "poetry.masonry.builders.editable.EditableBuilder"
...@@ -367,6 +382,7 @@ def test_dry_run_does_not_build(tester: CommandTester, mocker: MockerFixture) -> ...@@ -367,6 +382,7 @@ def test_dry_run_does_not_build(tester: CommandTester, mocker: MockerFixture) ->
def test_install_logs_output(tester: CommandTester, mocker: MockerFixture) -> None: def test_install_logs_output(tester: CommandTester, mocker: MockerFixture) -> None:
assert isinstance(tester.command, InstallerCommand)
mocker.patch.object(tester.command.installer, "run", return_value=0) mocker.patch.object(tester.command.installer, "run", return_value=0)
mocker.patch("poetry.masonry.builders.editable.EditableBuilder") mocker.patch("poetry.masonry.builders.editable.EditableBuilder")
...@@ -382,6 +398,7 @@ def test_install_logs_output(tester: CommandTester, mocker: MockerFixture) -> No ...@@ -382,6 +398,7 @@ def test_install_logs_output(tester: CommandTester, mocker: MockerFixture) -> No
def test_install_logs_output_decorated( def test_install_logs_output_decorated(
tester: CommandTester, mocker: MockerFixture tester: CommandTester, mocker: MockerFixture
) -> None: ) -> None:
assert isinstance(tester.command, InstallerCommand)
mocker.patch.object(tester.command.installer, "run", return_value=0) mocker.patch.object(tester.command.installer, "run", return_value=0)
mocker.patch("poetry.masonry.builders.editable.EditableBuilder") mocker.patch("poetry.masonry.builders.editable.EditableBuilder")
...@@ -412,6 +429,7 @@ def test_install_path_dependency_does_not_exist( ...@@ -412,6 +429,7 @@ def test_install_path_dependency_does_not_exist(
options: str, options: str,
) -> None: ) -> None:
poetry = _project_factory(project, project_factory, fixture_dir) poetry = _project_factory(project, project_factory, fixture_dir)
assert isinstance(poetry.locker, TestLocker)
poetry.locker.locked(True) poetry.locker.locked(True)
tester = command_tester_factory("install", poetry=poetry) tester = command_tester_factory("install", poetry=poetry)
if options: if options:
......
...@@ -30,7 +30,7 @@ def tester(command_tester_factory: CommandTesterFactory) -> CommandTester: ...@@ -30,7 +30,7 @@ def tester(command_tester_factory: CommandTesterFactory) -> CommandTester:
return command_tester_factory("search") return command_tester_factory("search")
def test_search(tester: CommandTester, http: type[httpretty.httpretty]): def test_search(tester: CommandTester, http: type[httpretty.httpretty]) -> None:
tester.execute("sqlalchemy") tester.execute("sqlalchemy")
expected = """ expected = """
......
...@@ -122,8 +122,8 @@ def command_tester_factory( ...@@ -122,8 +122,8 @@ def command_tester_factory(
executor: Executor | None = None, executor: Executor | None = None,
environment: Env | None = None, environment: Env | None = None,
) -> CommandTester: ) -> CommandTester:
command = app.find(command) command_obj = app.find(command)
tester = CommandTester(command) tester = CommandTester(command_obj)
# Setting the formatter from the application # Setting the formatter from the application
# TODO: Find a better way to do this in Cleo # TODO: Find a better way to do this in Cleo
...@@ -136,12 +136,11 @@ def command_tester_factory( ...@@ -136,12 +136,11 @@ def command_tester_factory(
app._poetry = poetry app._poetry = poetry
poetry = app.poetry poetry = app.poetry
command._pool = poetry.pool
if hasattr(command, "set_env"): if hasattr(command_obj, "set_env"):
command.set_env(environment or env) command_obj.set_env(environment or env)
if hasattr(command, "set_installer"): if hasattr(command_obj, "set_installer"):
installer = installer or Installer( installer = installer or Installer(
tester.io, tester.io,
env, env,
...@@ -152,7 +151,7 @@ def command_tester_factory( ...@@ -152,7 +151,7 @@ def command_tester_factory(
executor=executor executor=executor
or TestExecutor(env, poetry.pool, poetry.config, tester.io), or TestExecutor(env, poetry.pool, poetry.config, tester.io),
) )
command.set_installer(installer) command_obj.set_installer(installer)
return tester return tester
......
...@@ -178,6 +178,9 @@ class PoetryTestApplication(Application): ...@@ -178,6 +178,9 @@ class PoetryTestApplication(Application):
class TestLocker(Locker): class TestLocker(Locker):
# class name begins 'Test': tell pytest that it does not contain testcases.
__test__ = False
def __init__(self, lock: Path, local_config: dict) -> None: def __init__(self, lock: Path, local_config: dict) -> None:
self._lock = lock self._lock = lock
self._local_config = local_config self._local_config = local_config
......
...@@ -901,7 +901,7 @@ def test_executor_should_write_pep610_url_references_for_non_wheel_urls( ...@@ -901,7 +901,7 @@ def test_executor_should_write_pep610_url_references_for_non_wheel_urls(
def mock_get_cached_archive_for_link_func( def mock_get_cached_archive_for_link_func(
_: Link, *, strict: bool, **__: Any _: Link, *, strict: bool, **__: Any
) -> None: ) -> Path | None:
if is_wheel_cached and not strict: if is_wheel_cached and not strict:
return cached_wheel return cached_wheel
if is_sdist_cached: if is_sdist_cached:
......
...@@ -9,11 +9,11 @@ from typing import Any ...@@ -9,11 +9,11 @@ from typing import Any
import pytest import pytest
from cleo.io.buffered_io import BufferedIO
from cleo.io.inputs.input import Input from cleo.io.inputs.input import Input
from cleo.io.io import IO
from cleo.io.null_io import NullIO from cleo.io.null_io import NullIO
from cleo.io.outputs.buffered_output import BufferedOutput
from cleo.io.outputs.output import Verbosity from cleo.io.outputs.output import Verbosity
from packaging.utils import canonicalize_name
from poetry.core.packages.dependency_group import MAIN_GROUP from poetry.core.packages.dependency_group import MAIN_GROUP
from poetry.core.packages.dependency_group import DependencyGroup from poetry.core.packages.dependency_group import DependencyGroup
from poetry.core.packages.package import Package from poetry.core.packages.package import Package
...@@ -42,7 +42,6 @@ if TYPE_CHECKING: ...@@ -42,7 +42,6 @@ if TYPE_CHECKING:
from pytest_mock import MockerFixture from pytest_mock import MockerFixture
from poetry.installation.operations.operation import Operation from poetry.installation.operations.operation import Operation
from poetry.packages import DependencyPackage
from poetry.utils.env import Env from poetry.utils.env import Env
from tests.conftest import Config from tests.conftest import Config
from tests.types import FixtureDirGetter from tests.types import FixtureDirGetter
...@@ -55,19 +54,19 @@ class Executor(BaseExecutor): ...@@ -55,19 +54,19 @@ class Executor(BaseExecutor):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self._installs: list[Package] = [] self._installs: list[Package] = []
self._updates: list[DependencyPackage] = [] self._updates: list[Package] = []
self._uninstalls: list[DependencyPackage] = [] self._uninstalls: list[Package] = []
@property @property
def installations(self) -> list[Package]: def installations(self) -> list[Package]:
return self._installs return self._installs
@property @property
def updates(self) -> list[DependencyPackage]: def updates(self) -> list[Package]:
return self._updates return self._updates
@property @property
def removals(self) -> list[DependencyPackage]: def removals(self) -> list[Package]:
return self._uninstalls return self._uninstalls
def _do_execute_operation(self, operation: Operation) -> int: def _do_execute_operation(self, operation: Operation) -> int:
...@@ -105,7 +104,8 @@ class Locker(BaseLocker): ...@@ -105,7 +104,8 @@ class Locker(BaseLocker):
self._content_hash = self._get_content_hash() self._content_hash = self._get_content_hash()
@property @property
def written_data(self) -> dict[str, Any] | None: def written_data(self) -> dict[str, Any]:
assert self._written_data is not None
return self._written_data return self._written_data
def set_lock_path(self, lock: Path) -> Locker: def set_lock_path(self, lock: Path) -> Locker:
...@@ -435,7 +435,9 @@ def test_run_install_does_not_remove_locked_packages_if_installed_but_not_requir ...@@ -435,7 +435,9 @@ def test_run_install_does_not_remove_locked_packages_if_installed_but_not_requir
installed.add_package(package) # Root package never removed. installed.add_package(package) # Root package never removed.
package.add_dependency(Factory.create_dependency(package_a.name, package_a.version)) package.add_dependency(
Factory.create_dependency(package_a.name, str(package_a.version))
)
locker.locked(True) locker.locked(True)
locker.mock_lock_data( locker.mock_lock_data(
...@@ -503,7 +505,9 @@ def test_run_install_removes_locked_packages_if_installed_and_synchronization_is ...@@ -503,7 +505,9 @@ def test_run_install_removes_locked_packages_if_installed_and_synchronization_is
installed.add_package(package) # Root package never removed. installed.add_package(package) # Root package never removed.
package.add_dependency(Factory.create_dependency(package_a.name, package_a.version)) package.add_dependency(
Factory.create_dependency(package_a.name, str(package_a.version))
)
locker.locked(True) locker.locked(True)
locker.mock_lock_data( locker.mock_lock_data(
...@@ -571,7 +575,9 @@ def test_run_install_removes_no_longer_locked_packages_if_installed( ...@@ -571,7 +575,9 @@ def test_run_install_removes_no_longer_locked_packages_if_installed(
installed.add_package(package) # Root package never removed. installed.add_package(package) # Root package never removed.
package.add_dependency(Factory.create_dependency(package_a.name, package_a.version)) package.add_dependency(
Factory.create_dependency(package_a.name, str(package_a.version))
)
locker.locked(True) locker.locked(True)
locker.mock_lock_data( locker.mock_lock_data(
...@@ -664,7 +670,9 @@ def test_run_install_with_synchronization( ...@@ -664,7 +670,9 @@ def test_run_install_with_synchronization(
installed.add_package(package) # Root package never removed. installed.add_package(package) # Root package never removed.
package.add_dependency(Factory.create_dependency(package_a.name, package_a.version)) package.add_dependency(
Factory.create_dependency(package_a.name, str(package_a.version))
)
locker.locked(True) locker.locked(True)
locker.mock_lock_data( locker.mock_lock_data(
...@@ -878,7 +886,7 @@ def test_run_with_optional_and_python_restricted_dependencies( ...@@ -878,7 +886,7 @@ def test_run_with_optional_and_python_restricted_dependencies(
repo.add_package(package_c13) repo.add_package(package_c13)
repo.add_package(package_d) repo.add_package(package_d)
package.extras = {"foo": [get_dependency("A", "~1.0")]} package.extras = {canonicalize_name("foo"): [get_dependency("A", "~1.0")]}
package.add_dependency( package.add_dependency(
Factory.create_dependency("A", {"version": "~1.0", "optional": True}) Factory.create_dependency("A", {"version": "~1.0", "optional": True})
) )
...@@ -925,7 +933,7 @@ def test_run_with_optional_and_platform_restricted_dependencies( ...@@ -925,7 +933,7 @@ def test_run_with_optional_and_platform_restricted_dependencies(
repo.add_package(package_c13) repo.add_package(package_c13)
repo.add_package(package_d) repo.add_package(package_d)
package.extras = {"foo": [get_dependency("A", "~1.0")]} package.extras = {canonicalize_name("foo"): [get_dependency("A", "~1.0")]}
package.add_dependency( package.add_dependency(
Factory.create_dependency("A", {"version": "~1.0", "optional": True}) Factory.create_dependency("A", {"version": "~1.0", "optional": True})
) )
...@@ -957,7 +965,7 @@ def test_run_with_dependencies_extras( ...@@ -957,7 +965,7 @@ def test_run_with_dependencies_extras(
package_b = get_package("B", "1.0") package_b = get_package("B", "1.0")
package_c = get_package("C", "1.0") package_c = get_package("C", "1.0")
package_b.extras = {"foo": [get_dependency("C", "^1.0")]} package_b.extras = {canonicalize_name("foo"): [get_dependency("C", "^1.0")]}
package_b.add_dependency( package_b.add_dependency(
Factory.create_dependency("C", {"version": "^1.0", "optional": True}) Factory.create_dependency("C", {"version": "^1.0", "optional": True})
) )
...@@ -991,11 +999,11 @@ def test_run_with_dependencies_nested_extras( ...@@ -991,11 +999,11 @@ def test_run_with_dependencies_nested_extras(
) )
dependency_a = Factory.create_dependency("A", {"version": "^1.0", "extras": ["B"]}) dependency_a = Factory.create_dependency("A", {"version": "^1.0", "extras": ["B"]})
package_b.extras = {"c": [dependency_c]} package_b.extras = {canonicalize_name("c"): [dependency_c]}
package_b.add_dependency(dependency_c) package_b.add_dependency(dependency_c)
package_a.add_dependency(dependency_b) package_a.add_dependency(dependency_b)
package_a.extras = {"b": [dependency_b]} package_a.extras = {canonicalize_name("b"): [dependency_b]}
repo.add_package(package_a) repo.add_package(package_a)
repo.add_package(package_b) repo.add_package(package_b)
...@@ -1013,7 +1021,7 @@ def test_run_with_dependencies_nested_extras( ...@@ -1013,7 +1021,7 @@ def test_run_with_dependencies_nested_extras(
def test_run_does_not_install_extras_if_not_requested( def test_run_does_not_install_extras_if_not_requested(
installer: Installer, locker: Locker, repo: Repository, package: ProjectPackage installer: Installer, locker: Locker, repo: Repository, package: ProjectPackage
) -> None: ) -> None:
package.extras["foo"] = [get_dependency("D")] package.extras[canonicalize_name("foo")] = [get_dependency("D")]
package_a = get_package("A", "1.0") package_a = get_package("A", "1.0")
package_b = get_package("B", "1.0") package_b = get_package("B", "1.0")
package_c = get_package("C", "1.0") package_c = get_package("C", "1.0")
...@@ -1045,7 +1053,7 @@ def test_run_does_not_install_extras_if_not_requested( ...@@ -1045,7 +1053,7 @@ def test_run_does_not_install_extras_if_not_requested(
def test_run_installs_extras_if_requested( def test_run_installs_extras_if_requested(
installer: Installer, locker: Locker, repo: Repository, package: ProjectPackage installer: Installer, locker: Locker, repo: Repository, package: ProjectPackage
) -> None: ) -> None:
package.extras["foo"] = [get_dependency("D")] package.extras[canonicalize_name("foo")] = [get_dependency("D")]
package_a = get_package("A", "1.0") package_a = get_package("A", "1.0")
package_b = get_package("B", "1.0") package_b = get_package("B", "1.0")
package_c = get_package("C", "1.0") package_c = get_package("C", "1.0")
...@@ -1078,7 +1086,7 @@ def test_run_installs_extras_if_requested( ...@@ -1078,7 +1086,7 @@ def test_run_installs_extras_if_requested(
def test_run_installs_extras_with_deps_if_requested( def test_run_installs_extras_with_deps_if_requested(
installer: Installer, locker: Locker, repo: Repository, package: ProjectPackage installer: Installer, locker: Locker, repo: Repository, package: ProjectPackage
) -> None: ) -> None:
package.extras["foo"] = [get_dependency("C")] package.extras[canonicalize_name("foo")] = [get_dependency("C")]
package_a = get_package("A", "1.0") package_a = get_package("A", "1.0")
package_b = get_package("B", "1.0") package_b = get_package("B", "1.0")
package_c = get_package("C", "1.0") package_c = get_package("C", "1.0")
...@@ -1115,7 +1123,7 @@ def test_run_installs_extras_with_deps_if_requested_locked( ...@@ -1115,7 +1123,7 @@ def test_run_installs_extras_with_deps_if_requested_locked(
) -> None: ) -> None:
locker.locked(True) locker.locked(True)
locker.mock_lock_data(fixture("extras-with-dependencies")) locker.mock_lock_data(fixture("extras-with-dependencies"))
package.extras["foo"] = [get_dependency("C")] package.extras[canonicalize_name("foo")] = [get_dependency("C")]
package_a = get_package("A", "1.0") package_a = get_package("A", "1.0")
package_b = get_package("B", "1.0") package_b = get_package("B", "1.0")
package_c = get_package("C", "1.0") package_c = get_package("C", "1.0")
...@@ -1285,14 +1293,12 @@ def test_run_installs_with_local_poetry_directory_and_skip_directory_flag( ...@@ -1285,14 +1293,12 @@ def test_run_installs_with_local_poetry_directory_and_skip_directory_flag(
result = installer.run() result = installer.run()
assert result == 0 assert result == 0
executor: Executor = installer.executor # type: ignore
expected = fixture("with-directory-dependency-poetry-transitive") expected = fixture("with-directory-dependency-poetry-transitive")
assert locker.written_data == expected assert locker.written_data == expected
directory_installs = [ directory_installs = [
p.name for p in executor.installations if p.source_type == "directory" p.name for p in installer.executor.installations if p.source_type == "directory"
] ]
if skip_directory: if skip_directory:
...@@ -1496,9 +1502,9 @@ def test_run_update_with_locked_extras( ...@@ -1496,9 +1502,9 @@ def test_run_update_with_locked_extras(
} }
) )
package_a = get_package("A", "1.0") package_a = get_package("A", "1.0")
package_a.extras["foo"] = [get_dependency("B")] package_a.extras[canonicalize_name("foo")] = [get_dependency("B")]
b_dependency = get_dependency("B", "^1.0", optional=True) b_dependency = get_dependency("B", "^1.0", optional=True)
b_dependency.in_extras.append("foo") b_dependency.in_extras.append(canonicalize_name("foo"))
c_dependency = get_dependency("C", "^1.0") c_dependency = get_dependency("C", "^1.0")
c_dependency.python_versions = "~2.7" c_dependency.python_versions = "~2.7"
package_a.add_dependency(b_dependency) package_a.add_dependency(b_dependency)
...@@ -1890,7 +1896,7 @@ def test_installer_required_extras_should_not_be_removed_when_updating_single_de ...@@ -1890,7 +1896,7 @@ def test_installer_required_extras_should_not_be_removed_when_updating_single_de
package_b.add_dependency( package_b.add_dependency(
Factory.create_dependency("C", {"version": "^1.0", "optional": True}) Factory.create_dependency("C", {"version": "^1.0", "optional": True})
) )
package_b.extras = {"foo": [get_dependency("C")]} package_b.extras = {canonicalize_name("foo"): [get_dependency("C")]}
package_c = get_package("C", "1.0.0") package_c = get_package("C", "1.0.0")
package_d = get_package("D", "1.0.0") package_d = get_package("D", "1.0.0")
...@@ -2138,7 +2144,7 @@ def test_update_multiple_times_with_split_dependencies_is_idempotent( ...@@ -2138,7 +2144,7 @@ def test_update_multiple_times_with_split_dependencies_is_idempotent(
def test_installer_can_install_dependencies_from_forced_source( def test_installer_can_install_dependencies_from_forced_source(
locker: Locker, locker: Locker,
package: Package, package: ProjectPackage,
installed: CustomInstalledRepository, installed: CustomInstalledRepository,
env: NullEnv, env: NullEnv,
config: Config, config: Config,
...@@ -2379,7 +2385,7 @@ def test_run_with_dependencies_quiet( ...@@ -2379,7 +2385,7 @@ def test_run_with_dependencies_quiet(
repo.add_package(package_a) repo.add_package(package_a)
repo.add_package(package_b) repo.add_package(package_b)
installer._io = IO(Input(), BufferedOutput(), BufferedOutput()) installer._io = BufferedIO(Input())
installer._io.set_verbosity(Verbosity.QUIET if quiet else Verbosity.NORMAL) installer._io.set_verbosity(Verbosity.QUIET if quiet else Verbosity.NORMAL)
package.add_dependency(Factory.create_dependency("A", "~1.0")) package.add_dependency(Factory.create_dependency("A", "~1.0"))
...@@ -2391,11 +2397,11 @@ def test_run_with_dependencies_quiet( ...@@ -2391,11 +2397,11 @@ def test_run_with_dependencies_quiet(
expected = fixture("with-dependencies") expected = fixture("with-dependencies")
assert locker.written_data == expected assert locker.written_data == expected
installer._io.output._buffer.seek(0) output = installer._io.fetch_output()
if quiet: if quiet:
assert installer._io.output._buffer.read() == "" assert output == ""
else: else:
assert installer._io.output._buffer.read() != "" assert output != ""
def test_installer_should_use_the_locked_version_of_git_dependencies( def test_installer_should_use_the_locked_version_of_git_dependencies(
......
...@@ -10,7 +10,7 @@ from poetry.mixology.term import Term ...@@ -10,7 +10,7 @@ from poetry.mixology.term import Term
from poetry.puzzle.exceptions import SolverProblemError from poetry.puzzle.exceptions import SolverProblemError
def test_it_can_solve_python_incompatibility_solver_errors(): def test_it_can_solve_python_incompatibility_solver_errors() -> None:
from poetry.mixology.solutions.providers import PythonRequirementSolutionProvider from poetry.mixology.solutions.providers import PythonRequirementSolutionProvider
from poetry.mixology.solutions.solutions import PythonRequirementSolution from poetry.mixology.solutions.solutions import PythonRequirementSolution
...@@ -24,7 +24,7 @@ def test_it_can_solve_python_incompatibility_solver_errors(): ...@@ -24,7 +24,7 @@ def test_it_can_solve_python_incompatibility_solver_errors():
assert isinstance(provider.get_solutions(exception)[0], PythonRequirementSolution) assert isinstance(provider.get_solutions(exception)[0], PythonRequirementSolution)
def test_it_cannot_solve_other_solver_errors(): def test_it_cannot_solve_other_solver_errors() -> None:
from poetry.mixology.solutions.providers import PythonRequirementSolutionProvider from poetry.mixology.solutions.providers import PythonRequirementSolutionProvider
incompatibility = Incompatibility( incompatibility = Incompatibility(
......
...@@ -10,7 +10,7 @@ from poetry.mixology.term import Term ...@@ -10,7 +10,7 @@ from poetry.mixology.term import Term
from poetry.puzzle.exceptions import SolverProblemError from poetry.puzzle.exceptions import SolverProblemError
def test_it_provides_the_correct_solution(): def test_it_provides_the_correct_solution() -> None:
from poetry.mixology.solutions.solutions import PythonRequirementSolution from poetry.mixology.solutions.solutions import PythonRequirementSolution
incompatibility = Incompatibility( incompatibility = Incompatibility(
......
...@@ -5,6 +5,7 @@ from typing import Any ...@@ -5,6 +5,7 @@ from typing import Any
from poetry.core.packages.package import Package from poetry.core.packages.package import Package
from poetry.installation.operations.update import Update
from poetry.puzzle.transaction import Transaction from poetry.puzzle.transaction import Transaction
...@@ -20,6 +21,7 @@ def check_operations(ops: list[Operation], expected: list[dict[str, Any]]) -> No ...@@ -20,6 +21,7 @@ def check_operations(ops: list[Operation], expected: list[dict[str, Any]]) -> No
result = [] result = []
for op in ops: for op in ops:
if op.job_type == "update": if op.job_type == "update":
assert isinstance(op, Update)
result.append( result.append(
{ {
"job": "update", "job": "update",
...@@ -38,7 +40,7 @@ def check_operations(ops: list[Operation], expected: list[dict[str, Any]]) -> No ...@@ -38,7 +40,7 @@ def check_operations(ops: list[Operation], expected: list[dict[str, Any]]) -> No
assert result == expected assert result == expected
def test_it_should_calculate_operations_in_correct_order(): def test_it_should_calculate_operations_in_correct_order() -> None:
transaction = Transaction( transaction = Transaction(
[Package("a", "1.0.0"), Package("b", "2.0.0"), Package("c", "3.0.0")], [Package("a", "1.0.0"), Package("b", "2.0.0"), Package("c", "3.0.0")],
[ [
...@@ -58,7 +60,7 @@ def test_it_should_calculate_operations_in_correct_order(): ...@@ -58,7 +60,7 @@ def test_it_should_calculate_operations_in_correct_order():
) )
def test_it_should_calculate_operations_for_installed_packages(): def test_it_should_calculate_operations_for_installed_packages() -> None:
transaction = Transaction( transaction = Transaction(
[Package("a", "1.0.0"), Package("b", "2.0.0"), Package("c", "3.0.0")], [Package("a", "1.0.0"), Package("b", "2.0.0"), Package("c", "3.0.0")],
[ [
...@@ -89,7 +91,7 @@ def test_it_should_calculate_operations_for_installed_packages(): ...@@ -89,7 +91,7 @@ def test_it_should_calculate_operations_for_installed_packages():
) )
def test_it_should_remove_installed_packages_if_required(): def test_it_should_remove_installed_packages_if_required() -> None:
transaction = Transaction( transaction = Transaction(
[Package("a", "1.0.0"), Package("b", "2.0.0"), Package("c", "3.0.0")], [Package("a", "1.0.0"), Package("b", "2.0.0"), Package("c", "3.0.0")],
[ [
...@@ -121,7 +123,7 @@ def test_it_should_remove_installed_packages_if_required(): ...@@ -121,7 +123,7 @@ def test_it_should_remove_installed_packages_if_required():
) )
def test_it_should_not_remove_installed_packages_that_are_in_result(): def test_it_should_not_remove_installed_packages_that_are_in_result() -> None:
transaction = Transaction( transaction = Transaction(
[], [],
[ [
...@@ -146,7 +148,7 @@ def test_it_should_not_remove_installed_packages_that_are_in_result(): ...@@ -146,7 +148,7 @@ def test_it_should_not_remove_installed_packages_that_are_in_result():
) )
def test_it_should_update_installed_packages_if_sources_are_different(): def test_it_should_update_installed_packages_if_sources_are_different() -> None:
transaction = Transaction( transaction = Transaction(
[Package("a", "1.0.0")], [Package("a", "1.0.0")],
[ [
......
...@@ -172,7 +172,7 @@ def test_get_package_information_skips_dependencies_with_invalid_constraints() - ...@@ -172,7 +172,7 @@ def test_get_package_information_skips_dependencies_with_invalid_constraints() -
Dependency("python-jsonrpc-server", "*"), Dependency("python-jsonrpc-server", "*"),
] ]
all_extra = package.extras["all"] all_extra = package.extras[canonicalize_name("all")]
# rope>-0.10.5 should be discarded # rope>-0.10.5 should be discarded
assert sorted(all_extra, key=lambda r: r.name) == [ assert sorted(all_extra, key=lambda r: r.name) == [
...@@ -426,7 +426,7 @@ def test_package_yanked( ...@@ -426,7 +426,7 @@ def test_package_yanked(
assert package.yanked_reason == yanked_reason assert package.yanked_reason == yanked_reason
def test_package_partial_yank(): def test_package_partial_yank() -> None:
class SpecialMockRepository(MockRepository): class SpecialMockRepository(MockRepository):
def _get_page(self, name: NormalizedName) -> SimpleRepositoryPage: def _get_page(self, name: NormalizedName) -> SimpleRepositoryPage:
return super()._get_page(canonicalize_name(f"{name}-partial-yank")) return super()._get_page(canonicalize_name(f"{name}-partial-yank"))
...@@ -464,7 +464,7 @@ def test_find_links_for_package_yanked( ...@@ -464,7 +464,7 @@ def test_find_links_for_package_yanked(
class MockHttpRepository(LegacyRepository): class MockHttpRepository(LegacyRepository):
def __init__( def __init__(
self, endpoint_responses: dict, http: type[httpretty.httpretty] self, endpoint_responses: dict[str, int], http: type[httpretty.httpretty]
) -> None: ) -> None:
base_url = "http://legacy.foo.bar" base_url = "http://legacy.foo.bar"
super().__init__("legacy", url=base_url, disable_cache=True) super().__init__("legacy", url=base_url, disable_cache=True)
...@@ -477,7 +477,7 @@ class MockHttpRepository(LegacyRepository): ...@@ -477,7 +477,7 @@ class MockHttpRepository(LegacyRepository):
def test_get_200_returns_page(http: type[httpretty.httpretty]) -> None: def test_get_200_returns_page(http: type[httpretty.httpretty]) -> None:
repo = MockHttpRepository({"/foo/": 200}, http) repo = MockHttpRepository({"/foo/": 200}, http)
assert repo.get_page("foo") _ = repo.get_page("foo")
@pytest.mark.parametrize("status_code", [401, 403, 404]) @pytest.mark.parametrize("status_code", [401, 403, 404])
......
...@@ -200,7 +200,7 @@ def test_cachy_compatibility( ...@@ -200,7 +200,7 @@ def test_cachy_compatibility(
assert cachy_file_cache.get("key4") == test_obj assert cachy_file_cache.get("key4") == test_obj
def test_missing_cache_file(poetry_file_cache: FileCache) -> None: def test_missing_cache_file(poetry_file_cache: FileCache[T]) -> None:
poetry_file_cache.put("key1", "value") poetry_file_cache.put("key1", "value")
key1_path = ( key1_path = (
...@@ -213,7 +213,7 @@ def test_missing_cache_file(poetry_file_cache: FileCache) -> None: ...@@ -213,7 +213,7 @@ def test_missing_cache_file(poetry_file_cache: FileCache) -> None:
assert poetry_file_cache.get("key1") is None assert poetry_file_cache.get("key1") is None
def test_missing_cache_path(poetry_file_cache: FileCache) -> None: def test_missing_cache_path(poetry_file_cache: FileCache[T]) -> None:
poetry_file_cache.put("key1", "value") poetry_file_cache.put("key1", "value")
key1_partial_path = poetry_file_cache.path / "81/74/09/96/87/a2/" key1_partial_path = poetry_file_cache.path / "81/74/09/96/87/a2/"
...@@ -237,7 +237,7 @@ def test_missing_cache_path(poetry_file_cache: FileCache) -> None: ...@@ -237,7 +237,7 @@ def test_missing_cache_path(poetry_file_cache: FileCache) -> None:
], ],
) )
def test_detect_corrupted_cache_key_file( def test_detect_corrupted_cache_key_file(
corrupt_payload: str | bytes, poetry_file_cache: FileCache corrupt_payload: str | bytes, poetry_file_cache: FileCache[T]
) -> None: ) -> None:
poetry_file_cache.put("key1", "value") poetry_file_cache.put("key1", "value")
......
...@@ -248,7 +248,7 @@ def test_activate_activates_non_existing_virtualenv_no_envs_file( ...@@ -248,7 +248,7 @@ def test_activate_activates_non_existing_virtualenv_no_envs_file(
envs_file = TOMLFile(tmp_path / "envs.toml") envs_file = TOMLFile(tmp_path / "envs.toml")
assert envs_file.exists() assert envs_file.exists()
envs = envs_file.read() envs: dict[str, Any] = envs_file.read()
assert envs[venv_name]["minor"] == "3.7" assert envs[venv_name]["minor"] == "3.7"
assert envs[venv_name]["patch"] == "3.7.1" assert envs[venv_name]["patch"] == "3.7.1"
...@@ -312,7 +312,7 @@ def test_activate_activates_existing_virtualenv_no_envs_file( ...@@ -312,7 +312,7 @@ def test_activate_activates_existing_virtualenv_no_envs_file(
envs_file = TOMLFile(tmp_path / "envs.toml") envs_file = TOMLFile(tmp_path / "envs.toml")
assert envs_file.exists() assert envs_file.exists()
envs = envs_file.read() envs: dict[str, Any] = envs_file.read()
assert envs[venv_name]["minor"] == "3.7" assert envs[venv_name]["minor"] == "3.7"
assert envs[venv_name]["patch"] == "3.7.1" assert envs[venv_name]["patch"] == "3.7.1"
...@@ -356,7 +356,7 @@ def test_activate_activates_same_virtualenv_with_envs_file( ...@@ -356,7 +356,7 @@ def test_activate_activates_same_virtualenv_with_envs_file(
m.assert_not_called() m.assert_not_called()
assert envs_file.exists() assert envs_file.exists()
envs = envs_file.read() envs: dict[str, Any] = envs_file.read()
assert envs[venv_name]["minor"] == "3.7" assert envs[venv_name]["minor"] == "3.7"
assert envs[venv_name]["patch"] == "3.7.1" assert envs[venv_name]["patch"] == "3.7.1"
...@@ -410,7 +410,7 @@ def test_activate_activates_different_virtualenv_with_envs_file( ...@@ -410,7 +410,7 @@ def test_activate_activates_different_virtualenv_with_envs_file(
) )
assert envs_file.exists() assert envs_file.exists()
envs = envs_file.read() envs: dict[str, Any] = envs_file.read()
assert envs[venv_name]["minor"] == "3.6" assert envs[venv_name]["minor"] == "3.6"
assert envs[venv_name]["patch"] == "3.6.6" assert envs[venv_name]["patch"] == "3.6.6"
...@@ -476,7 +476,7 @@ def test_activate_activates_recreates_for_different_patch( ...@@ -476,7 +476,7 @@ def test_activate_activates_recreates_for_different_patch(
remove_venv_m.assert_called_with(tmp_path / f"{venv_name}-py3.7") remove_venv_m.assert_called_with(tmp_path / f"{venv_name}-py3.7")
assert envs_file.exists() assert envs_file.exists()
envs = envs_file.read() envs: dict[str, Any] = envs_file.read()
assert envs[venv_name]["minor"] == "3.7" assert envs[venv_name]["minor"] == "3.7"
assert envs[venv_name]["patch"] == "3.7.1" assert envs[venv_name]["patch"] == "3.7.1"
...@@ -528,7 +528,7 @@ def test_activate_does_not_recreate_when_switching_minor( ...@@ -528,7 +528,7 @@ def test_activate_does_not_recreate_when_switching_minor(
remove_venv_m.assert_not_called() remove_venv_m.assert_not_called()
assert envs_file.exists() assert envs_file.exists()
envs = envs_file.read() envs: dict[str, Any] = envs_file.read()
assert envs[venv_name]["minor"] == "3.6" assert envs[venv_name]["minor"] == "3.6"
assert envs[venv_name]["patch"] == "3.6.6" assert envs[venv_name]["patch"] == "3.6.6"
...@@ -901,8 +901,8 @@ def test_remove_keeps_dir_if_not_deleteable( ...@@ -901,8 +901,8 @@ def test_remove_keeps_dir_if_not_deleteable(
side_effect=check_output_wrapper(Version.parse("3.6.6")), side_effect=check_output_wrapper(Version.parse("3.6.6")),
) )
def err_on_rm_venv_only(path: Path | str, *args: Any, **kwargs: Any) -> None: def err_on_rm_venv_only(path: Path, *args: Any, **kwargs: Any) -> None:
if str(path) == str(venv_path): if path.resolve() == venv_path.resolve():
raise OSError(16, "Test error") # ERRNO 16: Device or resource busy raise OSError(16, "Test error") # ERRNO 16: Device or resource busy
else: else:
remove_directory(path) remove_directory(path)
...@@ -1259,6 +1259,7 @@ def test_create_venv_uses_patch_version_to_detect_compatibility( ...@@ -1259,6 +1259,7 @@ def test_create_venv_uses_patch_version_to_detect_compatibility(
str(c) for c in sys.version_info[:3] str(c) for c in sys.version_info[:3]
) )
assert version.patch is not None
mocker.patch("sys.version_info", (version.major, version.minor, version.patch + 1)) mocker.patch("sys.version_info", (version.major, version.minor, version.patch + 1))
check_output = mocker.patch( check_output = mocker.patch(
"subprocess.check_output", "subprocess.check_output",
...@@ -1296,6 +1297,7 @@ def test_create_venv_uses_patch_version_to_detect_compatibility_with_executable( ...@@ -1296,6 +1297,7 @@ def test_create_venv_uses_patch_version_to_detect_compatibility_with_executable(
del os.environ["VIRTUAL_ENV"] del os.environ["VIRTUAL_ENV"]
version = Version.from_parts(*sys.version_info[:3]) version = Version.from_parts(*sys.version_info[:3])
assert version.minor is not None
poetry.package.python_versions = f"~{version.major}.{version.minor - 1}.0" poetry.package.python_versions = f"~{version.major}.{version.minor - 1}.0"
venv_name = manager.generate_env_name("simple-project", str(poetry.file.parent)) venv_name = manager.generate_env_name("simple-project", str(poetry.file.parent))
...@@ -1334,6 +1336,7 @@ def test_create_venv_fails_if_current_python_version_is_not_supported( ...@@ -1334,6 +1336,7 @@ def test_create_venv_fails_if_current_python_version_is_not_supported(
manager.create_venv() manager.create_venv()
current_version = Version.parse(".".join(str(c) for c in sys.version_info[:3])) current_version = Version.parse(".".join(str(c) for c in sys.version_info[:3]))
assert current_version.minor is not None
next_version = ".".join( next_version = ".".join(
str(c) for c in (current_version.major, current_version.minor + 1, 0) str(c) for c in (current_version.major, current_version.minor + 1, 0)
) )
......
...@@ -20,7 +20,7 @@ if TYPE_CHECKING: ...@@ -20,7 +20,7 @@ if TYPE_CHECKING:
def test_pip_install_successful( def test_pip_install_successful(
tmp_path: Path, tmp_venv: VirtualEnv, fixture_dir: FixtureDirGetter tmp_path: Path, tmp_venv: VirtualEnv, fixture_dir: FixtureDirGetter
): ) -> None:
file_path = fixture_dir("distributions/demo-0.1.0-py2.py3-none-any.whl") file_path = fixture_dir("distributions/demo-0.1.0-py2.py3-none-any.whl")
result = pip_install(file_path, tmp_venv) result = pip_install(file_path, tmp_venv)
...@@ -32,7 +32,7 @@ def test_pip_install_with_keyboard_interrupt( ...@@ -32,7 +32,7 @@ def test_pip_install_with_keyboard_interrupt(
tmp_venv: VirtualEnv, tmp_venv: VirtualEnv,
fixture_dir: FixtureDirGetter, fixture_dir: FixtureDirGetter,
mocker: MockerFixture, mocker: MockerFixture,
): ) -> None:
file_path = fixture_dir("distributions/demo-0.1.0-py2.py3-none-any.whl") file_path = fixture_dir("distributions/demo-0.1.0-py2.py3-none-any.whl")
mocker.patch("subprocess.run", side_effect=KeyboardInterrupt()) mocker.patch("subprocess.run", side_effect=KeyboardInterrupt())
with pytest.raises(KeyboardInterrupt): with pytest.raises(KeyboardInterrupt):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment