mirror of
https://github.com/astral-sh/uv.git
synced 2025-07-07 13:25:00 +00:00

## Summary It seems useful that `tool uninstall` guarantees the tool is gone (e.g., if the receipt and environment get out-of-sync somehow).
119 lines
3.6 KiB
Rust
119 lines
3.6 KiB
Rust
#![cfg(all(feature = "python", feature = "pypi"))]
|
|
|
|
use assert_cmd::assert::OutputAssertExt;
|
|
use assert_fs::fixture::PathChild;
|
|
use common::{uv_snapshot, TestContext};
|
|
|
|
mod common;
|
|
|
|
#[test]
|
|
fn tool_uninstall() {
|
|
let context = TestContext::new("3.12").with_filtered_exe_suffix();
|
|
let tool_dir = context.temp_dir.child("tools");
|
|
let bin_dir = context.temp_dir.child("bin");
|
|
|
|
// Install `black`
|
|
context
|
|
.tool_install()
|
|
.arg("black==24.2.0")
|
|
.env("UV_TOOL_DIR", tool_dir.as_os_str())
|
|
.env("XDG_BIN_HOME", bin_dir.as_os_str())
|
|
.assert()
|
|
.success();
|
|
|
|
uv_snapshot!(context.filters(), context.tool_uninstall().arg("black")
|
|
.env("UV_TOOL_DIR", tool_dir.as_os_str())
|
|
.env("XDG_BIN_HOME", bin_dir.as_os_str()), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv tool uninstall` is experimental and may change without warning.
|
|
Uninstalled: black, blackd
|
|
"###);
|
|
|
|
// After uninstalling the tool, it shouldn't be listed.
|
|
uv_snapshot!(context.filters(), context.tool_list()
|
|
.env("UV_TOOL_DIR", tool_dir.as_os_str())
|
|
.env("XDG_BIN_HOME", bin_dir.as_os_str()), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv tool list` is experimental and may change without warning.
|
|
No tools installed
|
|
"###);
|
|
|
|
// After uninstalling the tool, we should be able to reinstall it.
|
|
uv_snapshot!(context.filters(), context.tool_install()
|
|
.arg("black==24.2.0")
|
|
.env("UV_TOOL_DIR", tool_dir.as_os_str())
|
|
.env("XDG_BIN_HOME", bin_dir.as_os_str()), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv tool install` is experimental and may change without warning.
|
|
Resolved 6 packages in [TIME]
|
|
Installed 6 packages in [TIME]
|
|
+ black==24.2.0
|
|
+ click==8.1.7
|
|
+ mypy-extensions==1.0.0
|
|
+ packaging==24.0
|
|
+ pathspec==0.12.1
|
|
+ platformdirs==4.2.0
|
|
Installed: black, blackd
|
|
"###);
|
|
}
|
|
|
|
#[test]
|
|
fn tool_uninstall_not_installed() {
|
|
let context = TestContext::new("3.12").with_filtered_exe_suffix();
|
|
let tool_dir = context.temp_dir.child("tools");
|
|
let bin_dir = context.temp_dir.child("bin");
|
|
|
|
uv_snapshot!(context.filters(), context.tool_uninstall().arg("black")
|
|
.env("UV_TOOL_DIR", tool_dir.as_os_str())
|
|
.env("XDG_BIN_HOME", bin_dir.as_os_str()), @r###"
|
|
success: false
|
|
exit_code: 2
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv tool uninstall` is experimental and may change without warning.
|
|
error: Tool `black` is not installed
|
|
"###);
|
|
}
|
|
|
|
#[test]
|
|
fn tool_uninstall_missing_receipt() {
|
|
let context = TestContext::new("3.12").with_filtered_exe_suffix();
|
|
let tool_dir = context.temp_dir.child("tools");
|
|
let bin_dir = context.temp_dir.child("bin");
|
|
|
|
// Install `black`
|
|
context
|
|
.tool_install()
|
|
.arg("black==24.2.0")
|
|
.env("UV_TOOL_DIR", tool_dir.as_os_str())
|
|
.env("XDG_BIN_HOME", bin_dir.as_os_str())
|
|
.assert()
|
|
.success();
|
|
|
|
fs_err::remove_file(tool_dir.join("black").join("uv-receipt.toml")).unwrap();
|
|
|
|
uv_snapshot!(context.filters(), context.tool_uninstall().arg("black")
|
|
.env("UV_TOOL_DIR", tool_dir.as_os_str())
|
|
.env("XDG_BIN_HOME", bin_dir.as_os_str()), @r###"
|
|
success: true
|
|
exit_code: 0
|
|
----- stdout -----
|
|
|
|
----- stderr -----
|
|
warning: `uv tool uninstall` is experimental and may change without warning.
|
|
Removed dangling environment for tool: `black` (missing receipt)
|
|
"###);
|
|
}
|