1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
import json
import shutil
import sys
from helpers import (
run_pipx_cli,
)
from package_info import PKG
from pipx import standalone_python
MAJOR_PYTHON_VERSION = sys.version_info.major
MINOR_PYTHON_VERSION = sys.version_info.minor
TARGET_PYTHON_VERSION = f"{MAJOR_PYTHON_VERSION}.{MINOR_PYTHON_VERSION}"
original_which = shutil.which
def mock_which(name):
if name == TARGET_PYTHON_VERSION:
return None
return original_which(name)
def test_list_no_standalone_interpreters(pipx_temp_env, monkeypatch, capsys):
assert not run_pipx_cli(["interpreter", "list"])
captured = capsys.readouterr()
assert "Standalone interpreters" in captured.out
assert len(captured.out.splitlines()) == 1
def test_list_used_standalone_interpreters(pipx_temp_env, monkeypatch, mocked_github_api, capsys):
monkeypatch.setattr(shutil, "which", mock_which)
assert not run_pipx_cli(
[
"install",
"--fetch-missing-python",
"--python",
TARGET_PYTHON_VERSION,
PKG["pycowsay"]["spec"],
]
)
capsys.readouterr()
assert not run_pipx_cli(["interpreter", "list"])
captured = capsys.readouterr()
assert TARGET_PYTHON_VERSION in captured.out
assert "pycowsay" in captured.out
def test_list_unused_standalone_interpreters(pipx_temp_env, monkeypatch, mocked_github_api, capsys):
monkeypatch.setattr(shutil, "which", mock_which)
assert not run_pipx_cli(
[
"install",
"--fetch-missing-python",
"--python",
TARGET_PYTHON_VERSION,
PKG["pycowsay"]["spec"],
]
)
assert not run_pipx_cli(["uninstall", "pycowsay"])
capsys.readouterr()
assert not run_pipx_cli(["interpreter", "list"])
captured = capsys.readouterr()
assert TARGET_PYTHON_VERSION in captured.out
assert "pycowsay" not in captured.out
assert "Unused" in captured.out
def test_prune_unused_standalone_interpreters(pipx_temp_env, monkeypatch, mocked_github_api, capsys):
monkeypatch.setattr(shutil, "which", mock_which)
assert not run_pipx_cli(
[
"install",
"--fetch-missing-python",
"--python",
TARGET_PYTHON_VERSION,
PKG["pycowsay"]["spec"],
]
)
capsys.readouterr()
assert not run_pipx_cli(["interpreter", "prune"])
captured = capsys.readouterr()
assert "Nothing to remove" in captured.out
assert not run_pipx_cli(["uninstall", "pycowsay"])
capsys.readouterr()
assert not run_pipx_cli(["interpreter", "prune"])
captured = capsys.readouterr()
assert "Successfully removed:" in captured.out
assert f"- Python {TARGET_PYTHON_VERSION}" in captured.out
assert not run_pipx_cli(["interpreter", "list"])
captured = capsys.readouterr()
assert "Standalone interpreters" in captured.out
assert len(captured.out.splitlines()) == 1
assert not run_pipx_cli(["interpreter", "prune"])
captured = capsys.readouterr()
assert "Nothing to remove" in captured.out
def test_upgrade_standalone_interpreter(pipx_temp_env, root, monkeypatch, capsys):
monkeypatch.setattr(shutil, "which", mock_which)
with open(root / "testdata" / "standalone_python_index_20250818.json") as f:
new_index = json.load(f)
monkeypatch.setattr(standalone_python, "get_or_update_index", lambda _: new_index)
assert not run_pipx_cli(
[
"install",
"--fetch-missing-python",
"--python",
TARGET_PYTHON_VERSION,
PKG["pycowsay"]["spec"],
]
)
with open(root / "testdata" / "standalone_python_index_20250828.json") as f:
new_index = json.load(f)
monkeypatch.setattr(standalone_python, "get_or_update_index", lambda _: new_index)
assert not run_pipx_cli(["interpreter", "upgrade"])
def test_upgrade_standalone_interpreter_nothing_to_upgrade(pipx_temp_env, capsys, mocked_github_api):
assert not run_pipx_cli(["interpreter", "upgrade"])
captured = capsys.readouterr()
assert "Nothing to upgrade" in captured.out
|