def test_list_suffix(pipx_temp_env, monkeypatch, capsys): suffix = "_x" assert not run_pipx_cli(["install", "pycowsay", f"--suffix={suffix}"]) assert not run_pipx_cli(["list"]) captured = capsys.readouterr() assert f"package pycowsay 0.0.0.1 (pycowsay{suffix})," in captured.out
def test_list_legacy_venv(pipx_temp_env, monkeypatch, capsys, metadata_version): assert not run_pipx_cli(["install", "pycowsay"]) mock_legacy_venv("pycowsay", metadata_version=metadata_version) assert not run_pipx_cli(["list"]) captured = capsys.readouterr() assert "package pycowsay 0.0.0.1," in captured.out
def test_install_same_package_twice_no_force(pipx_temp_env, capsys): assert not run_pipx_cli(["install", "pycowsay"]) assert run_pipx_cli(["install", "pycowsay"]) captured = capsys.readouterr() assert ( "'pycowsay' already seems to be installed. Not modifying existing installation" in captured.out)
def test_path_warning(pipx_temp_env, capsys, monkeypatch, caplog): assert not run_pipx_cli(["install", "pycowsay"]) assert "is not on your PATH environment variable" not in caplog.text monkeypatch.setenv("PATH", "") assert not run_pipx_cli(["install", "pycowsay", "--force"]) assert "is not on your PATH environment variable" in caplog.text
def test_cache(pipx_temp_env, monkeypatch, capsys, caplog): caplog.set_level(logging.DEBUG) assert not run_pipx_cli(["run", "--verbose", "pycowsay", "cowsay", "args"]) assert "Reusing cached venv" in caplog.text run_pipx_cli(["run", "--no-cache", "pycowsay", "cowsay", "args"]) assert "Removing cached venv" in caplog.text
def test_uninstall_proper_dep_behavior(pipx_temp_env, metadata_version): # isort is a dependency of pylint. Make sure that uninstalling pylint # does not also uninstall isort app in LOCAL_BIN_DIR isort_app_paths = [ constants.LOCAL_BIN_DIR / app for app in PKG["isort"]["apps"] ] pylint_app_paths = [ constants.LOCAL_BIN_DIR / app for app in PKG["pylint"]["apps"] ] assert not run_pipx_cli(["install", PKG["pylint"]["spec"]]) assert not run_pipx_cli(["install", PKG["isort"]["spec"]]) mock_legacy_venv("pylint", metadata_version=metadata_version) mock_legacy_venv("isort", metadata_version=metadata_version) for pylint_app_path in pylint_app_paths: assert pylint_app_path.exists() for isort_app_path in isort_app_paths: assert isort_app_path.exists() assert not run_pipx_cli(["uninstall", "pylint"]) for pylint_app_path in pylint_app_paths: assert not file_or_symlink(pylint_app_path) # THIS is what we're making sure is true: for isort_app_path in isort_app_paths: assert isort_app_path.exists()
def test_reinstall_suffix_legacy_venv(pipx_temp_env, capsys, metadata_version): suffix = "_x" assert not run_pipx_cli(["install", "pycowsay", f"--suffix={suffix}"]) mock_legacy_venv(f"pycowsay{suffix}", metadata_version=metadata_version) assert not run_pipx_cli( ["reinstall", "--python", sys.executable, f"pycowsay{suffix}"])
def test_upgrade_suffix(pipx_temp_env, capsys): name = "pycowsay" suffix = "_a" assert not run_pipx_cli(["install", name, f"--suffix={suffix}"]) assert run_pipx_cli(["upgrade", f"{name}"]) assert not run_pipx_cli(["upgrade", f"{name}{suffix}"])
def test_package_inject(monkeypatch, tmp_path, pipx_temp_env): pipx_venvs_dir = pipx.constants.PIPX_HOME / "venvs" run_pipx_cli(["install", "pycowsay"]) run_pipx_cli(["inject", "pycowsay", "black==19.10b0"]) assert (pipx_venvs_dir / "pycowsay" / "pipx_metadata.json").is_file() pipx_metadata = PipxMetadata(pipx_venvs_dir / "pycowsay") assert pipx_metadata.injected_packages.keys() == {"black"} if pipx.constants.WINDOWS: ref_replacement_fields = { "apps": ["black.exe", "blackd.exe"], "app_paths": [ pipx_venvs_dir / "pycowsay" / "Scripts" / "black.exe", pipx_venvs_dir / "pycowsay" / "Scripts" / "blackd.exe", ], } else: ref_replacement_fields = { "apps": ["black", "blackd"], "app_paths": [ pipx_venvs_dir / "pycowsay" / "bin" / "black", pipx_venvs_dir / "pycowsay" / "bin" / "blackd", ], } assert_package_metadata( pipx_metadata.injected_packages["black"], BLACK_PACKAGE_REF._replace(include_apps=False, **ref_replacement_fields), )
def test_uninstall_proper_dep_behavior_missing_interpreter( pipx_temp_env, metadata_version): # isort is a dependency of pylint. Make sure that uninstalling pylint # does not also uninstall isort app in LOCAL_BIN_DIR isort_app_paths = [ constants.LOCAL_BIN_DIR / app for app in PKG["isort"]["apps"] ] pylint_app_paths = [ constants.LOCAL_BIN_DIR / app for app in PKG["pylint"]["apps"] ] assert not run_pipx_cli(["install", PKG["pylint"]["spec"]]) assert not run_pipx_cli(["install", PKG["isort"]["spec"]]) mock_legacy_venv("pylint", metadata_version=metadata_version) mock_legacy_venv("isort", metadata_version=metadata_version) remove_venv_interpreter("pylint") remove_venv_interpreter("isort") for pylint_app_path in pylint_app_paths: assert pylint_app_path.exists() for isort_app_path in isort_app_paths: assert isort_app_path.exists() assert not run_pipx_cli(["uninstall", "pylint"]) # Do not check the following on Windows without metadata, we do not # remove bin dir links by design for missing interpreter in that case if not (sys.platform.startswith("win") and metadata_version is None): for pylint_app_path in pylint_app_paths: assert not file_or_symlink(pylint_app_path) # THIS is what we're making sure is true: for isort_app_path in isort_app_paths: assert isort_app_path.exists()
def test_inject_include_apps(pipx_temp_env, capsys, with_suffix): install_args = [] suffix = "" if with_suffix: suffix = "_x" install_args = [f"--suffix={suffix}"] assert not run_pipx_cli(["install", "pycowsay", *install_args]) assert run_pipx_cli([ "inject", f"pycowsay{suffix}", PKG["black"]["spec"], "--include-deps" ]) if suffix: assert run_pipx_cli([ "inject", "pycowsay", PKG["black"]["spec"], "--include-deps", "--include-apps", ]) assert not run_pipx_cli([ "inject", f"pycowsay{suffix}", PKG["black"]["spec"], "--include-deps", "--include-apps", ])
def test_list_suffix_legacy_venv(pipx_temp_env, monkeypatch, capsys, metadata_version): suffix = "_x" assert not run_pipx_cli(["install", "pycowsay", f"--suffix={suffix}"]) mock_legacy_venv(f"pycowsay{suffix}", metadata_version=metadata_version) assert not run_pipx_cli(["list"]) captured = capsys.readouterr() assert f"package pycowsay 0.0.0.1 (pycowsay{suffix})," in captured.out
def test_help_text(monkeypatch, capsys): mock_exit = mock.Mock( side_effect=ValueError("raised in test to exit early")) with mock.patch.object(sys, "exit", mock_exit), pytest.raises( ValueError, match="raised in test to exit early"): run_pipx_cli(["install", "--help"]) captured = capsys.readouterr() assert "apps you can run from anywhere" in captured.out
def test_upgrade_suffix_legacy_venv(pipx_temp_env, capsys, metadata_version): name = "pycowsay" suffix = "_a" assert not run_pipx_cli(["install", name, f"--suffix={suffix}"]) mock_legacy_venv(f"{name}{suffix}", metadata_version=metadata_version) assert run_pipx_cli(["upgrade", f"{name}"]) assert not run_pipx_cli(["upgrade", f"{name}{suffix}"])
def test_upgrade_no_include_injected(pipx_temp_env, capsys): assert not run_pipx_cli(["install", "pylint==2.5.3"]) assert not run_pipx_cli(["inject", "pylint", "black==18.9.b0"]) captured = capsys.readouterr() assert not run_pipx_cli(["upgrade", "pylint"]) captured = capsys.readouterr() assert "upgraded package pylint" in captured.out assert "upgraded package black" not in captured.out
def test_upgrade_include_injected(pipx_temp_env, capsys): assert not run_pipx_cli(["install", PKG["pylint"]["spec"]]) assert not run_pipx_cli(["inject", "pylint", "black==18.9.b0"]) captured = capsys.readouterr() assert not run_pipx_cli(["upgrade", "--include-injected", "pylint"]) captured = capsys.readouterr() assert "upgraded package pylint" in captured.out assert "upgraded package black" in captured.out
def test_help_text(pipx_temp_env, monkeypatch, capsys): mock_exit = mock.Mock( side_effect=ValueError("raised in test to exit early")) with mock.patch.object(sys, "exit", mock_exit), pytest.raises( ValueError, match="raised in test to exit early"): run_pipx_cli(["run", "--help"]) captured = capsys.readouterr() assert "Download the latest version of a package" in captured.out
def test_upgrade_specifier(pipx_temp_env, capsys): name = "pylint" specifier = "==2.3.1" initial_version = "2.3.1" assert not run_pipx_cli(["install", f"{name}{specifier}"]) assert run_pipx_cli(["upgrade", f"{name}"]) captured = capsys.readouterr() assert f"upgraded package {name} from {initial_version} to" in captured.out
def test_upgrade_specifier(pipx_temp_env, capsys): name = "pylint" pkg_spec = PKG[name]["spec"] initial_version = pkg_spec.split("==")[-1] assert not run_pipx_cli(["install", f"{pkg_spec}"]) assert not run_pipx_cli(["upgrade", f"{name}"]) captured = capsys.readouterr() assert f"upgraded package {name} from {initial_version} to" in captured.out
def test_inject_simple_legacy_venv(pipx_temp_env, capsys, metadata_version): assert not run_pipx_cli(["install", "pycowsay"]) mock_legacy_venv("pycowsay", metadata_version=metadata_version) if metadata_version is not None: assert not run_pipx_cli(["inject", "pycowsay", PKG["black"]["spec"]]) else: # no metadata in venv should result in PipxError with message assert run_pipx_cli(["inject", "pycowsay", PKG["black"]["spec"]]) assert "Please uninstall and install" in capsys.readouterr().err
def test_package_determination(caplog, pipx_temp_env, package, package_or_url, app_appargs): caplog.set_level(logging.INFO) run_pipx_cli(["run", "--verbose", "--spec", package_or_url, "--"] + app_appargs) assert "Cannot determine package name" not in caplog.text assert f"Determined package name: {package}" in caplog.text
def test_uninstall_with_missing_interpreter(pipx_temp_env, capsys): assert not run_pipx_cli(["install", "pycowsay"]) _, python_path = util.get_venv_paths(constants.PIPX_LOCAL_VENVS / "pycowsay") assert python_path.is_file() python_path.unlink() assert not python_path.is_file() assert not run_pipx_cli(["uninstall", "pycowsay"])
def test_uninstall_legacy_venv(pipx_temp_env, metadata_version): executable_path = constants.LOCAL_BIN_DIR / app_name("pycowsay") assert not run_pipx_cli(["install", "pycowsay"]) assert executable_path.exists() mock_legacy_venv("pycowsay", metadata_version=metadata_version) assert not run_pipx_cli(["uninstall", "pycowsay"]) assert not file_or_symlink(executable_path)
def test_list_short(pipx_temp_env, monkeypatch, capsys): assert not run_pipx_cli(["install", PKG["pycowsay"]["spec"]]) assert not run_pipx_cli(["install", PKG["pylint"]["spec"]]) captured = capsys.readouterr() assert not run_pipx_cli(["list", "--short"]) captured = capsys.readouterr() assert "pycowsay 0.0.0.1" in captured.out assert "pylint 2.3.1" in captured.out
def test_uninstall_suffix(pipx_temp_env, capsys): name = "pbr" suffix = "_a" executable = f"{name}{suffix}{'.exe' if constants.WINDOWS else ''}" assert not run_pipx_cli(["install", "pbr", f"--suffix={suffix}"]) assert (constants.LOCAL_BIN_DIR / executable).exists() assert not run_pipx_cli(["uninstall", f"{name}{suffix}"]) assert not (constants.LOCAL_BIN_DIR / executable).exists()
def test_uninstall_suffix(pipx_temp_env): name = "pbr" suffix = "_a" executable_path = constants.LOCAL_BIN_DIR / app_name(f"{name}{suffix}") assert not run_pipx_cli(["install", "pbr", f"--suffix={suffix}"]) assert executable_path.exists() assert not run_pipx_cli(["uninstall", f"{name}{suffix}"]) assert not file_or_symlink(executable_path)
def test_reinstall_specifier(pipx_temp_env, capsys): assert not run_pipx_cli(["install", "pylint==2.3.1"]) # clear capsys before reinstall captured = capsys.readouterr() assert not run_pipx_cli( ["reinstall", "--python", sys.executable, "pylint"]) captured = capsys.readouterr() assert "installed package pylint 2.3.1" in captured.out
def test_upgrade_all_legacy_venv(pipx_temp_env, capsys, caplog, metadata_version): assert run_pipx_cli(["upgrade", "pycowsay"]) assert not run_pipx_cli(["install", "pycowsay"]) mock_legacy_venv("pycowsay", metadata_version=metadata_version) if metadata_version is None: capsys.readouterr() assert run_pipx_cli(["upgrade-all"]) assert "Error encountered when upgrading pycowsay" in caplog.text else: assert not run_pipx_cli(["upgrade-all"])
def test_uninstall_suffix_legacy_venv(pipx_temp_env, capsys, metadata_version): name = "pbr" suffix = "_a" executable = f"{name}{suffix}{'.exe' if constants.WINDOWS else ''}" assert not run_pipx_cli(["install", "pbr", f"--suffix={suffix}"]) mock_legacy_venv(f"{name}{suffix}", metadata_version=metadata_version) assert (constants.LOCAL_BIN_DIR / executable).exists() assert not run_pipx_cli(["uninstall", f"{name}{suffix}"]) assert not (constants.LOCAL_BIN_DIR / executable).exists()
def test_uninstall_multiple_same_app(pipx_temp_env, capsys): # TODO: remove --pip-args when 2020-resolver is default in new pip assert not run_pipx_cli( [ "install", "kaggle==1.5.9", "--include-deps", "--pip-args='--use-feature=2020-resolver'", ] ) assert not run_pipx_cli(["uninstall", "kaggle"])