From c8a1518ecff38d328154d7d8e0489e618555fc90 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Sat, 7 Feb 2026 08:02:58 -0600 Subject: [PATCH] Split the `TestContext` into a dedicated `uv-test` crate (#17551) --- Cargo.lock | 34 +- Cargo.toml | 1 + crates/uv-test/Cargo.toml | 48 ++ .../it/common/mod.rs => uv-test/src/lib.rs} | 223 ++++-- crates/uv/Cargo.toml | 8 +- crates/uv/tests/it/auth.rs | 70 +- crates/uv/tests/it/branching_urls.rs | 20 +- crates/uv/tests/it/build.rs | 66 +- crates/uv/tests/it/build_backend.rs | 42 +- crates/uv/tests/it/cache.rs | 8 +- crates/uv/tests/it/cache_clean.rs | 12 +- crates/uv/tests/it/cache_prune.rs | 17 +- crates/uv/tests/it/cache_size.rs | 8 +- crates/uv/tests/it/ecosystem.rs | 10 +- crates/uv/tests/it/edit.rs | 356 ++++----- crates/uv/tests/it/export.rs | 164 ++-- crates/uv/tests/it/format.rs | 28 +- crates/uv/tests/it/help.rs | 28 +- crates/uv/tests/it/init.rs | 150 ++-- crates/uv/tests/it/lock.rs | 589 +++++++------- crates/uv/tests/it/lock_conflict.rs | 90 +-- .../tests/it/lock_exclude_newer_relative.rs | 18 +- crates/uv/tests/it/lock_scenarios.rs | 82 +- crates/uv/tests/it/main.rs | 2 - crates/uv/tests/it/network.rs | 49 +- crates/uv/tests/it/pip_check.rs | 11 +- crates/uv/tests/it/pip_compile.rs | 756 +++++++++--------- crates/uv/tests/it/pip_compile_scenarios.rs | 20 +- crates/uv/tests/it/pip_debug.rs | 4 +- crates/uv/tests/it/pip_freeze.rs | 34 +- crates/uv/tests/it/pip_install.rs | 596 +++++++------- crates/uv/tests/it/pip_install_scenarios.rs | 194 ++--- crates/uv/tests/it/pip_list.rs | 40 +- crates/uv/tests/it/pip_show.rs | 28 +- crates/uv/tests/it/pip_sync.rs | 266 +++--- crates/uv/tests/it/pip_tree.rs | 46 +- crates/uv/tests/it/pip_uninstall.rs | 30 +- crates/uv/tests/it/publish.rs | 32 +- crates/uv/tests/it/python_dir.rs | 4 +- crates/uv/tests/it/python_find.rs | 47 +- crates/uv/tests/it/python_install.rs | 102 +-- crates/uv/tests/it/python_list.rs | 21 +- crates/uv/tests/it/python_module.rs | 32 +- crates/uv/tests/it/python_pin.rs | 28 +- crates/uv/tests/it/python_upgrade.rs | 26 +- crates/uv/tests/it/run.rs | 180 ++--- crates/uv/tests/it/self_update.rs | 6 +- crates/uv/tests/it/show_settings.rs | 44 +- crates/uv/tests/it/sync.rs | 328 ++++---- crates/uv/tests/it/tool_dir.rs | 6 +- crates/uv/tests/it/tool_install.rs | 104 +-- crates/uv/tests/it/tool_list.rs | 28 +- crates/uv/tests/it/tool_run.rs | 112 +-- crates/uv/tests/it/tool_uninstall.rs | 12 +- crates/uv/tests/it/tool_upgrade.rs | 32 +- crates/uv/tests/it/tree.rs | 48 +- crates/uv/tests/it/venv.rs | 92 +-- crates/uv/tests/it/version.rs | 142 ++-- crates/uv/tests/it/workflow.rs | 10 +- crates/uv/tests/it/workspace.rs | 64 +- crates/uv/tests/it/workspace_dir.rs | 12 +- crates/uv/tests/it/workspace_list.rs | 18 +- crates/uv/tests/it/workspace_metadata.rs | 18 +- scripts/scenarios/templates/compile.mustache | 4 +- scripts/scenarios/templates/install.mustache | 4 +- scripts/scenarios/templates/lock.mustache | 4 +- 66 files changed, 2918 insertions(+), 2790 deletions(-) create mode 100644 crates/uv-test/Cargo.toml rename crates/{uv/tests/it/common/mod.rs => uv-test/src/lib.rs} (93%) diff --git a/Cargo.lock b/Cargo.lock index c7bcc9fe1..2f6f29148 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5628,7 +5628,6 @@ dependencies = [ "astral-version-ranges", "axoupdater", "backon", - "base64 0.22.1", "byteorder", "bytes", "clap", @@ -5646,7 +5645,6 @@ dependencies = [ "http-body-util", "hyper", "hyper-util", - "ignore", "indexmap", "indicatif", "indoc", @@ -5666,7 +5664,6 @@ dependencies = [ "serde", "serde_json", "sha2", - "similar", "tar", "tempfile", "textwrap", @@ -5724,6 +5721,7 @@ dependencies = [ "uv-settings", "uv-shell", "uv-static", + "uv-test", "uv-tool", "uv-torch", "uv-trampoline-builder", @@ -7074,6 +7072,36 @@ dependencies = [ "uv-macros", ] +[[package]] +name = "uv-test" +version = "0.0.20" +dependencies = [ + "anyhow", + "assert_cmd", + "assert_fs", + "base64 0.22.1", + "fs-err", + "futures", + "ignore", + "indoc", + "insta", + "itertools 0.14.0", + "predicates", + "regex", + "reqwest", + "similar", + "tempfile", + "tokio", + "uv-cache", + "uv-client", + "uv-configuration", + "uv-fs", + "uv-preview", + "uv-python", + "uv-static", + "uv-version", +] + [[package]] name = "uv-tool" version = "0.0.20" diff --git a/Cargo.toml b/Cargo.toml index 387ae1fec..44627238e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -66,6 +66,7 @@ uv-shell = { version = "0.0.20", path = "crates/uv-shell" } uv-small-str = { version = "0.0.20", path = "crates/uv-small-str" } uv-state = { version = "0.0.20", path = "crates/uv-state" } uv-static = { version = "0.0.20", path = "crates/uv-static" } +uv-test = { version = "0.0.20", path = "crates/uv-test" } uv-tool = { version = "0.0.20", path = "crates/uv-tool" } uv-torch = { version = "0.0.20", path = "crates/uv-torch" } uv-trampoline-builder = { version = "0.0.20", path = "crates/uv-trampoline-builder" } diff --git a/crates/uv-test/Cargo.toml b/crates/uv-test/Cargo.toml new file mode 100644 index 000000000..2c2857e50 --- /dev/null +++ b/crates/uv-test/Cargo.toml @@ -0,0 +1,48 @@ +[package] +name = "uv-test" +version = "0.0.20" +edition = { workspace = true } +rust-version = { workspace = true } +homepage = { workspace = true } +repository = { workspace = true } +authors = { workspace = true } +license = { workspace = true } + +[lib] +doctest = false + +[lints] +workspace = true + +[features] +# When enabled, git tests are run and the git CLI is allowed. +git = [] +# When enabled, tracing duration export is supported. +tracing-durations-export = [] + +[dependencies] +uv-cache = { workspace = true, features = ["clap"] } +uv-client = { workspace = true } +uv-configuration = { workspace = true } +uv-fs = { workspace = true } +uv-preview = { workspace = true } +uv-python = { workspace = true } +uv-static = { workspace = true } +uv-version = { workspace = true } + +anyhow = { workspace = true } +assert_cmd = { workspace = true } +assert_fs = { workspace = true } +base64 = { workspace = true } +fs-err = { workspace = true, features = ["tokio"] } +futures = { workspace = true } +ignore = { workspace = true } +indoc = { workspace = true } +insta = { workspace = true, features = ["filters"] } +itertools = { workspace = true } +predicates = { workspace = true } +regex = { workspace = true } +reqwest = { workspace = true } +similar = { workspace = true } +tempfile = { workspace = true } +tokio = { workspace = true } diff --git a/crates/uv/tests/it/common/mod.rs b/crates/uv-test/src/lib.rs similarity index 93% rename from crates/uv/tests/it/common/mod.rs rename to crates/uv-test/src/lib.rs index 97b05913b..299044495 100755 --- a/crates/uv/tests/it/common/mod.rs +++ b/crates/uv-test/src/lib.rs @@ -67,6 +67,49 @@ pub fn packse_index_url() -> String { )) } +/// Create a new [`TestContext`] with the given Python version. +/// +/// Creates a virtual environment for the test. +/// +/// This macro captures the uv binary path at compile time using `env!("CARGO_BIN_EXE_uv")`, +/// which is only available in the test crate. +#[macro_export] +macro_rules! test_context { + ($python_version:expr) => { + $crate::TestContext::new_with_bin( + $python_version, + std::path::PathBuf::from(env!("CARGO_BIN_EXE_uv")), + ) + }; +} + +/// Create a new [`TestContext`] with zero or more Python versions. +/// +/// Unlike [`test_context!`], this does not create a virtual environment. +/// +/// This macro captures the uv binary path at compile time using `env!("CARGO_BIN_EXE_uv")`, +/// which is only available in the test crate. +#[macro_export] +macro_rules! test_context_with_versions { + ($python_versions:expr) => { + $crate::TestContext::new_with_versions_and_bin( + $python_versions, + std::path::PathBuf::from(env!("CARGO_BIN_EXE_uv")), + ) + }; +} + +/// Return the path to the uv binary. +/// +/// This macro captures the uv binary path at compile time using `env!("CARGO_BIN_EXE_uv")`, +/// which is only available in the test crate. +#[macro_export] +macro_rules! get_bin { + () => { + std::path::PathBuf::from(env!("CARGO_BIN_EXE_uv")) + }; +} + #[doc(hidden)] // Macro and test context only, don't use directly. pub const INSTA_FILTERS: &[(&str, &str)] = &[ (r"--cache-dir [^\s]+", "--cache-dir [CACHE_DIR]"), @@ -112,6 +155,9 @@ pub struct TestContext { /// All the Python versions available during this test context. pub python_versions: Vec<(PythonVersion, PathBuf)>, + /// Path to the uv binary. + uv_bin: PathBuf, + /// Standard filters for this test context. filters: Vec<(String, String)>, @@ -123,17 +169,17 @@ pub struct TestContext { } impl TestContext { - /// Create a new test context with a virtual environment. + /// Create a new test context with a virtual environment and explicit uv binary path. /// - /// See [`TestContext::new_with_versions`] if multiple versions are needed or - /// if creation of the virtual environment should be deferred. - pub fn new(python_version: &str) -> Self { - let new = Self::new_with_versions(&[python_version]); + /// This is called by the `test_context!` macro. + pub fn new_with_bin(python_version: &str, uv_bin: PathBuf) -> Self { + let new = Self::new_with_versions_and_bin(&[python_version], uv_bin); new.create_venv(); new } /// Set the "exclude newer" timestamp for all commands in this context. + #[must_use] pub fn with_exclude_newer(mut self, exclude_newer: &str) -> Self { self.extra_env .push((EnvVars::UV_EXCLUDE_NEWER.into(), exclude_newer.into())); @@ -141,6 +187,7 @@ impl TestContext { } /// Set the "http timeout" for all commands in this context. + #[must_use] pub fn with_http_timeout(mut self, http_timeout: &str) -> Self { self.extra_env .push((EnvVars::UV_HTTP_TIMEOUT.into(), http_timeout.into())); @@ -148,6 +195,7 @@ impl TestContext { } /// Set the "concurrent installs" for all commands in this context. + #[must_use] pub fn with_concurrent_installs(mut self, concurrent_installs: &str) -> Self { self.extra_env.push(( EnvVars::UV_CONCURRENT_INSTALLS.into(), @@ -196,6 +244,7 @@ impl TestContext { } /// Add extra standard filtering for Windows-compatible missing file errors. + #[must_use] pub fn with_filtered_missing_file_error(mut self) -> Self { // The exact message string depends on the system language, so we remove it. // We want to only remove the phrase after `Caused by:` @@ -425,6 +474,7 @@ impl TestContext { /// example, sometimes it's dependent on whether `/tmp` and `~/.local` live /// on the same file system.) #[inline] + #[must_use] pub fn with_filtered_link_mode_warning(mut self) -> Self { let pattern = "warning: Failed to hardlink files; .*\n.*\n.*\n"; self.filters.push((pattern.to_string(), String::new())); @@ -433,6 +483,7 @@ impl TestContext { /// Adds a filter for platform-specific errors when a file is not executable. #[inline] + #[must_use] pub fn with_filtered_not_executable(mut self) -> Self { let pattern = if cfg!(unix) { r"Permission denied \(os error 13\)" @@ -445,6 +496,7 @@ impl TestContext { } /// Adds a filter that ignores platform information in a Python installation key. + #[must_use] pub fn with_filtered_python_keys(mut self) -> Self { // Filter platform keys let platform_re = r"(?x) @@ -479,6 +531,7 @@ impl TestContext { } /// Adds a filter that replaces the latest Python patch versions with `[LATEST]` placeholder. + #[must_use] pub fn with_filtered_latest_python_versions(mut self) -> Self { // Filter the latest patch versions with [LATEST] placeholder // The order matters - we want to match the full version first @@ -499,6 +552,7 @@ impl TestContext { } /// Add a filter that ignores temporary directory in path. + #[must_use] pub fn with_filtered_windows_temp_dir(mut self) -> Self { let pattern = regex::escape( &self @@ -522,6 +576,7 @@ impl TestContext { } /// Adds filters for non-deterministic `CycloneDX` data + #[must_use] pub fn with_cyclonedx_filters(mut self) -> Self { self.filters.push(( r"urn:uuid:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}".to_string(), @@ -591,6 +646,7 @@ impl TestContext { self } + #[must_use] pub fn with_versions_as_managed(mut self, versions: &[&str]) -> Self { self.extra_env.push(( EnvVars::UV_INTERNAL__TEST_PYTHON_MANAGED.into(), @@ -601,12 +657,14 @@ impl TestContext { } /// Add a custom filter to the `TestContext`. + #[must_use] pub fn with_filter(mut self, filter: (impl Into, impl Into)) -> Self { self.filters.push((filter.0.into(), filter.1.into())); self } // Unsets the git credential helper using temp home gitconfig + #[must_use] pub fn with_unset_git_credential_helper(self) -> Self { let git_config = self.home_dir.child(".gitconfig"); git_config @@ -620,6 +678,7 @@ impl TestContext { } /// Clear filters on `TestContext`. + #[must_use] pub fn clear_filters(mut self) -> Self { self.filters.clear(); self @@ -641,13 +700,13 @@ impl TestContext { .join("tests") } - /// Create a new test context with multiple Python versions. + /// Create a new test context with multiple Python versions and explicit uv binary path. /// /// Does not create a virtual environment by default, but the first Python version /// can be used to create a virtual environment with [`TestContext::create_venv`]. /// - /// See [`TestContext::new`] if only a single version is desired. - pub fn new_with_versions(python_versions: &[&str]) -> Self { + /// This is called by the `test_context_with_versions!` macro. + pub fn new_with_versions_and_bin(python_versions: &[&str], uv_bin: PathBuf) -> Self { let bucket = Self::test_bucket_dir(); fs_err::create_dir_all(&bucket).expect("Failed to create test bucket"); @@ -671,7 +730,7 @@ impl TestContext { fs_err::create_dir_all(&bin_dir).expect("Failed to create test bin directory"); // When the `git` feature is disabled, enforce that the test suite does not use `git` - if cfg!(not(feature = "test-git")) { + if cfg!(not(feature = "git")) { Self::disallow_git_cli(&bin_dir).expect("Failed to setup disallowed `git` command"); } @@ -729,7 +788,7 @@ impl TestContext { let mut filters = Vec::new(); filters.extend( - Self::path_patterns(get_bin()) + Self::path_patterns(&uv_bin) .into_iter() .map(|pattern| (pattern, "[UV]".to_string())), ); @@ -917,6 +976,7 @@ impl TestContext { workspace_root, python_version, python_versions, + uv_bin, filters, extra_env: vec![], _root: root, @@ -925,7 +985,7 @@ impl TestContext { /// Create a uv command for testing. pub fn command(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); self.add_shared_options(&mut command, true); command } @@ -952,6 +1012,7 @@ impl TestContext { /// /// You can find the default filters in /// We set required to true to get a full stacktrace when these commands fail. + #[must_use] pub fn with_git_lfs_config(mut self) -> Self { let git_lfs_config = self.root.child(".gitconfig"); git_lfs_config @@ -1072,7 +1133,7 @@ impl TestContext { /// Create a `pip compile` command for testing. pub fn pip_compile(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("pip").arg("compile"); self.add_shared_options(&mut command, true); command @@ -1080,14 +1141,14 @@ impl TestContext { /// Create a `pip compile` command for testing. pub fn pip_sync(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("pip").arg("sync"); self.add_shared_options(&mut command, true); command } pub fn pip_show(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("pip").arg("show"); self.add_shared_options(&mut command, true); command @@ -1095,7 +1156,7 @@ impl TestContext { /// Create a `pip freeze` command with options shared across scenarios. pub fn pip_freeze(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("pip").arg("freeze"); self.add_shared_options(&mut command, true); command @@ -1103,14 +1164,14 @@ impl TestContext { /// Create a `pip check` command with options shared across scenarios. pub fn pip_check(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("pip").arg("check"); self.add_shared_options(&mut command, true); command } pub fn pip_list(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("pip").arg("list"); self.add_shared_options(&mut command, true); command @@ -1118,7 +1179,7 @@ impl TestContext { /// Create a `uv venv` command pub fn venv(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("venv"); self.add_shared_options(&mut command, false); command @@ -1126,7 +1187,7 @@ impl TestContext { /// Create a `pip install` command with options shared across scenarios. pub fn pip_install(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("pip").arg("install"); self.add_shared_options(&mut command, true); command @@ -1134,7 +1195,7 @@ impl TestContext { /// Create a `pip uninstall` command with options shared across scenarios. pub fn pip_uninstall(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("pip").arg("uninstall"); self.add_shared_options(&mut command, true); command @@ -1142,7 +1203,7 @@ impl TestContext { /// Create a `pip tree` command for testing. pub fn pip_tree(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("pip").arg("tree"); self.add_shared_options(&mut command, true); command @@ -1150,7 +1211,7 @@ impl TestContext { /// Create a `pip debug` command for testing. pub fn pip_debug(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("pip").arg("debug"); self.add_shared_options(&mut command, true); command @@ -1158,7 +1219,7 @@ impl TestContext { /// Create a `uv help` command with options shared across scenarios. pub fn help(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("help"); self.add_shared_env(&mut command, false); command @@ -1167,7 +1228,7 @@ impl TestContext { /// Create a `uv init` command with options shared across scenarios and /// isolated from any git repository that may exist in a parent directory. pub fn init(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("init"); self.add_shared_options(&mut command, false); command @@ -1175,7 +1236,7 @@ impl TestContext { /// Create a `uv sync` command with options shared across scenarios. pub fn sync(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("sync"); self.add_shared_options(&mut command, false); command @@ -1183,7 +1244,7 @@ impl TestContext { /// Create a `uv lock` command with options shared across scenarios. pub fn lock(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("lock"); self.add_shared_options(&mut command, false); command @@ -1191,7 +1252,7 @@ impl TestContext { /// Create a `uv workspace metadata` command with options shared across scenarios. pub fn workspace_metadata(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("workspace").arg("metadata"); self.add_shared_options(&mut command, false); command @@ -1199,7 +1260,7 @@ impl TestContext { /// Create a `uv workspace dir` command with options shared across scenarios. pub fn workspace_dir(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("workspace").arg("dir"); self.add_shared_options(&mut command, false); command @@ -1207,7 +1268,7 @@ impl TestContext { /// Create a `uv workspace list` command with options shared across scenarios. pub fn workspace_list(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("workspace").arg("list"); self.add_shared_options(&mut command, false); command @@ -1215,7 +1276,7 @@ impl TestContext { /// Create a `uv export` command with options shared across scenarios. pub fn export(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("export"); self.add_shared_options(&mut command, false); command @@ -1223,7 +1284,7 @@ impl TestContext { /// Create a `uv format` command with options shared across scenarios. pub fn format(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("format"); self.add_shared_options(&mut command, false); command @@ -1231,28 +1292,28 @@ impl TestContext { /// Create a `uv build` command with options shared across scenarios. pub fn build(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("build"); self.add_shared_options(&mut command, false); command } pub fn version(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("version"); self.add_shared_options(&mut command, false); command } pub fn self_version(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("self").arg("version"); self.add_shared_options(&mut command, false); command } pub fn self_update(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("self").arg("update"); self.add_shared_options(&mut command, false); command @@ -1260,7 +1321,7 @@ impl TestContext { /// Create a `uv publish` command with options shared across scenarios. pub fn publish(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("publish"); self.add_shared_options(&mut command, false); command @@ -1268,7 +1329,7 @@ impl TestContext { /// Create a `uv python find` command with options shared across scenarios. pub fn python_find(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command .arg("python") .arg("find") @@ -1280,7 +1341,7 @@ impl TestContext { /// Create a `uv python list` command with options shared across scenarios. pub fn python_list(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command .arg("python") .arg("list") @@ -1291,7 +1352,7 @@ impl TestContext { /// Create a `uv python install` command with options shared across scenarios. pub fn python_install(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("python").arg("install"); self.add_shared_options(&mut command, true); command @@ -1299,7 +1360,7 @@ impl TestContext { /// Create a `uv python uninstall` command with options shared across scenarios. pub fn python_uninstall(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("python").arg("uninstall"); self.add_shared_options(&mut command, true); command @@ -1307,7 +1368,7 @@ impl TestContext { /// Create a `uv python upgrade` command with options shared across scenarios. pub fn python_upgrade(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("python").arg("upgrade"); self.add_shared_options(&mut command, true); command @@ -1315,7 +1376,7 @@ impl TestContext { /// Create a `uv python pin` command with options shared across scenarios. pub fn python_pin(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("python").arg("pin"); self.add_shared_options(&mut command, true); command @@ -1323,7 +1384,7 @@ impl TestContext { /// Create a `uv python dir` command with options shared across scenarios. pub fn python_dir(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("python").arg("dir"); self.add_shared_options(&mut command, true); command @@ -1331,7 +1392,7 @@ impl TestContext { /// Create a `uv run` command with options shared across scenarios. pub fn run(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("run").env(EnvVars::UV_SHOW_RESOLUTION, "1"); self.add_shared_options(&mut command, true); command @@ -1339,7 +1400,7 @@ impl TestContext { /// Create a `uv tool run` command with options shared across scenarios. pub fn tool_run(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command .arg("tool") .arg("run") @@ -1350,7 +1411,7 @@ impl TestContext { /// Create a `uv upgrade run` command with options shared across scenarios. pub fn tool_upgrade(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("tool").arg("upgrade"); self.add_shared_options(&mut command, false); command @@ -1358,7 +1419,7 @@ impl TestContext { /// Create a `uv tool install` command with options shared across scenarios. pub fn tool_install(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("tool").arg("install"); self.add_shared_options(&mut command, false); command @@ -1366,7 +1427,7 @@ impl TestContext { /// Create a `uv tool list` command with options shared across scenarios. pub fn tool_list(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("tool").arg("list"); self.add_shared_options(&mut command, false); command @@ -1374,7 +1435,7 @@ impl TestContext { /// Create a `uv tool dir` command with options shared across scenarios. pub fn tool_dir(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("tool").arg("dir"); self.add_shared_options(&mut command, false); command @@ -1382,7 +1443,7 @@ impl TestContext { /// Create a `uv tool uninstall` command with options shared across scenarios. pub fn tool_uninstall(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("tool").arg("uninstall"); self.add_shared_options(&mut command, false); command @@ -1390,7 +1451,7 @@ impl TestContext { /// Create a `uv add` command for the given requirements. pub fn add(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("add"); self.add_shared_options(&mut command, false); command @@ -1398,7 +1459,7 @@ impl TestContext { /// Create a `uv remove` command for the given requirements. pub fn remove(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("remove"); self.add_shared_options(&mut command, false); command @@ -1406,7 +1467,7 @@ impl TestContext { /// Create a `uv tree` command with options shared across scenarios. pub fn tree(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("tree"); self.add_shared_options(&mut command, false); command @@ -1414,7 +1475,7 @@ impl TestContext { /// Create a `uv cache clean` command. pub fn clean(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("cache").arg("clean"); self.add_shared_options(&mut command, false); command @@ -1422,7 +1483,7 @@ impl TestContext { /// Create a `uv cache prune` command. pub fn prune(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("cache").arg("prune"); self.add_shared_options(&mut command, false); command @@ -1430,7 +1491,7 @@ impl TestContext { /// Create a `uv cache size` command. pub fn cache_size(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("cache").arg("size"); self.add_shared_options(&mut command, false); command @@ -1440,7 +1501,7 @@ impl TestContext { /// /// Note that this command is hidden and only invoking it through a build frontend is supported. pub fn build_backend(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("build-backend"); self.add_shared_options(&mut command, false); command @@ -1489,7 +1550,7 @@ impl TestContext { /// Create a `uv auth login` command. pub fn auth_login(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("auth").arg("login"); self.add_shared_options(&mut command, false); command @@ -1497,7 +1558,7 @@ impl TestContext { /// Create a `uv auth logout` command. pub fn auth_logout(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("auth").arg("logout"); self.add_shared_options(&mut command, false); command @@ -1505,7 +1566,7 @@ impl TestContext { /// Create a `uv auth helper --protocol bazel get` command. pub fn auth_helper(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("auth").arg("helper"); self.add_shared_options(&mut command, false); command @@ -1513,7 +1574,7 @@ impl TestContext { /// Create a `uv auth token` command. pub fn auth_token(&self) -> Command { - let mut command = Self::new_command(); + let mut command = self.new_command(); command.arg("auth").arg("token"); self.add_shared_options(&mut command, false); command @@ -1640,7 +1701,7 @@ impl TestContext { } /// For when we add pypy to the test suite. - #[expect(clippy::unused_self)] + #[allow(clippy::unused_self)] pub fn python_kind(&self) -> &'static str { "python" } @@ -1671,7 +1732,7 @@ impl TestContext { .as_ref() .expect("A Python version must be provided to create a test virtual environment"), ); - create_venv_from_executable(&self.venv, &self.cache_dir, &executable); + create_venv_from_executable(&self.venv, &self.cache_dir, &executable, &self.uv_bin); } /// Copies the files from the ecosystem project given into this text @@ -1731,8 +1792,8 @@ impl TestContext { /// Creates a new `Command` that is intended to be suitable for use in /// all tests. - fn new_command() -> Command { - Self::new_command_with(&get_bin()) + fn new_command(&self) -> Command { + Self::new_command_with(&self.uv_bin) } /// Creates a new `Command` that is intended to be suitable for use in @@ -1833,8 +1894,13 @@ pub fn get_python(version: &PythonVersion) -> PathBuf { } /// Create a virtual environment at the given path. -pub fn create_venv_from_executable>(path: P, cache_dir: &ChildPath, python: &Path) { - TestContext::new_command_with(&get_bin()) +pub fn create_venv_from_executable>( + path: P, + cache_dir: &ChildPath, + python: &Path, + uv_bin: &Path, +) { + TestContext::new_command_with(uv_bin) .arg("venv") .arg(path.as_ref().as_os_str()) .arg("--clear") @@ -1848,13 +1914,6 @@ pub fn create_venv_from_executable>(path: P, cache_dir: &ChildPat ChildPath::new(path.as_ref()).assert(predicate::path::is_dir()); } -/// Returns the uv binary that cargo built before launching the tests. -/// -/// -pub fn get_bin() -> PathBuf { - PathBuf::from(env!("CARGO_BIN_EXE_uv")) -} - /// Create a `PATH` with the requested Python versions available in order. /// /// Generally this should be used with `UV_TEST_PYTHON_PATH`. @@ -2228,37 +2287,33 @@ macro_rules! function_name { /// /// By default, the filters will search for the generally windows-only deps colorama and tzdata, /// filter them out and decrease the package counts by one for each match. -#[allow(unused_macros)] +#[macro_export] macro_rules! uv_snapshot { ($spawnable:expr, @$snapshot:literal) => {{ - uv_snapshot!($crate::common::INSTA_FILTERS.to_vec(), $spawnable, @$snapshot) + uv_snapshot!($crate::INSTA_FILTERS.to_vec(), $spawnable, @$snapshot) }}; ($filters:expr, $spawnable:expr, @$snapshot:literal) => {{ // Take a reference for backwards compatibility with the vec-expecting insta filters. - let (snapshot, output) = $crate::common::run_and_format($spawnable, &$filters, $crate::function_name!(), Some($crate::common::WindowsFilters::Platform), None); + let (snapshot, output) = $crate::run_and_format($spawnable, &$filters, $crate::function_name!(), Some($crate::WindowsFilters::Platform), None); ::insta::assert_snapshot!(snapshot, @$snapshot); output }}; ($filters:expr, $spawnable:expr, input=$input:expr, @$snapshot:literal) => {{ // Take a reference for backwards compatibility with the vec-expecting insta filters. - let (snapshot, output) = $crate::common::run_and_format($spawnable, &$filters, $crate::function_name!(), Some($crate::common::WindowsFilters::Platform), Some($input)); + let (snapshot, output) = $crate::run_and_format($spawnable, &$filters, $crate::function_name!(), Some($crate::WindowsFilters::Platform), Some($input)); ::insta::assert_snapshot!(snapshot, @$snapshot); output }}; ($filters:expr, windows_filters=false, $spawnable:expr, @$snapshot:literal) => {{ // Take a reference for backwards compatibility with the vec-expecting insta filters. - let (snapshot, output) = $crate::common::run_and_format($spawnable, &$filters, $crate::function_name!(), None, None); + let (snapshot, output) = $crate::run_and_format($spawnable, &$filters, $crate::function_name!(), None, None); ::insta::assert_snapshot!(snapshot, @$snapshot); output }}; ($filters:expr, universal_windows_filters=true, $spawnable:expr, @$snapshot:literal) => {{ // Take a reference for backwards compatibility with the vec-expecting insta filters. - let (snapshot, output) = $crate::common::run_and_format($spawnable, &$filters, $crate::function_name!(), Some($crate::common::WindowsFilters::Universal), None); + let (snapshot, output) = $crate::run_and_format($spawnable, &$filters, $crate::function_name!(), Some($crate::WindowsFilters::Universal), None); ::insta::assert_snapshot!(snapshot, @$snapshot); output }}; } - -/// -#[allow(unused_imports)] -pub(crate) use uv_snapshot; diff --git a/crates/uv/Cargo.toml b/crates/uv/Cargo.toml index 3fc5f06e9..c4bfa8a3b 100644 --- a/crates/uv/Cargo.toml +++ b/crates/uv/Cargo.toml @@ -125,11 +125,11 @@ embed-manifest = { workspace = true } [dev-dependencies] uv-publish = { workspace = true, features = ["test"] } +uv-test = { workspace = true } assert_cmd = { workspace = true } assert_fs = { workspace = true } backon = { workspace = true } -base64 = { workspace = true } byteorder = { workspace = true } bytes = { workspace = true } filetime = { workspace = true } @@ -137,14 +137,12 @@ flate2 = { workspace = true, default-features = false } http-body-util = { workspace = true } hyper = { workspace = true } hyper-util = { workspace = true } -ignore = { workspace = true } indoc = { workspace = true } insta = { workspace = true } predicates = { workspace = true } regex = { workspace = true } reqwest = { workspace = true, features = ["blocking"], default-features = false } sha2 = { workspace = true } -similar = { workspace = true } tar = { workspace = true } tempfile = { workspace = true } tokio-stream = { workspace = true } @@ -169,7 +167,7 @@ performance-memory-allocator = ["dep:uv-performance-memory-allocator"] self-update = ["axoupdater", "uv-cli/self-update"] # Features for development only. -tracing-durations-export = ["dep:tracing-durations-export", "uv-resolver/tracing-durations-export", "uv-settings/tracing-durations-export"] +tracing-durations-export = ["dep:tracing-durations-export", "uv-resolver/tracing-durations-export", "uv-settings/tracing-durations-export", "uv-test/tracing-durations-export"] # Features that only apply when running tests, no-ops otherwise. test-defaults = [ @@ -187,7 +185,7 @@ test-defaults = [ # Introduces a testing dependency on crates.io. test-crates-io = [] # Introduces a testing dependency on Git. -test-git = [] +test-git = ["uv-test/git"] # Introduces a testing dependency on Git LFS. test-git-lfs = ["test-git"] # Introduces a testing dependency on PyPI. diff --git a/crates/uv/tests/it/auth.rs b/crates/uv/tests/it/auth.rs index 0c9816120..d91b6fdb6 100644 --- a/crates/uv/tests/it/auth.rs +++ b/crates/uv/tests/it/auth.rs @@ -3,12 +3,12 @@ use assert_cmd::assert::OutputAssertExt; use assert_fs::{fixture::PathChild, prelude::FileWriteStr}; use uv_static::EnvVars; -use crate::common::{TestContext, uv_snapshot}; +use uv_test::uv_snapshot; #[test] #[cfg(feature = "native-auth")] fn add_package_native_auth_realm() -> Result<()> { - let context = TestContext::new("3.12").with_real_home(); + let context = uv_test::test_context!("3.12").with_real_home(); // Clear state before the test context @@ -117,7 +117,7 @@ fn add_package_native_auth_realm() -> Result<()> { #[test] #[cfg(feature = "native-auth")] fn add_package_native_auth() -> Result<()> { - let context = TestContext::new("3.12").with_real_home(); + let context = uv_test::test_context!("3.12").with_real_home(); // Clear state before the test context @@ -227,7 +227,7 @@ fn add_package_native_auth() -> Result<()> { #[test] #[cfg(feature = "native-auth")] fn token_native_auth() -> Result<()> { - let context = TestContext::new_with_versions(&[]).with_real_home(); + let context = uv_test::test_context_with_versions!(&[]).with_real_home(); // Clear state before the test context @@ -389,7 +389,7 @@ fn token_native_auth() -> Result<()> { #[test] #[cfg(feature = "native-auth")] fn token_native_auth_realm() -> Result<()> { - let context = TestContext::new_with_versions(&[]).with_real_home(); + let context = uv_test::test_context_with_versions!(&[]).with_real_home(); // Clear state before the test context @@ -588,7 +588,7 @@ fn token_native_auth_realm() -> Result<()> { #[test] #[cfg(feature = "native-auth")] fn login_native_auth() -> Result<()> { - let context = TestContext::new_with_versions(&[]).with_real_home(); + let context = uv_test::test_context_with_versions!(&[]).with_real_home(); // Clear state before the test context @@ -663,7 +663,7 @@ fn login_native_auth() -> Result<()> { #[test] #[cfg(feature = "native-auth")] fn login_token_native_auth() -> Result<()> { - let context = TestContext::new_with_versions(&[]).with_real_home(); + let context = uv_test::test_context_with_versions!(&[]).with_real_home(); // Clear state before the test context @@ -695,7 +695,7 @@ fn login_token_native_auth() -> Result<()> { #[test] #[cfg(feature = "native-auth")] fn logout_native_auth() -> Result<()> { - let context = TestContext::new_with_versions(&[]).with_real_home(); + let context = uv_test::test_context_with_versions!(&[]).with_real_home(); // Clear state before the test context @@ -857,7 +857,7 @@ fn logout_native_auth() -> Result<()> { #[test] #[cfg(feature = "native-auth")] fn logout_token_native_auth() -> Result<()> { - let context = TestContext::new_with_versions(&[]).with_real_home(); + let context = uv_test::test_context_with_versions!(&[]).with_real_home(); // Clear state before the test context @@ -899,7 +899,7 @@ fn logout_token_native_auth() -> Result<()> { #[test] #[cfg(feature = "native-auth")] fn login_native_auth_url() { - let context = TestContext::new_with_versions(&[]).with_real_home(); + let context = uv_test::test_context_with_versions!(&[]).with_real_home(); // A domain-only service name gets https:// prepended uv_snapshot!(context.auth_login() @@ -1073,7 +1073,7 @@ fn login_native_auth_url() { #[test] fn login_text_store() { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); // Login with a username and password uv_snapshot!(context.auth_login() @@ -1205,7 +1205,7 @@ fn login_text_store() { #[test] #[expect(clippy::disallowed_types)] fn login_password_stdin() -> Result<()> { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); // Create a temporary file with the password let password_file = context.temp_dir.child("password.txt"); @@ -1248,7 +1248,7 @@ fn login_password_stdin() -> Result<()> { #[test] #[expect(clippy::disallowed_types)] fn login_token_stdin() -> Result<()> { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); // Create a temporary file with the token let token_file = context.temp_dir.child("token.txt"); @@ -1286,7 +1286,7 @@ fn login_token_stdin() -> Result<()> { #[test] fn token_text_store() { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); // Login first context @@ -1351,7 +1351,7 @@ fn token_text_store() { #[test] fn logout_text_store() { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); // Login first context @@ -1415,7 +1415,7 @@ fn logout_text_store() { #[test] fn auth_disabled_provider_uses_text_store() { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); // Login with disabled provider should use text store uv_snapshot!(context.auth_login() @@ -1454,7 +1454,7 @@ fn auth_disabled_provider_uses_text_store() { #[test] fn login_text_store_strips_simple_suffix() { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); // Login with `/simple` suffix - should strip it and store credentials for the root URL uv_snapshot!(context.auth_login() @@ -1539,7 +1539,7 @@ fn login_text_store_strips_simple_suffix() { #[test] fn logout_text_store_strips_simple_suffix() { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); // Login with `/simple` suffix first context @@ -1594,7 +1594,7 @@ fn logout_text_store_strips_simple_suffix() { #[test] fn token_text_store_strips_simple_suffix() { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); // Login with `/simple` suffix context @@ -1645,7 +1645,7 @@ fn token_text_store_strips_simple_suffix() { #[test] fn token_text_store_username() { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); // Login with specific username context @@ -1745,7 +1745,7 @@ fn token_text_store_username() { #[test] fn logout_text_store_multiple_usernames() { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); // Login with two different usernames for the same service context @@ -1825,7 +1825,7 @@ fn logout_text_store_multiple_usernames() { #[test] #[cfg(feature = "native-auth")] fn native_auth_prefix_match() -> Result<()> { - let context = TestContext::new_with_versions(&[]).with_real_home(); + let context = uv_test::test_context_with_versions!(&[]).with_real_home(); // Clear state before the test context @@ -1875,7 +1875,7 @@ fn native_auth_prefix_match() -> Result<()> { #[test] #[cfg(feature = "native-auth")] fn native_auth_host_fallback() -> Result<()> { - let context = TestContext::new_with_versions(&[]).with_real_home(); + let context = uv_test::test_context_with_versions!(&[]).with_real_home(); // Clear state before the test context @@ -1939,7 +1939,7 @@ fn native_auth_host_fallback() -> Result<()> { /// Test credential helper with basic auth credentials #[test] fn bazel_helper_basic_auth() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Store credentials uv_snapshot!(context.filters(), context.auth_login() @@ -1973,7 +1973,7 @@ fn bazel_helper_basic_auth() { /// Test credential helper with token credentials #[test] fn bazel_helper_token() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Store token uv_snapshot!(context.filters(), context.auth_login() @@ -2007,7 +2007,7 @@ fn bazel_helper_token() { /// Test credential helper with no credentials found #[test] fn bazel_helper_no_credentials() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.auth_helper() .arg("--protocol=bazel") .arg("get"), @@ -2027,7 +2027,7 @@ fn bazel_helper_no_credentials() { /// Test credential helper with invalid JSON input #[test] fn bazel_helper_invalid_json() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.auth_helper() .arg("--protocol=bazel") @@ -2049,7 +2049,7 @@ fn bazel_helper_invalid_json() { /// Test credential helper with invalid URI #[test] fn bazel_helper_invalid_uri() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.auth_helper() .arg("--protocol=bazel") @@ -2071,7 +2071,7 @@ fn bazel_helper_invalid_uri() { /// Test credential helper with username in URI #[test] fn bazel_helper_username_in_uri() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Store credentials with specific username uv_snapshot!(context.filters(), context.auth_login() @@ -2106,7 +2106,7 @@ fn bazel_helper_username_in_uri() { /// Test credential helper with unknown username in URI #[test] fn bazel_helper_unknown_username_in_uri() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Store credentials with specific username uv_snapshot!(context.filters(), context.auth_login() @@ -2144,7 +2144,7 @@ fn bazel_helper_unknown_username_in_uri() { /// `pyx.dev` should still be recognized as a pyx domain and use the OAuth flow. #[test] fn login_pyx_dev_with_custom_api_url() { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); // When PYX_API_URL is set to localhost, `pyx.dev` should still be recognized as pyx // and reject username/password (because pyx uses OAuth, not basic auth). @@ -2203,7 +2203,7 @@ fn login_pyx_dev_with_custom_api_url() { /// Test that logout recognizes `pyx.dev` even with custom `PYX_API_URL`. #[test] fn logout_pyx_dev_with_custom_api_url() { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); // Logout for pyx.dev should use the pyx flow (succeeds with no-op message because // no credentials exist, but verifies it's recognized as pyx). @@ -2223,7 +2223,7 @@ fn logout_pyx_dev_with_custom_api_url() { /// Test that `uv auth token` recognizes `pyx.dev` even with custom `PYX_API_URL`. #[test] fn token_pyx_dev_with_custom_api_url() { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); // Token for pyx.dev should use the pyx flow and reject username. uv_snapshot!(context.auth_token() @@ -2247,7 +2247,7 @@ fn token_pyx_dev_with_custom_api_url() { /// treated as pyx domains - users must set `PYX_API_URL` to use non-default pyx environments. #[test] fn token_pyx_staging_without_env_var() { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); // Without PYX_API_URL set, staging pyx URLs are NOT recognized as pyx domains. // They fall through to the normal credential store lookup. @@ -2266,7 +2266,7 @@ fn token_pyx_staging_without_env_var() { /// Test that staging pyx URLs work correctly when `PYX_API_URL` is set. #[test] fn login_pyx_staging_with_env_var() { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); // When PYX_API_URL is set to a staging URL, that URL is recognized as pyx // and rejects username/password. diff --git a/crates/uv/tests/it/branching_urls.rs b/crates/uv/tests/it/branching_urls.rs index 9251139ba..c87a6fbb7 100644 --- a/crates/uv/tests/it/branching_urls.rs +++ b/crates/uv/tests/it/branching_urls.rs @@ -2,7 +2,7 @@ use anyhow::Result; use indoc::indoc; use insta::assert_snapshot; -use crate::common::{TestContext, make_project, uv_snapshot}; +use uv_test::{make_project, uv_snapshot}; /// The root package has diverging URLs for disjoint markers: /// ```toml @@ -14,7 +14,7 @@ use crate::common::{TestContext, make_project, uv_snapshot}; #[test] #[cfg(feature = "test-pypi")] fn branching_urls_disjoint() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let deps = indoc! {r#" dependencies = [ @@ -48,7 +48,7 @@ fn branching_urls_disjoint() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn branching_urls_overlapping() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let deps = indoc! {r#" dependencies = [ @@ -86,7 +86,7 @@ fn branching_urls_overlapping() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn root_package_splits_but_transitive_conflict() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let deps = indoc! {r#" dependencies = [ @@ -157,7 +157,7 @@ fn root_package_splits_but_transitive_conflict() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn root_package_splits_transitive_too() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let deps = indoc! {r#" dependencies = [ @@ -363,7 +363,7 @@ fn root_package_splits_transitive_too() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn root_package_splits_other_dependencies_too() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let deps = indoc! {r#" dependencies = [ @@ -547,7 +547,7 @@ fn root_package_splits_other_dependencies_too() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn branching_between_registry_and_direct_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let deps = indoc! {r#" dependencies = [ @@ -633,7 +633,7 @@ fn branching_between_registry_and_direct_url() -> Result<()> { #[test] #[cfg(all(feature = "test-git", feature = "test-pypi"))] fn branching_urls_of_different_sources_disjoint() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let deps = indoc! {r#" dependencies = [ @@ -717,7 +717,7 @@ fn branching_urls_of_different_sources_disjoint() -> Result<()> { #[test] #[cfg(all(feature = "test-git", feature = "test-pypi"))] fn branching_urls_of_different_sources_conflict() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let deps = indoc! {r#" dependencies = [ @@ -747,7 +747,7 @@ fn branching_urls_of_different_sources_conflict() -> Result<()> { /// Ensure that we don't pre-visit package with URLs. #[test] fn dont_pre_visit_url_packages() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let deps = indoc! {r#" dependencies = [ diff --git a/crates/uv/tests/it/build.rs b/crates/uv/tests/it/build.rs index 2a92375e1..0a80736ba 100644 --- a/crates/uv/tests/it/build.rs +++ b/crates/uv/tests/it/build.rs @@ -1,4 +1,3 @@ -use crate::common::{DEFAULT_PYTHON_VERSION, TestContext, uv_snapshot}; use anyhow::Result; use assert_cmd::assert::OutputAssertExt; use assert_fs::prelude::*; @@ -8,11 +7,12 @@ use insta::assert_snapshot; use predicates::prelude::predicate; use std::env::current_dir; use uv_static::EnvVars; +use uv_test::{DEFAULT_PYTHON_VERSION, uv_snapshot}; use zip::ZipArchive; #[test] fn build_basic() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let filters = context .filters() .into_iter() @@ -130,7 +130,7 @@ fn build_basic() -> Result<()> { #[test] fn build_sdist() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let filters = context .filters() .into_iter() @@ -186,7 +186,7 @@ fn build_sdist() -> Result<()> { #[test] fn build_wheel() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let filters = context .filters() .into_iter() @@ -242,7 +242,7 @@ fn build_wheel() -> Result<()> { #[test] fn build_sdist_wheel() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let filters = context .filters() .into_iter() @@ -300,7 +300,7 @@ fn build_sdist_wheel() -> Result<()> { #[test] fn build_wheel_from_sdist() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let filters = context .filters() .into_iter() @@ -409,7 +409,7 @@ fn build_wheel_from_sdist() -> Result<()> { #[test] fn build_fail() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let filters = context .filters() .into_iter() @@ -484,7 +484,7 @@ fn build_fail() -> Result<()> { #[test] fn build_workspace() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let filters = context .filters() .into_iter() @@ -689,7 +689,7 @@ fn build_workspace() -> Result<()> { #[test] fn build_all_with_failure() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let filters = context .filters() .into_iter() @@ -835,7 +835,7 @@ fn build_all_with_failure() -> Result<()> { #[test] fn build_constraints() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let filters = context .filters() .into_iter() @@ -896,7 +896,7 @@ fn build_constraints() -> Result<()> { #[test] fn build_sha() -> Result<()> { - let context = TestContext::new(DEFAULT_PYTHON_VERSION); + let context = uv_test::test_context!(DEFAULT_PYTHON_VERSION); let filters = context .filters() .into_iter() @@ -1100,7 +1100,7 @@ fn build_sha() -> Result<()> { #[test] fn build_quiet() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let project = context.temp_dir.child("project"); @@ -1139,7 +1139,7 @@ fn build_quiet() -> Result<()> { #[test] fn build_no_build_logs() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let project = context.temp_dir.child("project"); @@ -1183,7 +1183,7 @@ fn build_no_build_logs() -> Result<()> { /// Test that `UV_HIDE_BUILD_OUTPUT` suppresses build output. #[test] fn build_hide_build_output_env_var() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let project = context.temp_dir.child("project"); @@ -1227,7 +1227,7 @@ fn build_hide_build_output_env_var() -> Result<()> { /// Test that `UV_HIDE_BUILD_OUTPUT` hides build output even on failure. #[test] fn build_hide_build_output_on_failure() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let filters = context .filters() .into_iter() @@ -1278,7 +1278,7 @@ fn build_hide_build_output_on_failure() -> Result<()> { #[test] fn build_tool_uv_sources() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let filters = context .filters() .into_iter() @@ -1374,7 +1374,7 @@ fn build_tool_uv_sources() -> Result<()> { /// Check that we have a working git boundary for builds from source dist to wheel in `dist/`. #[test] fn build_git_boundary_in_dist_build() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let project = context.temp_dir.child("demo"); project.child("pyproject.toml").write_str( @@ -1427,7 +1427,7 @@ fn build_git_boundary_in_dist_build() -> Result<()> { #[test] fn build_non_package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let filters = context .filters() .into_iter() @@ -1531,7 +1531,7 @@ fn build_non_package() -> Result<()> { /// * `--sdist --wheel` #[test] fn build_fast_path() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let built_by_uv = current_dir()?.join("../../test/packages/built-by-uv"); @@ -1631,7 +1631,7 @@ fn build_fast_path() -> Result<()> { /// Test the `--list` option. #[test] fn build_list_files() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let built_by_uv = current_dir()?.join("../../test/packages/built-by-uv"); @@ -1753,7 +1753,7 @@ fn build_list_files() -> Result<()> { /// Test `--list` option errors. #[test] fn build_list_files_errors() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let built_by_uv = current_dir()?.join("../../test/packages/built-by-uv"); @@ -1801,7 +1801,7 @@ fn build_list_files_errors() -> Result<()> { #[test] fn build_version_mismatch() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let anyio_local = current_dir()?.join("../../test/packages/anyio_local"); context .build() @@ -1836,7 +1836,7 @@ fn build_version_mismatch() -> Result<()> { #[cfg(unix)] // Symlinks aren't universally available on windows. #[test] fn build_with_symlink() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context .temp_dir .child("pyproject.toml.real") @@ -1875,7 +1875,7 @@ fn build_with_symlink() -> Result<()> { #[test] fn build_with_hardlink() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context .temp_dir .child("pyproject.toml.real") @@ -1916,7 +1916,7 @@ fn build_with_hardlink() -> Result<()> { /// PEP 517 build system not a setup.py, so we fallback to setuptools implicitly. #[test] fn build_unconfigured_setuptools() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context .temp_dir .child("pyproject.toml") @@ -1959,7 +1959,7 @@ fn build_unconfigured_setuptools() -> Result<()> { /// in the root. #[test] fn build_workspace_virtual_root() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context .temp_dir .child("pyproject.toml") @@ -1987,7 +1987,7 @@ fn build_workspace_virtual_root() -> Result<()> { /// `setup.{py,cfg}`. #[test] fn build_pyproject_toml_not_a_project() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context .temp_dir .child("pyproject.toml") @@ -2014,7 +2014,7 @@ fn build_pyproject_toml_not_a_project() -> Result<()> { #[test] fn build_with_nonnormalized_name() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let filters = context .filters() .into_iter() @@ -2076,7 +2076,7 @@ fn build_with_nonnormalized_name() -> Result<()> { #[test] fn force_pep517() -> Result<()> { // We need to use a real `uv_build` package. - let context = TestContext::new("3.12").with_exclude_newer("2025-05-27T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-05-27T00:00:00Z"); context.init().assert().success(); @@ -2131,7 +2131,7 @@ fn force_pep517() -> Result<()> { #[cfg(unix)] #[test] fn venv_included_in_sdist() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context .init() @@ -2186,7 +2186,7 @@ fn venv_included_in_sdist() -> Result<()> { /// #[test] fn test_workspace_trailing_slash() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a workspace with a root and a member. context.init().arg("--lib").assert().success(); @@ -2246,7 +2246,7 @@ fn test_workspace_trailing_slash() { /// Test `uv build --clear`. #[test] fn build_clear() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let project = context.temp_dir.child("project"); @@ -2313,7 +2313,7 @@ fn build_clear() -> Result<()> { /// Test `uv build --no-create-gitignore`. #[test] fn build_no_gitignore() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let project = context.temp_dir.child("project"); diff --git a/crates/uv/tests/it/build_backend.rs b/crates/uv/tests/it/build_backend.rs index 8ecff12cd..67b399eed 100644 --- a/crates/uv/tests/it/build_backend.rs +++ b/crates/uv/tests/it/build_backend.rs @@ -1,4 +1,3 @@ -use crate::common::{TestContext, uv_snapshot, venv_bin_path}; use anyhow::Result; use assert_cmd::assert::OutputAssertExt; use assert_fs::fixture::{FileTouch, FileWriteBin, FileWriteStr, PathChild, PathCreateDir}; @@ -11,6 +10,7 @@ use std::path::Path; use std::process::Command; use tempfile::TempDir; use uv_static::EnvVars; +use uv_test::{uv_snapshot, venv_bin_path}; const BUILT_BY_UV_TEST_SCRIPT: &str = indoc! {r#" from built_by_uv import greet @@ -26,7 +26,7 @@ const BUILT_BY_UV_TEST_SCRIPT: &str = indoc! {r#" #[test] #[cfg(feature = "test-pypi")] fn built_by_uv_direct_wheel() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let built_by_uv = Path::new("../../test/packages/built-by-uv"); let temp_dir = TempDir::new()?; @@ -82,7 +82,7 @@ fn built_by_uv_direct_wheel() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn built_by_uv_direct() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let built_by_uv = Path::new("../../test/packages/built-by-uv"); let sdist_dir = TempDir::new()?; @@ -156,7 +156,7 @@ fn built_by_uv_direct() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn built_by_uv_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let built_by_uv = Path::new("../../test/packages/built-by-uv"); // Without the editable, pytest fails. @@ -217,7 +217,7 @@ fn built_by_uv_editable() -> Result<()> { fn preserve_executable_bit() -> Result<()> { use std::io::Write; - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let project_dir = context.temp_dir.path().join("preserve_executable_bit"); context @@ -280,7 +280,7 @@ fn preserve_executable_bit() -> Result<()> { /// potential modules. #[test] fn rename_module() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let temp_dir = TempDir::new()?; context @@ -361,7 +361,7 @@ fn rename_module() -> Result<()> { /// Test `tool.uv.build-backend.module-name` for editable builds. #[test] fn rename_module_editable_build() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let temp_dir = TempDir::new()?; context @@ -421,7 +421,7 @@ fn rename_module_editable_build() -> Result<()> { /// Check that the build succeeds even if the module name mismatches by case. #[test] fn build_module_name_normalization() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let wheel_dir = context.temp_dir.path().join("dist"); fs_err::create_dir(&wheel_dir)?; @@ -535,7 +535,7 @@ fn build_module_name_normalization() -> Result<()> { #[test] fn build_sdist_with_long_path() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let temp_dir = TempDir::new()?; context @@ -578,7 +578,7 @@ fn build_sdist_with_long_path() -> Result<()> { #[test] fn sdist_error_without_module() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let temp_dir = TempDir::new()?; context @@ -625,7 +625,7 @@ fn sdist_error_without_module() -> Result<()> { #[test] fn complex_namespace_packages() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let dist = context.temp_dir.child("dist"); dist.create_dir_all()?; @@ -762,7 +762,7 @@ fn complex_namespace_packages() -> Result<()> { #[test] fn license_glob_without_matches_errors() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let project = context.temp_dir.child("missing-license"); context @@ -807,7 +807,7 @@ fn license_glob_without_matches_errors() -> Result<()> { #[test] fn license_file_must_be_utf8() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let project = context.temp_dir.child("license-utf8"); context @@ -852,7 +852,7 @@ fn license_file_must_be_utf8() -> Result<()> { #[test] #[cfg(unix)] fn symlinked_file() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let project = context.temp_dir.child("project"); context @@ -941,7 +941,7 @@ fn symlinked_file() -> Result<()> { /// They may be from another `uv_build` version that has a different schema. #[test] fn invalid_build_backend_settings_are_ignored() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -977,7 +977,7 @@ fn invalid_build_backend_settings_are_ignored() -> Result<()> { /// `tool.uv.build-backend.module-root = ".."`. #[test] fn error_on_relative_module_root_outside_project_root() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -1025,7 +1025,7 @@ fn error_on_relative_module_root_outside_project_root() -> Result<()> { /// `tool.uv.build-backend.data.headers = "../headers"`. #[test] fn error_on_relative_data_dir_outside_project_root() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let project = context.temp_dir.child("project"); project.create_dir_all()?; @@ -1079,7 +1079,7 @@ fn error_on_relative_data_dir_outside_project_root() -> Result<()> { /// Show an explicit error when there is a venv in source tree. #[test] fn venv_in_source_tree() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context .init() @@ -1121,7 +1121,7 @@ fn venv_in_source_tree() { /// Show a warning when the build backend is passed redundant module names #[test] fn warn_on_redundant_module_names() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -1188,7 +1188,7 @@ fn warn_on_redundant_module_names() -> Result<()> { #[test] fn invalid_pyproject_toml() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context .temp_dir @@ -1226,7 +1226,7 @@ fn invalid_pyproject_toml() -> Result<()> { #[cfg(feature = "test-pypi")] #[test] fn build_with_all_metadata() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let temp_dir = TempDir::new()?; context diff --git a/crates/uv/tests/it/cache.rs b/crates/uv/tests/it/cache.rs index 8dba37f0f..23f06494a 100644 --- a/crates/uv/tests/it/cache.rs +++ b/crates/uv/tests/it/cache.rs @@ -6,16 +6,16 @@ use assert_fs::prelude::*; use std::process::Command; #[cfg(unix)] -use crate::common::{TestContext, get_bin, uv_snapshot}; +use uv_test::{get_bin, uv_snapshot}; /// When the cache directory cannot be created (e.g., due to permissions), we should show a /// chained error message that indicates we failed to initialize the cache. #[test] #[cfg(unix)] fn cache_init_failure() -> Result<()> { - use crate::common::ReadOnlyDirectoryGuard; + use uv_test::ReadOnlyDirectoryGuard; - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -47,7 +47,7 @@ fn cache_init_failure() -> Result<()> { // Build the sync command manually to use our custom cache directory. // We can't use context.sync() because it adds --cache-dir with the default cache. - let mut command = Command::new(get_bin()); + let mut command = Command::new(get_bin!()); command .arg("sync") .arg("--cache-dir") diff --git a/crates/uv/tests/it/cache_clean.rs b/crates/uv/tests/it/cache_clean.rs index 5fa7c0f67..7a35801ec 100644 --- a/crates/uv/tests/it/cache_clean.rs +++ b/crates/uv/tests/it/cache_clean.rs @@ -5,12 +5,12 @@ use assert_fs::prelude::*; use uv_cache::Cache; use uv_static::EnvVars; -use crate::common::{TestContext, uv_snapshot}; +use uv_test::uv_snapshot; /// `cache clean` should remove all packages. #[test] fn clean_all() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("typing-extensions\niniconfig")?; @@ -40,7 +40,7 @@ fn clean_all() -> Result<()> { #[tokio::test] async fn clean_force() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("typing-extensions\niniconfig")?; @@ -96,7 +96,7 @@ async fn clean_force() -> Result<()> { /// `cache clean iniconfig` should remove a single package (`iniconfig`). #[test] fn clean_package_pypi() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("anyio\niniconfig")?; @@ -172,7 +172,7 @@ fn clean_package_pypi() -> Result<()> { /// `cache clean iniconfig` should remove a single package (`iniconfig`). #[test] fn clean_package_index() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("anyio\niniconfig")?; @@ -236,7 +236,7 @@ fn clean_package_index() -> Result<()> { #[tokio::test] async fn cache_timeout() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Simulate another uv process running and locking the cache, e.g., with a source build. let _cache = Cache::from_path(context.cache_dir.path()) diff --git a/crates/uv/tests/it/cache_prune.rs b/crates/uv/tests/it/cache_prune.rs index d786d0b58..6f85d3b51 100644 --- a/crates/uv/tests/it/cache_prune.rs +++ b/crates/uv/tests/it/cache_prune.rs @@ -5,13 +5,12 @@ use indoc::indoc; use uv_static::EnvVars; -use crate::common::TestContext; -use crate::common::uv_snapshot; +use uv_test::uv_snapshot; /// `cache prune` should be a no-op if there's nothing out-of-date in the cache. #[test] fn prune_no_op() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("anyio")?; @@ -48,7 +47,7 @@ fn prune_no_op() -> Result<()> { /// `cache prune` should remove any stale top-level directories from the cache. #[test] fn prune_stale_directory() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("anyio")?; @@ -90,7 +89,7 @@ fn prune_stale_directory() -> Result<()> { /// `cache prune` should remove all cached environments from the cache. #[test] fn prune_cached_env() { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -151,7 +150,7 @@ fn prune_cached_env() { /// `cache prune` should remove any stale symlink from the cache. #[test] fn prune_stale_symlink() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("anyio")?; @@ -198,7 +197,7 @@ fn prune_stale_symlink() -> Result<()> { #[tokio::test] async fn prune_force() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("typing-extensions\niniconfig")?; @@ -252,7 +251,7 @@ async fn prune_force() -> Result<()> { /// `cache prune --ci` should remove all unzipped archives. #[test] fn prune_unzipped() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-01T00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-01T00:00Z"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(indoc! { r" @@ -331,7 +330,7 @@ fn prune_unzipped() -> Result<()> { /// `cache prune` should remove any stale source distribution revisions. #[test] fn prune_stale_revision() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( diff --git a/crates/uv/tests/it/cache_size.rs b/crates/uv/tests/it/cache_size.rs index 355e07100..4f0ec9465 100644 --- a/crates/uv/tests/it/cache_size.rs +++ b/crates/uv/tests/it/cache_size.rs @@ -1,11 +1,11 @@ use assert_cmd::assert::OutputAssertExt; -use crate::common::{TestContext, uv_snapshot}; +use uv_test::uv_snapshot; /// Test that `cache size` returns 0 for an empty cache directory (raw output). #[test] fn cache_size_empty_raw() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Clean cache first to ensure truly empty state context.clean().assert().success(); @@ -23,7 +23,7 @@ fn cache_size_empty_raw() { /// Test that `cache size` returns raw bytes after installing packages. #[test] fn cache_size_with_packages_raw() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install a requirement to populate the cache. context.pip_install().arg("iniconfig").assert().success(); @@ -42,7 +42,7 @@ fn cache_size_with_packages_raw() { /// Test that `cache size --human` returns human-readable format after installing packages. #[test] fn cache_size_with_packages_human() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install a requirement to populate the cache. context.pip_install().arg("iniconfig").assert().success(); diff --git a/crates/uv/tests/it/ecosystem.rs b/crates/uv/tests/it/ecosystem.rs index 8237986b6..546aadf63 100644 --- a/crates/uv/tests/it/ecosystem.rs +++ b/crates/uv/tests/it/ecosystem.rs @@ -1,9 +1,9 @@ -use crate::common::{self, TestContext, get_bin}; use anyhow::Result; use insta::assert_snapshot; use std::path::Path; use std::process::Command; use uv_static::EnvVars; +use uv_test::get_bin; // These tests just run `uv lock` on an assorted of ecosystem // projects. @@ -83,7 +83,7 @@ fn airflow() -> Result<()> { /// is, there should be a directory at `./test/ecosystem/{name}` from the /// root of the `uv` repository. fn lock_ecosystem_package(python_version: &str, name: &str) -> Result<()> { - let context = TestContext::new(python_version); + let context = uv_test::test_context!(python_version); context.copy_ecosystem_project(name); // Cache source distribution builds to speed up the tests. @@ -91,16 +91,16 @@ fn lock_ecosystem_package(python_version: &str, name: &str) -> Result<()> { std::path::absolute(Path::new("../../target/ecosystem-test-caches").join(name))?; // Custom command since we need to change the cache dir. - let mut command = Command::new(get_bin()); + let mut command = Command::new(get_bin!()); context.add_shared_env(&mut command, false); command.env(EnvVars::UV_EXCLUDE_NEWER, EXCLUDE_NEWER); command.arg("lock").arg("--cache-dir").arg(&cache_dir); - let (snapshot, _) = common::run_and_format( + let (snapshot, _) = uv_test::run_and_format( &mut command, context.filters(), name, - Some(common::WindowsFilters::Platform), + Some(uv_test::WindowsFilters::Platform), None, ); diff --git a/crates/uv/tests/it/edit.rs b/crates/uv/tests/it/edit.rs index 9471b3751..b2e69c974 100644 --- a/crates/uv/tests/it/edit.rs +++ b/crates/uv/tests/it/edit.rs @@ -2,7 +2,7 @@ #[cfg(feature = "test-git")] mod conditional_imports { - pub(crate) use crate::common::{READ_ONLY_GITHUB_TOKEN, decode_token}; + pub(crate) use uv_test::{READ_ONLY_GITHUB_TOKEN, decode_token}; } #[cfg(feature = "test-git")] @@ -22,12 +22,12 @@ use uv_cache_key::{RepositoryUrl, cache_digest}; use uv_fs::Simplified; use uv_static::EnvVars; -use crate::common::{TestContext, packse_index_url, uv_snapshot, venv_bin_path}; +use uv_test::{packse_index_url, uv_snapshot, venv_bin_path}; /// Add a PyPI requirement. #[test] fn add_registry() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -146,7 +146,7 @@ fn add_registry() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn add_git() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -310,7 +310,7 @@ fn add_git() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn add_git_private_source() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let token = decode_token(READ_ONLY_GITHUB_TOKEN); let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -406,7 +406,7 @@ fn add_git_private_source() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn add_git_private_raw() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let token = decode_token(READ_ONLY_GITHUB_TOKEN); let mut filters = context.filters(); filters.push((&token, "***")); @@ -499,7 +499,7 @@ fn add_git_private_raw() -> Result<()> { #[tokio::test] #[cfg(feature = "test-git")] async fn add_git_private_rate_limited_by_github_rest_api_403_response() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let token = decode_token(READ_ONLY_GITHUB_TOKEN); let server = MockServer::start().await; @@ -541,7 +541,7 @@ async fn add_git_private_rate_limited_by_github_rest_api_403_response() -> Resul async fn add_git_private_rate_limited_by_github_rest_api_429_response() -> Result<()> { use uv_client::DEFAULT_RETRIES; - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let token = decode_token(READ_ONLY_GITHUB_TOKEN); let server = MockServer::start().await; @@ -582,7 +582,7 @@ async fn add_git_private_rate_limited_by_github_rest_api_429_response() -> Resul #[test] #[cfg(feature = "test-git")] fn add_git_error() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -637,7 +637,7 @@ fn add_git_error() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn add_git_branch() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -666,7 +666,7 @@ fn add_git_branch() -> Result<()> { #[test] #[cfg(feature = "test-git-lfs")] fn add_git_lfs() -> Result<()> { - let context = TestContext::new("3.13").with_git_lfs_config(); + let context = uv_test::test_context!("3.13").with_git_lfs_config(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -897,7 +897,7 @@ fn add_git_lfs() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn add_git_raw() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -1047,7 +1047,7 @@ fn add_git_raw() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn add_git_implicit() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -1100,7 +1100,7 @@ fn add_git_implicit() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn add_raw_error() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -1130,7 +1130,7 @@ fn add_raw_error() -> Result<()> { #[test] fn reinstall_local_source_trees() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let project_1 = context.temp_dir.child("project1"); project_1.child("pyproject.toml").write_str(indoc! {r#" @@ -1184,7 +1184,7 @@ fn reinstall_local_source_trees() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn add_editable_error() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -1212,7 +1212,7 @@ fn add_editable_error() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn add_unnamed() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -1305,7 +1305,7 @@ fn add_unnamed() -> Result<()> { /// Add and remove a development dependency. #[test] fn add_remove_dev() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -1512,7 +1512,7 @@ fn add_remove_dev() -> Result<()> { /// Add and remove an optional dependency. #[test] fn add_remove_optional() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -1716,7 +1716,7 @@ fn add_remove_optional() -> Result<()> { #[test] fn add_remove_inline_optional() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -1800,7 +1800,7 @@ fn add_remove_inline_optional() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn add_remove_workspace() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let workspace = context.temp_dir.child("pyproject.toml"); workspace.write_str(indoc! {r#" @@ -2047,7 +2047,7 @@ fn add_remove_workspace() -> Result<()> { /// dependency already exists in `dev-dependencies`. #[test] fn update_existing_dev() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -2110,7 +2110,7 @@ fn update_existing_dev() -> Result<()> { /// exists. #[test] fn add_existing_dev() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -2167,7 +2167,7 @@ fn add_existing_dev() -> Result<()> { /// dependency already exists. #[test] fn update_existing_dev_group() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -2223,7 +2223,7 @@ fn update_existing_dev_group() -> Result<()> { /// `uv add --group dev` should add to `dependency-groups` even if `dev-dependencies` exists. #[test] fn add_existing_dev_group() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -2282,7 +2282,7 @@ fn add_existing_dev_group() -> Result<()> { /// `uv remove --dev` should remove from both `dev-dependencies` and `dependency-groups.dev`. #[test] fn remove_both_dev() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -2338,7 +2338,7 @@ fn remove_both_dev() -> Result<()> { /// Do not allow add for groups in scripts. #[test] fn disallow_group_script_add() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let script = context.temp_dir.child("main.py"); script.write_str(indoc! {r#" @@ -2374,7 +2374,7 @@ fn disallow_group_script_add() -> Result<()> { /// `uv remove --group dev` should remove from both `dev-dependencies` and `dependency-groups.dev`. #[test] fn remove_both_dev_group() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -2430,7 +2430,7 @@ fn remove_both_dev_group() -> Result<()> { /// Add a workspace dependency as an editable. #[test] fn add_workspace_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let workspace = context.temp_dir.child("pyproject.toml"); workspace.write_str(indoc! {r#" @@ -2636,7 +2636,7 @@ fn add_workspace_editable() -> Result<()> { /// Add a workspace dependency via its path. #[test] fn add_workspace_path() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let workspace = context.temp_dir.child("pyproject.toml"); workspace.write_str(indoc! {r#" @@ -2762,7 +2762,7 @@ fn add_workspace_path() -> Result<()> { /// Add a path dependency, which should be implicitly added to the workspace. #[test] fn add_path_implicit_workspace() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let workspace = context.temp_dir.child("workspace"); workspace.child("pyproject.toml").write_str(indoc! {r#" @@ -2890,7 +2890,7 @@ fn add_path_implicit_workspace() -> Result<()> { /// Add a path dependency with `--no-workspace`, which should not be added to the workspace. #[test] fn add_path_no_workspace() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let workspace = context.temp_dir.child("workspace"); workspace.child("pyproject.toml").write_str(indoc! {r#" @@ -3006,7 +3006,7 @@ fn add_path_no_workspace() -> Result<()> { /// Add a path dependency in an adjacent directory, which should not be added to the workspace. #[test] fn add_path_adjacent_directory() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let project = context.temp_dir.child("project"); project.child("pyproject.toml").write_str(indoc! {r#" @@ -3111,7 +3111,7 @@ fn add_path_adjacent_directory() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn update() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -3381,7 +3381,7 @@ fn update() -> Result<()> { /// Add and update a requirement, with different markers #[test] fn add_update_marker() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -3582,7 +3582,7 @@ fn add_update_marker() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn update_source_replace_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -3677,7 +3677,7 @@ fn update_source_replace_url() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn add_non_normalized_source() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -3734,7 +3734,7 @@ fn add_non_normalized_source() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn add_update_git_reference_project() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -3806,7 +3806,7 @@ fn add_update_git_reference_project() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn add_update_git_reference_script() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let script = context.temp_dir.child("script.py"); script.write_str(indoc! { r#" @@ -3894,7 +3894,7 @@ fn add_update_git_reference_script() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn remove_non_normalized_source() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -3942,7 +3942,7 @@ fn remove_non_normalized_source() -> Result<()> { /// Adding a dependency does not remove untracked dependencies from the environment. #[test] fn add_inexact() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -4080,7 +4080,7 @@ fn add_inexact() -> Result<()> { /// Remove a PyPI requirement. #[test] fn remove_registry() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -4179,7 +4179,7 @@ fn remove_registry() -> Result<()> { #[test] fn add_preserves_indentation_in_pyproject_toml() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -4231,7 +4231,7 @@ fn add_preserves_indentation_in_pyproject_toml() -> Result<()> { #[test] fn add_puts_default_indentation_in_pyproject_toml_if_not_observed() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -4284,7 +4284,7 @@ fn add_puts_default_indentation_in_pyproject_toml_if_not_observed() -> Result<() /// Add a requirement without updating the lockfile. #[test] fn add_frozen() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Remove the virtual environment. fs_err::remove_dir_all(&context.venv)?; @@ -4334,7 +4334,7 @@ fn add_frozen() -> Result<()> { /// Add a requirement without updating the environment. #[test] fn add_no_sync() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Remove the virtual environment. fs_err::remove_dir_all(&context.venv)?; @@ -4384,7 +4384,7 @@ fn add_no_sync() -> Result<()> { #[test] fn add_reject_multiple_git_ref_flags() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // --tag and --branch uv_snapshot!(context.filters(), context @@ -4453,7 +4453,7 @@ fn add_reject_multiple_git_ref_flags() { /// Avoiding persisting `add` calls when resolution fails. #[test] fn add_error() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -4492,7 +4492,7 @@ fn add_error() -> Result<()> { /// Emit dedicated error message when adding Conda `environment.yml` #[test] fn add_environment_yml_error() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -4527,7 +4527,7 @@ fn add_environment_yml_error() -> Result<()> { /// Set a lower bound when adding unconstrained dependencies. #[test] fn add_lower_bound() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -4577,7 +4577,7 @@ fn add_lower_bound() -> Result<()> { /// Avoid setting a lower bound when updating existing dependencies. #[test] fn add_lower_bound_existing() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -4628,7 +4628,7 @@ fn add_lower_bound_existing() -> Result<()> { /// Avoid setting a lower bound with `--raw`. #[test] fn add_lower_bound_raw() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -4678,7 +4678,7 @@ fn add_lower_bound_raw() -> Result<()> { /// Set a lower bound when adding unconstrained dev dependencies. #[test] fn add_lower_bound_dev() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -4731,7 +4731,7 @@ fn add_lower_bound_dev() -> Result<()> { /// Set a lower bound when adding unconstrained optional dependencies. #[test] fn add_lower_bound_optional() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -4846,7 +4846,7 @@ fn add_lower_bound_optional() -> Result<()> { /// Omit the local segment when adding dependencies (since `>=1.2.3+local` is invalid). #[test] fn add_lower_bound_local() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -4931,7 +4931,7 @@ fn add_lower_bound_local() -> Result<()> { /// Add dependencies to a (legacy) non-project workspace root. #[test] fn add_non_project() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r" @@ -5030,7 +5030,7 @@ fn add_non_project() -> Result<()> { #[test] fn add_virtual_empty() -> Result<()> { // testing how `uv add` reacts to a pyproject with no `[project]` and nothing useful to it - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -5103,7 +5103,7 @@ fn add_virtual_empty() -> Result<()> { fn add_virtual_dependency_group() -> Result<()> { // testing basic `uv add --group` functionality // when the pyproject.toml is fully virtual (no `[project]`) - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -5190,7 +5190,7 @@ fn add_virtual_dependency_group() -> Result<()> { fn add_empty_requirements_group() -> Result<()> { // Test that `uv add -r requirements.txt --group ` creates an empty group // when the requirements file is empty - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -5243,7 +5243,7 @@ fn add_empty_requirements_group() -> Result<()> { fn add_empty_requirements_optional() -> Result<()> { // Test that `uv add -r requirements.txt --optional ` creates an empty extra // when the requirements file is empty - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -5295,7 +5295,7 @@ fn add_empty_requirements_optional() -> Result<()> { #[test] fn remove_virtual_empty() -> Result<()> { // testing how `uv remove` reacts to a pyproject with no `[project]` and nothing useful to it - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5364,7 +5364,7 @@ fn remove_virtual_empty() -> Result<()> { fn remove_virtual_dependency_group() -> Result<()> { // testing basic `uv remove --group` functionality // when the pyproject.toml is fully virtual (no `[project]`) - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -5438,7 +5438,7 @@ fn remove_virtual_dependency_group() -> Result<()> { /// Add the same requirement multiple times. #[test] fn add_repeat() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -5516,7 +5516,7 @@ fn add_repeat() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn add_requirements_file() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -5616,7 +5616,7 @@ fn add_requirements_file() -> Result<()> { /// Add a path dependency from a requirements file, respecting the lack of a `-e` flag. #[test] fn add_requirements_file_non_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -5688,7 +5688,7 @@ fn add_requirements_file_non_editable() -> Result<()> { /// Add a path dependency from a requirements file, respecting `-e` for editable. #[test] fn add_requirements_file_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -5760,7 +5760,7 @@ fn add_requirements_file_editable() -> Result<()> { /// Add a path dependency from a requirements file, overriding the `-e` flag. #[test] fn add_requirements_file_editable_override() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -5838,7 +5838,7 @@ fn add_requirements_file_editable_override() -> Result<()> { /// * We only sync the packages applicable under this marker #[test] fn add_requirements_file_with_marker_flag() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_win_txt = context.temp_dir.child("requirements.win.txt"); requirements_win_txt.write_str("anyio>=2.31.0\niniconfig>=2; sys_platform != 'fantasy_os'\nnumpy>1.9; sys_platform == 'fantasy_os'")?; @@ -5925,7 +5925,7 @@ fn add_requirements_file_with_marker_flag() -> Result<()> { /// or `uv.lock` file. #[test] fn add_requirements_file_constraints() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -6167,7 +6167,7 @@ fn add_requirements_file_constraints() -> Result<()> { /// Add a requirement to a dependency group. #[test] fn add_group() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -6311,7 +6311,7 @@ fn add_group() -> Result<()> { /// Normalize group names when adding or removing. #[test] fn add_group_normalize() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -6457,7 +6457,7 @@ fn add_group_normalize() -> Result<()> { /// Add a requirement to a dependency group (sorted before the other groups). #[test] fn add_group_before_commented_groups() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -6526,7 +6526,7 @@ fn add_group_before_commented_groups() -> Result<()> { /// Add a requirement to dependency group (sorted between the other groups). #[test] fn add_group_between_commented_groups() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -6596,7 +6596,7 @@ fn add_group_between_commented_groups() -> Result<()> { /// keys are not sorted. #[test] fn add_group_to_unsorted() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -6661,7 +6661,7 @@ fn add_group_to_unsorted() -> Result<()> { /// Remove a requirement from a dependency group. #[test] fn remove_group() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -6768,7 +6768,7 @@ fn remove_group() -> Result<()> { /// Add to a PEP 732 script. #[test] fn add_script() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let script = context.temp_dir.child("script.py"); script.write_str(indoc! {r#" @@ -6832,7 +6832,7 @@ fn add_script() -> Result<()> { /// Test that `--bounds` is respected when adding to a script without a lockfile. #[test] fn add_script_bounds() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let script = context.temp_dir.child("script.py"); script.write_str(indoc! {r#" @@ -6876,7 +6876,7 @@ fn add_script_bounds() -> Result<()> { #[test] fn add_script_relative_path() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let project = context.temp_dir.child("project"); project.child("pyproject.toml").write_str(indoc! {r#" @@ -6927,7 +6927,7 @@ fn add_script_relative_path() -> Result<()> { /// Respect inline settings when adding to a PEP 732 script. #[test] fn add_script_settings() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let script = context.temp_dir.child("script.py"); script.write_str(indoc! {r#" @@ -7100,7 +7100,7 @@ fn add_script_settings() -> Result<()> { #[test] fn add_script_trailing_comment_lines() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let script = context.temp_dir.child("script.py"); script.write_str(indoc! {r#" @@ -7168,7 +7168,7 @@ fn add_script_trailing_comment_lines() -> Result<()> { /// Add to a script without an existing metadata table. #[test] fn add_script_without_metadata_table() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let script = context.temp_dir.child("script.py"); script.write_str(indoc! {r#" @@ -7218,7 +7218,7 @@ fn add_script_without_metadata_table() -> Result<()> { /// Add to a script without an existing metadata table, but with a shebang. #[test] fn add_script_without_metadata_table_with_shebang() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let script = context.temp_dir.child("script.py"); script.write_str(indoc! {r#" @@ -7270,7 +7270,7 @@ fn add_script_without_metadata_table_with_shebang() -> Result<()> { /// Add to a script with a metadata table and a shebang. #[test] fn add_script_with_metadata_table_and_shebang() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let script = context.temp_dir.child("script.py"); script.write_str(indoc! {r#" @@ -7326,7 +7326,7 @@ fn add_script_with_metadata_table_and_shebang() -> Result<()> { /// Add to a script without a metadata table, but with a docstring. #[test] fn add_script_without_metadata_table_with_docstring() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let script = context.temp_dir.child("script.py"); script.write_str(indoc! {r#" @@ -7378,7 +7378,7 @@ fn add_script_without_metadata_table_with_docstring() -> Result<()> { /// Add to a script without a `.py` extension. #[test] fn add_extensionless_script() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let script = context.temp_dir.child("script"); script.write_str(indoc! {r#" @@ -7434,7 +7434,7 @@ fn add_extensionless_script() -> Result<()> { /// Add from a remote PEP 723 script via `-r`. #[tokio::test] async fn add_requirements_from_remote_script() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -7511,7 +7511,7 @@ async fn add_requirements_from_remote_script() -> Result<()> { /// Remove a dependency that is present in multiple places. #[test] fn remove_repeated() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let anyio_local = context.workspace_root.join("test/packages/anyio_local"); @@ -7648,7 +7648,7 @@ fn remove_repeated() -> Result<()> { /// Add to (and remove from) a PEP 732 script with a lockfile. #[test] fn add_remove_script_lock() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let script = context.temp_dir.child("script.py"); script.write_str(indoc! {r#" @@ -8219,7 +8219,7 @@ fn add_remove_script_lock() -> Result<()> { /// Remove from a PEP 723 script. #[test] fn remove_script() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let script = context.temp_dir.child("script.py"); script.write_str(indoc! {r#" @@ -8279,7 +8279,7 @@ fn remove_script() -> Result<()> { /// Remove last dependency PEP 723 script #[test] fn remove_last_dep_script() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let script = context.temp_dir.child("script.py"); script.write_str(indoc! {r#" @@ -8335,7 +8335,7 @@ fn remove_last_dep_script() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn add_git_to_script() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let script = context.temp_dir.child("script.py"); script.write_str(indoc! {r#" @@ -8396,7 +8396,7 @@ fn add_git_to_script() -> Result<()> { #[test] fn add_include_default_groups() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context .temp_dir @@ -8462,7 +8462,7 @@ fn add_include_default_groups() -> Result<()> { #[test] fn remove_include_default_groups() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context .temp_dir @@ -8522,7 +8522,7 @@ fn remove_include_default_groups() -> Result<()> { /// Revert changes to the `pyproject.toml` and `uv.lock` when the `add` operation fails. #[test] fn fail_to_add_revert_project() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context .temp_dir @@ -8610,7 +8610,7 @@ fn fail_to_add_revert_project() -> Result<()> { /// In this case, the project has an existing lockfile. #[test] fn fail_to_edit_revert_project() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context .temp_dir @@ -8713,7 +8713,7 @@ fn fail_to_edit_revert_project() -> Result<()> { /// Revert changes to the root `pyproject.toml` and `uv.lock` when the `add` operation fails. #[test] fn fail_to_add_revert_workspace_root() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context .temp_dir @@ -8823,7 +8823,7 @@ fn fail_to_add_revert_workspace_root() -> Result<()> { /// Revert changes to the root `pyproject.toml` and `uv.lock` when the `add` operation fails. #[test] fn fail_to_add_revert_workspace_member() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context .temp_dir @@ -8964,7 +8964,7 @@ fn fail_to_add_revert_workspace_member() -> Result<()> { /// to the operation. #[test] fn sorted_dependencies() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -9028,7 +9028,7 @@ fn sorted_dependencies() -> Result<()> { /// requirement specifier), that added dependencies are sorted in the same way. #[test] fn naive_sorted_dependencies() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -9085,7 +9085,7 @@ fn naive_sorted_dependencies() -> Result<()> { /// case sensitive sorted prior to the operation. #[test] fn case_sensitive_sorted_dependencies() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -9152,7 +9152,7 @@ fn case_sensitive_sorted_dependencies() -> Result<()> { /// requirement specifier), that added dependencies are sorted in the same way. #[test] fn case_sensitive_naive_sorted_dependencies() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -9211,7 +9211,7 @@ fn case_sensitive_naive_sorted_dependencies() -> Result<()> { /// Ensure that sorting is based on the name, rather than the combined name-and-specifiers. #[test] fn sorted_dependencies_name_specifiers() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -9300,7 +9300,7 @@ fn sorted_dependencies_name_specifiers() -> Result<()> { #[test] fn sorted_dependencies_with_include_group() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -9368,7 +9368,7 @@ fn sorted_dependencies_with_include_group() -> Result<()> { #[test] fn sorted_dependencies_new_dependency_after_include_group() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -9430,7 +9430,7 @@ fn sorted_dependencies_new_dependency_after_include_group() -> Result<()> { #[test] fn sorted_dependencies_include_group_kept_at_bottom() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -9497,7 +9497,7 @@ fn sorted_dependencies_include_group_kept_at_bottom() -> Result<()> { /// after adding a package. #[test] fn custom_dependencies() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -9550,7 +9550,7 @@ fn custom_dependencies() -> Result<()> { /// Regression test for: #[test] fn update_offset() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -9602,7 +9602,7 @@ fn update_offset() -> Result<()> { /// if there is a broken cyclic dependency on a local package. #[test] fn add_shadowed_name() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -9653,7 +9653,7 @@ fn add_shadowed_name() -> Result<()> { /// Warn when a user provides an index via `--index-url` or `--extra-index-url`. #[test] fn add_warn_index_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -9752,7 +9752,7 @@ fn add_warn_index_url() -> Result<()> { /// Don't warn if the user provides an index via `index-url` in `pyproject.toml`. #[test] fn add_no_warn_index_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -9840,7 +9840,7 @@ fn add_no_warn_index_url() -> Result<()> { /// Add an index provided via `--index`. #[test] fn add_index() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -10428,7 +10428,7 @@ fn add_index() -> Result<()> { /// Add an index provided via `--default-index`. #[test] fn add_default_index_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -10601,7 +10601,7 @@ fn add_default_index_url() -> Result<()> { #[test] fn add_index_credentials() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -10689,7 +10689,7 @@ fn add_index_credentials() -> Result<()> { #[test] fn existing_index_credentials() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -10786,7 +10786,7 @@ fn existing_index_credentials() -> Result<()> { /// Add an index with a trailing slash. #[test] fn add_index_with_trailing_slash() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -10882,7 +10882,7 @@ fn add_index_with_trailing_slash() -> Result<()> { /// Add an index without a trailing slash. #[test] fn add_index_without_trailing_slash() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -10978,7 +10978,7 @@ fn add_index_without_trailing_slash() -> Result<()> { /// Add an index with an existing relative path. #[test] fn add_index_with_existing_relative_path_index() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -11017,7 +11017,7 @@ fn add_index_with_existing_relative_path_index() -> Result<()> { /// Add an index with a non-existent relative path. #[test] fn add_index_with_non_existent_relative_path() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -11043,7 +11043,7 @@ fn add_index_with_non_existent_relative_path() -> Result<()> { /// Add an index with a non-existent relative path with the same name as a defined index. #[test] fn add_index_with_non_existent_relative_path_with_same_name_as_index() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -11072,7 +11072,7 @@ fn add_index_with_non_existent_relative_path_with_same_name_as_index() -> Result #[test] fn add_index_empty_directory() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -11108,7 +11108,7 @@ fn add_index_empty_directory() -> Result<()> { #[test] fn add_index_with_ambiguous_relative_path() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let mut filters = context.filters(); filters.push((r"\./|\.\\\\", r"[PREFIX]")); @@ -11149,7 +11149,7 @@ fn add_index_with_ambiguous_relative_path() -> Result<()> { /// Add a PyPI requirement. #[test] fn add_group_comment() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -11290,7 +11290,7 @@ fn add_group_comment() -> Result<()> { #[test] fn add_index_comments() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -11385,7 +11385,7 @@ fn add_index_comments() -> Result<()> { /// Accidentally add a dependency on the project itself. #[test] fn add_self() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -11501,7 +11501,7 @@ fn add_self() -> Result<()> { #[test] fn add_preserves_end_of_line_comments() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -11559,7 +11559,7 @@ fn add_preserves_end_of_line_comments() -> Result<()> { #[test] fn add_preserves_end_of_line_comment_on_non_last_deps() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -11615,7 +11615,7 @@ fn add_preserves_end_of_line_comment_on_non_last_deps() -> Result<()> { #[test] fn add_direct_url_subdirectory() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -11748,7 +11748,7 @@ fn add_direct_url_subdirectory() -> Result<()> { #[test] fn add_direct_url_subdirectory_raw() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -11878,7 +11878,7 @@ fn add_direct_url_subdirectory_raw() -> Result<()> { #[test] fn add_preserves_open_bracket_comment() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -11936,7 +11936,7 @@ fn add_preserves_open_bracket_comment() -> Result<()> { #[test] fn add_preserves_empty_comment() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -11989,7 +11989,7 @@ fn add_preserves_empty_comment() -> Result<()> { #[test] fn add_preserves_trailing_comment() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -12082,7 +12082,7 @@ fn add_preserves_trailing_comment() -> Result<()> { #[test] fn add_preserves_trailing_depth() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -12140,7 +12140,7 @@ fn add_preserves_trailing_depth() -> Result<()> { #[test] fn add_preserves_first_own_line_comment() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -12191,7 +12191,7 @@ fn add_preserves_first_own_line_comment() -> Result<()> { #[test] fn add_preserves_first_line_bracket_comment() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -12240,7 +12240,7 @@ fn add_preserves_first_line_bracket_comment() -> Result<()> { #[test] fn add_no_indent() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -12290,7 +12290,7 @@ fn add_no_indent() -> Result<()> { /// Accept requirements, not just package names, in `uv remove`. #[test] fn remove_requirement() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -12333,7 +12333,7 @@ fn remove_requirement() -> Result<()> { /// Remove all dependencies with remaining comments #[test] fn remove_all_with_comments() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -12387,7 +12387,7 @@ fn remove_all_with_comments() -> Result<()> { /// See: #[test] fn multiple_index_cli() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -12499,7 +12499,7 @@ fn multiple_index_cli() -> Result<()> { /// See: #[test] fn repeated_index_cli_environment_variable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -12610,7 +12610,7 @@ fn repeated_index_cli_environment_variable() -> Result<()> { /// See: #[test] fn repeated_index_cli_environment_variable_newline() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -12715,7 +12715,7 @@ fn repeated_index_cli_environment_variable_newline() -> Result<()> { /// See: #[test] fn repeated_index_cli() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -12825,7 +12825,7 @@ fn repeated_index_cli() -> Result<()> { /// See: #[test] fn repeated_index_cli_reversed() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -12929,7 +12929,7 @@ fn repeated_index_cli_reversed() -> Result<()> { #[test] fn add_with_build_constraints() -> Result<()> { - let context = TestContext::new("3.9"); + let context = uv_test::test_context!("3.9"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -12986,7 +12986,7 @@ fn add_with_build_constraints() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn add_unsupported_git_scheme() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context.init().arg(".").assert().success(); @@ -13005,7 +13005,7 @@ fn add_unsupported_git_scheme() { #[test] fn add_index_url_in_keyring() -> Result<()> { - let keyring_context = TestContext::new("3.12"); + let keyring_context = uv_test::test_context!("3.12"); // Install our keyring plugin keyring_context @@ -13020,7 +13020,7 @@ fn add_index_url_in_keyring() -> Result<()> { .assert() .success(); - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -13063,7 +13063,7 @@ fn add_index_url_in_keyring() -> Result<()> { #[test] fn add_full_url_in_keyring() -> Result<()> { - let keyring_context = TestContext::new("3.12"); + let keyring_context = uv_test::test_context!("3.12"); // Install our keyring plugin keyring_context @@ -13078,7 +13078,7 @@ fn add_full_url_in_keyring() -> Result<()> { .assert() .success(); - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -13121,7 +13121,7 @@ fn add_full_url_in_keyring() -> Result<()> { /// should not fall back to the default index. #[test] fn add_stop_index_search_early_on_auth_failure() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -13156,7 +13156,7 @@ fn add_stop_index_search_early_on_auth_failure() -> Result<()> { /// authentication failure that is specified in `ignore-error-codes`. #[test] fn add_ignore_error_codes() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -13195,7 +13195,7 @@ fn add_ignore_error_codes() -> Result<()> { /// in `ignore-error-codes`, even for indexes that normally ignore 403s. #[tokio::test] async fn add_empty_ignore_error_codes() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let server = MockServer::start().await; @@ -13241,7 +13241,7 @@ async fn add_empty_ignore_error_codes() -> Result<()> { /// pytorch returns 403s to indicate not found. #[test] fn add_missing_package_on_pytorch() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -13277,7 +13277,7 @@ fn add_missing_package_on_pytorch() -> Result<()> { /// Test HTTP errors other than 401s and 403s. #[tokio::test] async fn add_unexpected_error_code() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let server = MockServer::start().await; @@ -13315,7 +13315,7 @@ async fn add_unexpected_error_code() -> Result<()> { /// contains an invalid status code number. #[test] fn add_invalid_ignore_error_code() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -13360,7 +13360,7 @@ fn add_invalid_ignore_error_code() -> Result<()> { /// contains an invalid specifier and try to return a helpful hint. #[test] fn add_invalid_requires_python() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -13394,7 +13394,7 @@ fn add_invalid_requires_python() -> Result<()> { /// In authentication "always", the normal authentication flow should still work. #[test] fn add_auth_policy_always_with_credentials() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -13437,7 +13437,7 @@ fn add_auth_policy_always_with_credentials() -> Result<()> { /// doesn't require credentials will fail. #[test] fn add_auth_policy_always_without_credentials() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -13483,7 +13483,7 @@ fn add_auth_policy_always_without_credentials() -> Result<()> { /// no discoverable password will fail. #[test] fn add_auth_policy_always_with_username_no_password() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -13518,7 +13518,7 @@ fn add_auth_policy_always_with_username_no_password() -> Result<()> { /// in the URL, no authenticated requests will be allowed. #[test] fn add_auth_policy_never_with_url_credentials() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -13554,7 +13554,7 @@ fn add_auth_policy_never_with_url_credentials() -> Result<()> { /// via env vars, no authenticated requests will be allowed. #[test] fn add_auth_policy_never_with_env_var_credentials() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -13595,7 +13595,7 @@ fn add_auth_policy_never_with_env_var_credentials() -> Result<()> { /// still work. #[test] fn add_auth_policy_never_without_credentials() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -13637,7 +13637,7 @@ fn add_auth_policy_never_without_credentials() -> Result<()> { /// it should fail. #[tokio::test] async fn add_redirect_cross_origin() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let filters = context .filters() .into_iter() @@ -13689,7 +13689,7 @@ async fn add_redirect_cross_origin() -> Result<()> { /// in the location, use those credentials for the redirect request. #[tokio::test] async fn add_redirect_cross_origin_credentials_in_location() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let filters = context .filters() .into_iter() @@ -13743,7 +13743,7 @@ async fn add_redirect_cross_origin_credentials_in_location() -> Result<()> { /// uv currently fails to look up keyring credentials on a cross-origin redirect. #[tokio::test] async fn add_redirect_with_keyring_cross_origin() -> Result<()> { - let keyring_context = TestContext::new("3.12"); + let keyring_context = uv_test::test_context!("3.12"); // Install our keyring plugin keyring_context @@ -13758,7 +13758,7 @@ async fn add_redirect_with_keyring_cross_origin() -> Result<()> { .assert() .success(); - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let filters = context .filters() .into_iter() @@ -13818,7 +13818,7 @@ async fn add_redirect_with_keyring_cross_origin() -> Result<()> { /// for the new location. #[tokio::test] async fn pip_install_redirect_with_netrc_cross_origin() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let filters = context .filters() .into_iter() @@ -13884,7 +13884,7 @@ fn redirect_url_to_base(req: &wiremock::Request, base: &str) -> String { /// `pyproject.toml`. #[test] fn add_ambiguous() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context .temp_dir @@ -13930,7 +13930,7 @@ fn add_ambiguous() -> Result<()> { /// Normalize extra names when adding or removing. #[test] fn add_optional_normalize() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -14076,7 +14076,7 @@ fn add_optional_normalize() -> Result<()> { /// Test `uv add` with different kinds of bounds and constraints. #[test] fn add_bounds() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Set bounds in `uv.toml` let uv_toml = context.temp_dir.child("uv.toml"); @@ -14253,7 +14253,7 @@ fn add_bounds() -> Result<()> { /// Hint that we're using an explicit bound over the preferred bounds. #[test] fn add_bounds_requirement_over_bounds_kind() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Set bounds in `uv.toml` let uv_toml = context.temp_dir.child("uv.toml"); @@ -14304,7 +14304,7 @@ fn add_bounds_requirement_over_bounds_kind() -> Result<()> { /// contains a workspace definition, so the package should be added to the workspace members. #[test] fn add_path_with_existing_workspace() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let workspace_toml = context.temp_dir.child("pyproject.toml"); workspace_toml.write_str(indoc! {r#" @@ -14400,7 +14400,7 @@ fn add_path_with_existing_workspace() -> Result<()> { /// contain a workspace definition, so `uv add` should create one. #[test] fn add_path_with_workspace() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let workspace_toml = context.temp_dir.child("pyproject.toml"); workspace_toml.write_str(indoc! {r#" @@ -14468,7 +14468,7 @@ fn add_path_with_workspace() -> Result<()> { /// It should automatically be added as a workspace member. #[test] fn add_path_within_workspace_defaults_to_workspace() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let workspace_toml = context.temp_dir.child("pyproject.toml"); workspace_toml.write_str(indoc! {r#" @@ -14536,7 +14536,7 @@ fn add_path_within_workspace_defaults_to_workspace() -> Result<()> { /// It should be added as a direct path dependency. #[test] fn add_path_with_no_workspace() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let workspace_toml = context.temp_dir.child("pyproject.toml"); workspace_toml.write_str(indoc! {r#" @@ -14601,7 +14601,7 @@ fn add_path_with_no_workspace() -> Result<()> { /// It should be added as a direct path dependency, not a workspace member. #[test] fn add_path_outside_workspace_no_default() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a workspace directory let workspace_dir = context.temp_dir.child("workspace"); @@ -14673,7 +14673,7 @@ fn add_path_outside_workspace_no_default() -> Result<()> { /// See: #[test] fn add_multiline_indentation() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -14728,7 +14728,7 @@ fn add_multiline_indentation() -> Result<()> { /// Add a requirement without installing the project. #[test] fn add_no_install_project() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -14827,7 +14827,7 @@ fn add_no_install_project() -> Result<()> { #[test] #[cfg(feature = "test-git-lfs")] fn add_git_lfs_error() -> Result<()> { - let context = TestContext::new("3.13").with_git_lfs_config(); + let context = uv_test::test_context!("3.13").with_git_lfs_config(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" diff --git a/crates/uv/tests/it/export.rs b/crates/uv/tests/it/export.rs index 40930cfbe..c9726645e 100644 --- a/crates/uv/tests/it/export.rs +++ b/crates/uv/tests/it/export.rs @@ -1,8 +1,5 @@ #![allow(clippy::disallowed_types)] -#[cfg(feature = "test-git")] -use crate::common::{READ_ONLY_GITHUB_SSH_DEPLOY_KEY, READ_ONLY_GITHUB_TOKEN, decode_token}; -use crate::common::{TestContext, apply_filters, copy_dir_ignore, uv_snapshot}; use anyhow::{Ok, Result}; use assert_cmd::assert::OutputAssertExt; use assert_fs::prelude::*; @@ -14,10 +11,13 @@ use std::process::Stdio; #[cfg(feature = "test-git")] use uv_fs::Simplified; use uv_static::EnvVars; +#[cfg(feature = "test-git")] +use uv_test::{READ_ONLY_GITHUB_SSH_DEPLOY_KEY, READ_ONLY_GITHUB_TOKEN, decode_token}; +use uv_test::{apply_filters, copy_dir_ignore, uv_snapshot}; #[test] fn requirements_txt_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -65,7 +65,7 @@ fn requirements_txt_dependency() -> Result<()> { #[test] fn requirements_txt_export_no_header() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -111,7 +111,7 @@ fn requirements_txt_export_no_header() -> Result<()> { #[test] fn requirements_txt_dependency_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -194,7 +194,7 @@ fn requirements_txt_dependency_extra() -> Result<()> { #[test] fn requirements_txt_project_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -346,7 +346,7 @@ fn requirements_txt_project_extra() -> Result<()> { #[test] fn requirements_txt_prune() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -411,7 +411,7 @@ fn requirements_txt_prune() -> Result<()> { #[test] fn requirements_txt_dependency_marker() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -463,7 +463,7 @@ fn requirements_txt_dependency_marker() -> Result<()> { #[test] fn requirements_txt_dependency_multiple_markers() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -546,7 +546,7 @@ fn requirements_txt_dependency_multiple_markers() -> Result<()> { #[test] fn requirements_txt_dependency_conflicting_markers() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -790,7 +790,7 @@ fn requirements_txt_dependency_conflicting_markers() -> Result<()> { #[test] fn requirements_txt_non_root() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -851,7 +851,7 @@ fn requirements_txt_non_root() -> Result<()> { #[test] fn allrequirements_txt_() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -926,7 +926,7 @@ fn allrequirements_txt_() -> Result<()> { #[test] fn requirements_txt_frozen() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1014,7 +1014,7 @@ fn requirements_txt_frozen() -> Result<()> { #[test] fn requirements_txt_create_missing_dir() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1092,7 +1092,7 @@ fn requirements_txt_create_missing_dir() -> Result<()> { #[test] fn requirements_txt_non_project() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1148,7 +1148,7 @@ fn requirements_txt_non_project() -> Result<()> { #[test] fn virtual_empty() -> Result<()> { // testing how `uv export` reacts to a pyproject with no `[project]` and nothing useful to it - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -1175,7 +1175,7 @@ fn virtual_empty() -> Result<()> { fn virtual_dependency_group() -> Result<()> { // testing basic `uv export --group` functionality // when the pyproject.toml is fully virtual (no `[project]`) - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -1244,7 +1244,7 @@ fn virtual_dependency_group() -> Result<()> { #[cfg(feature = "test-git")] #[test] fn requirements_txt_https_git_credentials() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let token = decode_token(READ_ONLY_GITHUB_TOKEN); let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -1309,7 +1309,7 @@ fn reduce_ssh_key_file_permissions(key_file: &Path) -> Result<()> { #[cfg(feature = "test-git")] #[test] fn requirements_txt_ssh_git_username() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1397,7 +1397,7 @@ fn requirements_txt_ssh_git_username() -> Result<()> { #[test] fn requirements_txt_https_credentials() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(&formatdoc! {r#" @@ -1430,7 +1430,7 @@ fn requirements_txt_https_credentials() -> Result<()> { #[test] fn requirements_txt_non_project_marker() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1485,7 +1485,7 @@ fn requirements_txt_non_project_marker() -> Result<()> { #[test] fn requirements_txt_non_project_workspace() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1563,7 +1563,7 @@ fn requirements_txt_non_project_workspace() -> Result<()> { #[test] fn requirements_txt_non_project_fork() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1789,7 +1789,7 @@ fn requirements_txt_non_project_fork() -> Result<()> { #[test] fn requirements_txt_relative_path() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let dependency = context.temp_dir.child("dependency"); dependency.child("pyproject.toml").write_str( @@ -1877,7 +1877,7 @@ fn requirements_txt_relative_path() -> Result<()> { #[test] fn devrequirements_txt_() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1972,7 +1972,7 @@ fn devrequirements_txt_() -> Result<()> { #[test] fn requirements_txt_no_hashes() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2014,7 +2014,7 @@ fn requirements_txt_no_hashes() -> Result<()> { #[test] fn requirements_txt_output_file() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2081,7 +2081,7 @@ fn requirements_txt_output_file() -> Result<()> { #[test] fn requirements_txt_no_emit() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2267,7 +2267,7 @@ fn requirements_txt_no_emit() -> Result<()> { #[test] fn requirements_txt_only_emit() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2353,7 +2353,7 @@ fn requirements_txt_only_emit() -> Result<()> { #[test] fn requirements_txt_no_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2428,7 +2428,7 @@ fn requirements_txt_no_editable() -> Result<()> { #[test] fn requirements_txt_export_group() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2605,7 +2605,7 @@ fn requirements_txt_export_group() -> Result<()> { #[test] fn requirements_txt_script() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let script = context.temp_dir.child("script.py"); script.write_str(indoc! {r#" @@ -2868,7 +2868,7 @@ fn requirements_txt_script() -> Result<()> { #[test] fn requirements_txt_conflicts() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2970,7 +2970,7 @@ fn requirements_txt_conflicts() -> Result<()> { #[test] fn requirements_txt_simple_conflict_markers() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3055,7 +3055,7 @@ fn requirements_txt_simple_conflict_markers() -> Result<()> { #[test] fn requirements_txt_complex_conflict_markers() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3430,7 +3430,7 @@ fn requirements_txt_complex_conflict_markers() -> Result<()> { /// Export requirements in the presence of a cycle. #[test] fn requirements_txt_cyclic_dependencies() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3516,7 +3516,7 @@ fn requirements_txt_cyclic_dependencies() -> Result<()> { /// Export requirements in the presence of a cycle, with conflicts enabled. #[test] fn requirements_txt_cyclic_dependencies_conflict() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3615,7 +3615,7 @@ fn requirements_txt_cyclic_dependencies_conflict() -> Result<()> { #[test] fn pep_751_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3678,7 +3678,7 @@ fn pep_751_dependency() -> Result<()> { #[test] fn pep_751_export_no_header() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3739,7 +3739,7 @@ fn pep_751_export_no_header() -> Result<()> { #[test] fn pep_751_export_no_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3802,7 +3802,7 @@ fn pep_751_export_no_editable() -> Result<()> { #[test] fn pep_751_dependency_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3919,7 +3919,7 @@ fn pep_751_dependency_extra() -> Result<()> { #[test] fn pep_751_project_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -4150,7 +4150,7 @@ fn pep_751_project_extra() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn pep_751_git_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -4192,7 +4192,7 @@ fn pep_751_git_dependency() -> Result<()> { #[test] fn pep_751_wheel_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -4245,7 +4245,7 @@ fn pep_751_wheel_url() -> Result<()> { #[test] fn pep_751_sdist_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -4298,7 +4298,7 @@ fn pep_751_sdist_url() -> Result<()> { #[test] fn pep_751_sdist_url_subdirectory() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -4361,7 +4361,7 @@ fn pep_751_sdist_url_subdirectory() -> Result<()> { #[test] fn pep_751_infer_output_format() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -4497,7 +4497,7 @@ fn pep_751_infer_output_format() -> Result<()> { #[test] fn pep_751_filename() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -4532,7 +4532,7 @@ fn pep_751_filename() -> Result<()> { #[cfg(feature = "test-git")] #[test] fn pep_751_https_git_credentials() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let token = decode_token(READ_ONLY_GITHUB_TOKEN); let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -4571,7 +4571,7 @@ fn pep_751_https_git_credentials() -> Result<()> { #[test] fn pep_751_https_credentials() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(&formatdoc! {r#" @@ -4612,7 +4612,7 @@ fn pep_751_https_credentials() -> Result<()> { /// #[test] fn no_editable_env_var() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context .init() @@ -4640,7 +4640,7 @@ fn no_editable_env_var() -> Result<()> { #[test] fn export_only_group_and_extra_conflict() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -4693,7 +4693,7 @@ fn export_only_group_and_extra_conflict() -> Result<()> { /// The members in the workspace (`foo`) and in the lockfile (`bar`) mismatch. #[test] fn export_lock_workspace_mismatch_with_frozen() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -4735,7 +4735,7 @@ fn export_lock_workspace_mismatch_with_frozen() -> Result<()> { /// Export multiple packages within a workspace. #[test] fn multiple_packages() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -4878,7 +4878,7 @@ fn multiple_packages() -> Result<()> { #[test] fn cyclonedx_export_basic() -> Result<()> { - let context = TestContext::new("3.12").with_cyclonedx_filters(); + let context = uv_test::test_context!("3.12").with_cyclonedx_filters(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#" @@ -4959,7 +4959,7 @@ fn cyclonedx_export_basic() -> Result<()> { #[test] fn cyclonedx_export_direct_url() -> Result<()> { - let context = TestContext::new("3.12").with_cyclonedx_filters(); + let context = uv_test::test_context!("3.12").with_cyclonedx_filters(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5042,7 +5042,7 @@ fn cyclonedx_export_direct_url() -> Result<()> { #[cfg(feature = "test-git")] #[test] fn cyclonedx_export_git_dependency() -> Result<()> { - let context = TestContext::new("3.12").with_cyclonedx_filters(); + let context = uv_test::test_context!("3.12").with_cyclonedx_filters(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5124,7 +5124,7 @@ fn cyclonedx_export_git_dependency() -> Result<()> { #[test] fn cyclonedx_export_no_dependencies() -> Result<()> { - let context = TestContext::new("3.12").with_cyclonedx_filters(); + let context = uv_test::test_context!("3.12").with_cyclonedx_filters(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5193,7 +5193,7 @@ fn cyclonedx_export_no_dependencies() -> Result<()> { #[cfg(feature = "test-git")] #[test] fn cyclonedx_export_mixed_source_types() -> Result<()> { - let context = TestContext::new("3.12").with_cyclonedx_filters(); + let context = uv_test::test_context!("3.12").with_cyclonedx_filters(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5303,7 +5303,7 @@ fn cyclonedx_export_mixed_source_types() -> Result<()> { #[test] fn cyclonedx_export_project_extra() -> Result<()> { - let context = TestContext::new("3.12").with_cyclonedx_filters(); + let context = uv_test::test_context!("3.12").with_cyclonedx_filters(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5389,7 +5389,7 @@ fn cyclonedx_export_project_extra() -> Result<()> { #[test] fn cyclonedx_export_project_extra_with_optional_flag() -> Result<()> { - let context = TestContext::new("3.12").with_cyclonedx_filters(); + let context = uv_test::test_context!("3.12").with_cyclonedx_filters(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5499,7 +5499,7 @@ fn cyclonedx_export_project_extra_with_optional_flag() -> Result<()> { #[test] fn cyclonedx_export_with_workspace_member() -> Result<()> { - let context = TestContext::new("3.12").with_cyclonedx_filters(); + let context = uv_test::test_context!("3.12").with_cyclonedx_filters(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5665,7 +5665,7 @@ fn cyclonedx_export_with_workspace_member() -> Result<()> { #[test] fn cyclonedx_export_workspace_non_root() -> Result<()> { - let context = TestContext::new("3.12").with_cyclonedx_filters(); + let context = uv_test::test_context!("3.12").with_cyclonedx_filters(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5768,7 +5768,7 @@ fn cyclonedx_export_workspace_non_root() -> Result<()> { #[test] fn cyclonedx_export_workspace_with_extras() -> Result<()> { - let context = TestContext::new("3.12").with_cyclonedx_filters(); + let context = uv_test::test_context!("3.12").with_cyclonedx_filters(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5993,7 +5993,7 @@ fn cyclonedx_export_workspace_with_extras() -> Result<()> { #[test] fn cyclonedx_export_workspace_frozen() -> Result<()> { - let context = TestContext::new("3.12").with_cyclonedx_filters(); + let context = uv_test::test_context!("3.12").with_cyclonedx_filters(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -6157,7 +6157,7 @@ fn cyclonedx_export_workspace_frozen() -> Result<()> { #[test] fn cyclonedx_export_workspace_all_packages() -> Result<()> { - let context = TestContext::new("3.12").with_cyclonedx_filters(); + let context = uv_test::test_context!("3.12").with_cyclonedx_filters(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -6349,7 +6349,7 @@ fn cyclonedx_export_workspace_all_packages() -> Result<()> { #[test] fn cyclonedx_export_all_packages_non_workspace_root_dependency() -> Result<()> { - let context = TestContext::new("3.12").with_cyclonedx_filters(); + let context = uv_test::test_context!("3.12").with_cyclonedx_filters(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -6449,7 +6449,7 @@ fn cyclonedx_export_all_packages_non_workspace_root_dependency() -> Result<()> { // Contains a combination of combination of workspace and registry deps, with another workspace dep not depended on by the root #[test] fn cyclonedx_export_workspace_mixed_dependencies() -> Result<()> { - let context = TestContext::new("3.12").with_cyclonedx_filters(); + let context = uv_test::test_context!("3.12").with_cyclonedx_filters(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -6630,7 +6630,7 @@ fn cyclonedx_export_workspace_mixed_dependencies() -> Result<()> { #[test] fn cyclonedx_export_dependency_marker() -> Result<()> { - let context = TestContext::new("3.12").with_cyclonedx_filters(); + let context = uv_test::test_context!("3.12").with_cyclonedx_filters(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -6733,7 +6733,7 @@ fn cyclonedx_export_dependency_marker() -> Result<()> { #[test] fn cyclonedx_export_multiple_dependency_markers() -> Result<()> { - let context = TestContext::new("3.12").with_cyclonedx_filters(); + let context = uv_test::test_context!("3.12").with_cyclonedx_filters(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -6862,7 +6862,7 @@ fn cyclonedx_export_multiple_dependency_markers() -> Result<()> { #[test] fn cyclonedx_export_dependency_extra() -> Result<()> { - let context = TestContext::new("3.12").with_cyclonedx_filters(); + let context = uv_test::test_context!("3.12").with_cyclonedx_filters(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -6994,7 +6994,7 @@ fn cyclonedx_export_dependency_extra() -> Result<()> { #[test] fn cyclonedx_export_prune() -> Result<()> { - let context = TestContext::new("3.12").with_cyclonedx_filters(); + let context = uv_test::test_context!("3.12").with_cyclonedx_filters(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -7182,7 +7182,7 @@ fn cyclonedx_export_prune() -> Result<()> { #[test] fn cyclonedx_export_group() -> Result<()> { - let context = TestContext::new("3.12").with_cyclonedx_filters(); + let context = uv_test::test_context!("3.12").with_cyclonedx_filters(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -7420,7 +7420,7 @@ fn cyclonedx_export_group() -> Result<()> { #[test] fn cyclonedx_export_non_project() -> Result<()> { - let context = TestContext::new("3.12").with_cyclonedx_filters(); + let context = uv_test::test_context!("3.12").with_cyclonedx_filters(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -7542,7 +7542,7 @@ fn cyclonedx_export_non_project() -> Result<()> { #[test] fn cyclonedx_export_no_emit() -> Result<()> { - let context = TestContext::new("3.12").with_cyclonedx_filters(); + let context = uv_test::test_context!("3.12").with_cyclonedx_filters(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -7746,7 +7746,7 @@ fn cyclonedx_export_no_emit() -> Result<()> { #[test] fn cyclonedx_export_relative_path() -> Result<()> { - let context = TestContext::new("3.12").with_cyclonedx_filters(); + let context = uv_test::test_context!("3.12").with_cyclonedx_filters(); let dependency = context.temp_dir.child("dependency"); dependency.child("pyproject.toml").write_str( @@ -7859,7 +7859,7 @@ fn cyclonedx_export_relative_path() -> Result<()> { #[test] fn cyclonedx_export_cyclic_dependencies() -> Result<()> { - let context = TestContext::new("3.12").with_cyclonedx_filters(); + let context = uv_test::test_context!("3.12").with_cyclonedx_filters(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -8058,7 +8058,7 @@ fn cyclonedx_export_cyclic_dependencies() -> Result<()> { #[test] fn cyclonedx_export_dev_dependencies() -> Result<()> { - let context = TestContext::new("3.12").with_cyclonedx_filters(); + let context = uv_test::test_context!("3.12").with_cyclonedx_filters(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -8271,7 +8271,7 @@ fn cyclonedx_export_dev_dependencies() -> Result<()> { #[test] fn cyclonedx_export_all_packages_conflicting_workspace_members() -> Result<()> { - let context = TestContext::new("3.12").with_cyclonedx_filters(); + let context = uv_test::test_context!("3.12").with_cyclonedx_filters(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -8424,7 +8424,7 @@ fn cyclonedx_export_all_packages_conflicting_workspace_members() -> Result<()> { #[test] fn cyclonedx_export_alternative_registry() -> Result<()> { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_cyclonedx_filters() .with_exclude_newer("2025-01-30T00:00:00Z"); @@ -8656,7 +8656,7 @@ fn cyclonedx_export_alternative_registry() -> Result<()> { #[test] fn cyclonedx_export_virtual_workspace_fixture() -> Result<()> { - let context = TestContext::new("3.12").with_cyclonedx_filters(); + let context = uv_test::test_context!("3.12").with_cyclonedx_filters(); let workspace = context.temp_dir.child("workspace"); copy_dir_ignore( diff --git a/crates/uv/tests/it/format.rs b/crates/uv/tests/it/format.rs index 5f63a618a..a258bc97b 100644 --- a/crates/uv/tests/it/format.rs +++ b/crates/uv/tests/it/format.rs @@ -3,11 +3,11 @@ use assert_fs::prelude::*; use indoc::indoc; use insta::assert_snapshot; -use crate::common::{TestContext, uv_snapshot}; +use uv_test::uv_snapshot; #[test] fn format_project() -> Result<()> { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -43,7 +43,7 @@ fn format_project() -> Result<()> { #[test] fn format_missing_pyproject_toml() -> Result<()> { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); // Create an unformatted Python file let main_py = context.temp_dir.child("main.py"); @@ -70,7 +70,7 @@ fn format_missing_pyproject_toml() -> Result<()> { #[test] fn format_missing_project_in_pyproject_toml() -> Result<()> { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); // Create an empty pyproject.toml with no [project] section context.temp_dir.child("pyproject.toml"); @@ -100,7 +100,7 @@ fn format_missing_project_in_pyproject_toml() -> Result<()> { #[test] fn format_unmanaged_project() -> Result<()> { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -139,7 +139,7 @@ fn format_unmanaged_project() -> Result<()> { #[test] fn format_from_project_root() -> Result<()> { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -179,7 +179,7 @@ fn format_from_project_root() -> Result<()> { #[test] fn format_no_project() -> Result<()> { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); let main_py = context.temp_dir.child("main.py"); main_py.write_str(indoc! {r" @@ -205,7 +205,7 @@ fn format_no_project() -> Result<()> { #[test] fn format_relative_project() -> Result<()> { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); let pyproject_toml = context.temp_dir.child("project").child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -251,7 +251,7 @@ fn format_relative_project() -> Result<()> { #[test] fn format_fails_malformed_pyproject() -> Result<()> { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str("malformed pyproject.toml")?; @@ -293,7 +293,7 @@ fn format_fails_malformed_pyproject() -> Result<()> { #[test] fn format_check() -> Result<()> { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -330,7 +330,7 @@ fn format_check() -> Result<()> { #[test] fn format_diff() -> Result<()> { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -372,7 +372,7 @@ fn format_diff() -> Result<()> { #[test] fn format_with_ruff_args() -> Result<()> { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -413,7 +413,7 @@ fn format_with_ruff_args() -> Result<()> { #[test] fn format_specific_files() -> Result<()> { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -457,7 +457,7 @@ fn format_specific_files() -> Result<()> { #[test] fn format_version_option() -> Result<()> { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" diff --git a/crates/uv/tests/it/help.rs b/crates/uv/tests/it/help.rs index d1e8b40cb..4c17836e4 100644 --- a/crates/uv/tests/it/help.rs +++ b/crates/uv/tests/it/help.rs @@ -1,10 +1,10 @@ use uv_static::EnvVars; -use crate::common::{TestContext, uv_snapshot}; +use uv_test::uv_snapshot; #[test] fn help() { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); // The `uv help` command should show the long help message uv_snapshot!(context.filters(), context.help(), @r#" @@ -86,7 +86,7 @@ fn help() { #[test] fn help_flag() { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); uv_snapshot!(context.filters(), context.command().arg("--help"), @r#" success: true @@ -165,7 +165,7 @@ fn help_flag() { #[test] fn help_short_flag() { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); uv_snapshot!(context.filters(), context.command().arg("-h"), @r#" success: true @@ -244,7 +244,7 @@ fn help_short_flag() { #[test] fn help_subcommand() { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); uv_snapshot!(context.filters(), context.help().arg("python"), @r#" success: true @@ -458,7 +458,7 @@ fn help_subcommand() { #[test] fn help_subsubcommand() { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); uv_snapshot!(context.filters(), context.help().env_remove(EnvVars::UV_PYTHON_INSTALL_DIR).arg("python").arg("install"), @r#" success: true @@ -742,7 +742,7 @@ fn help_subsubcommand() { #[test] fn help_flag_subcommand() { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); uv_snapshot!(context.filters(), context.command().arg("python").arg("--help"), @r#" success: true @@ -807,7 +807,7 @@ fn help_flag_subcommand() { #[test] fn help_flag_subsubcommand() { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); uv_snapshot!(context.filters(), context.command().arg("python").arg("install").arg("--help"), @r#" success: true @@ -888,7 +888,7 @@ fn help_flag_subsubcommand() { #[test] fn help_unknown_subcommand() { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); uv_snapshot!(context.filters(), context.help().arg("foobar"), @" success: false @@ -951,7 +951,7 @@ fn help_unknown_subcommand() { #[test] fn help_unknown_subsubcommand() { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); uv_snapshot!(context.filters(), context.help().arg("python").arg("foobar"), @" success: false @@ -973,7 +973,7 @@ fn help_unknown_subsubcommand() { #[test] fn help_with_global_option() { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); uv_snapshot!(context.filters(), context.help().arg("--no-cache"), @r#" success: true @@ -1054,7 +1054,7 @@ fn help_with_global_option() { #[test] fn help_with_help() { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); uv_snapshot!(context.filters(), context.help().arg("--help"), @" success: true @@ -1073,7 +1073,7 @@ fn help_with_help() { #[test] fn help_with_version() { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); uv_snapshot!(context.filters(), context.help().arg("--version"), @" success: false @@ -1093,7 +1093,7 @@ fn help_with_version() { #[test] fn help_with_no_pager() { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); // We can't really test whether the --no-pager option works with a snapshot test. // It's still nice to have a test for the option to confirm the option exists. diff --git a/crates/uv/tests/it/init.rs b/crates/uv/tests/it/init.rs index f12983ab1..de65b7bb5 100644 --- a/crates/uv/tests/it/init.rs +++ b/crates/uv/tests/it/init.rs @@ -9,11 +9,11 @@ use predicates::prelude::predicate; use uv_static::EnvVars; -use crate::common::{TestContext, uv_snapshot}; +use uv_test::{TestContext, uv_snapshot}; #[test] fn init() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.init().arg("foo"), @" success: true @@ -66,7 +66,7 @@ fn init() { #[test] fn init_bare() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.init().arg("foo").arg("--bare"), @" success: true @@ -114,7 +114,7 @@ fn init_bare() { /// Run `uv init --app` to create an application project #[test] fn init_application() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.child("foo"); child.create_dir_all()?; @@ -184,7 +184,7 @@ fn init_application() -> Result<()> { /// When `main.py` already exists, we don't create it again #[test] fn init_application_hello_exists() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.child("foo"); child.create_dir_all()?; @@ -234,7 +234,7 @@ fn init_application_hello_exists() -> Result<()> { /// When other Python files already exists, we still create `main.py` #[test] fn init_application_other_python_exists() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.child("foo"); child.create_dir_all()?; @@ -292,7 +292,7 @@ fn init_application_other_python_exists() -> Result<()> { /// Run `uv init --app --package` to create a packaged application project #[test] fn init_application_package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.child("foo"); child.create_dir_all()?; @@ -367,7 +367,7 @@ fn init_application_package() -> Result<()> { /// Run `uv init --lib` to create an library project #[test] fn init_library() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.child("foo"); child.create_dir_all()?; @@ -450,7 +450,7 @@ fn init_library() -> Result<()> { /// init lib test once the uv build backend becomes the stable default. #[test] fn init_package_preview() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.child("foo"); child.create_dir_all()?; @@ -493,7 +493,7 @@ fn init_package_preview() -> Result<()> { #[test] fn init_bare_lib() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.init().arg("foo").arg("--bare").arg("--lib"), @" success: true @@ -545,7 +545,7 @@ fn init_bare_lib() { #[test] fn init_bare_package() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.init().arg("foo").arg("--bare").arg("--package"), @" success: true @@ -597,7 +597,7 @@ fn init_bare_package() { #[test] fn init_bare_opt_in() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // With `--bare`, you can still opt-in to extras // TODO(zanieb): Add option for `--readme` @@ -650,7 +650,7 @@ fn init_bare_opt_in() { // General init --script correctness test #[test] fn init_script() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.child("foo"); child.create_dir_all()?; @@ -703,7 +703,7 @@ fn init_script() -> Result<()> { /// Using `--bare` with `--script` omits the default script content. #[test] fn init_script_bare() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.child("foo"); child.create_dir_all()?; @@ -739,7 +739,7 @@ fn init_script_bare() -> Result<()> { // Ensure python versions passed as arguments are present in file metadata #[test] fn init_script_python_version() -> Result<()> { - let context = TestContext::new("3.11"); + let context = uv_test::test_context!("3.11"); let child = context.temp_dir.child("foo"); child.create_dir_all()?; @@ -783,7 +783,7 @@ fn init_script_python_version() -> Result<()> { // Init script should create parent directories if they don't exist #[test] fn init_script_create_directory() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.child("foo"); child.create_dir_all()?; @@ -827,7 +827,7 @@ fn init_script_create_directory() -> Result<()> { // Init script should fail if file is already a PEP 723 script #[test] fn init_script_file_conflicts() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.child("foo"); child.create_dir_all()?; @@ -881,7 +881,7 @@ fn init_script_file_conflicts() -> Result<()> { // Init script should not trash an existing shebang. #[test] fn init_script_shebang() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let script_path = context.temp_dir.child("script.py"); @@ -945,8 +945,8 @@ fn init_script_picks_latest_stable_version() -> Result<()> { let managed_versions = &["3.14.0rc2", "3.13", "3.12"]; // If we do not mark these versions as managed, they would have `PythonSource::SearchPath(First)`, which // would mean that pre-releases would be preferred without opt-in (see `PythonSource::allows_prereleases`). - let context = - TestContext::new_with_versions(managed_versions).with_versions_as_managed(managed_versions); + let context = uv_test::test_context_with_versions!(managed_versions) + .with_versions_as_managed(managed_versions); let script_path = context.temp_dir.join("main.py"); @@ -983,7 +983,7 @@ fn init_script_picks_latest_stable_version() -> Result<()> { /// Run `uv init --lib` with an existing py.typed file #[test] fn init_py_typed_exists() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.child("foo"); child.create_dir_all()?; @@ -1017,7 +1017,7 @@ fn init_py_typed_exists() -> Result<()> { /// Using `uv init --lib --no-package` isn't allowed #[test] fn init_library_no_package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.child("foo"); child.create_dir_all()?; @@ -1041,7 +1041,7 @@ fn init_library_no_package() -> Result<()> { /// Ensure that `uv init` initializes the cache. #[test] fn init_cache() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); fs_err::remove_dir_all(&context.cache_dir)?; @@ -1059,7 +1059,7 @@ fn init_cache() -> Result<()> { #[test] fn init_no_readme() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.init().arg("foo").arg("--no-readme"), @" success: true @@ -1091,7 +1091,7 @@ fn init_no_readme() { #[test] fn init_no_pin_python() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.init().arg("foo").arg("--no-pin-python"), @" success: true @@ -1124,7 +1124,7 @@ fn init_no_pin_python() { #[test] fn init_library_current_dir() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let dir = context.temp_dir.join("foo"); fs_err::create_dir(&dir)?; @@ -1189,7 +1189,7 @@ fn init_library_current_dir() -> Result<()> { #[test] fn init_application_current_dir() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let dir = context.temp_dir.join("foo"); fs_err::create_dir(&dir)?; @@ -1253,7 +1253,7 @@ fn init_application_current_dir() -> Result<()> { #[test] fn init_dot_args() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let dir = context.temp_dir.join("foo"); fs_err::create_dir(&dir)?; @@ -1318,7 +1318,7 @@ fn init_dot_args() -> Result<()> { #[test] fn init_workspace() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { @@ -1504,7 +1504,7 @@ fn init_workspace() -> Result<()> { #[test] fn init_workspace_relative_sub_package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { @@ -1600,7 +1600,7 @@ fn init_workspace_relative_sub_package() -> Result<()> { #[test] fn init_workspace_outside() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { @@ -1697,7 +1697,7 @@ fn init_workspace_outside() -> Result<()> { #[test] fn init_normalized_names() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // `foo-bar` module is normalized to `foo-bar`. uv_snapshot!(context.filters(), context.init().current_dir(&context.temp_dir).arg("foo-bar").arg("--lib"), @" @@ -1796,7 +1796,7 @@ fn init_normalized_names() -> Result<()> { #[test] fn init_isolated() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { @@ -1847,7 +1847,7 @@ fn init_isolated() -> Result<()> { #[test] fn init_no_workspace() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { @@ -1922,7 +1922,7 @@ fn init_no_workspace() -> Result<()> { /// Warn if the user provides `--no-workspace` outside of a workspace. #[test] fn init_no_workspace_warning() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.init().current_dir(&context.temp_dir).arg("--no-workspace").arg("--name").arg("project"), @" success: true @@ -1954,7 +1954,7 @@ fn init_no_workspace_warning() { #[test] fn init_project_inside_project() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { @@ -2032,7 +2032,7 @@ fn init_project_inside_project() -> Result<()> { /// Run `uv init` from within a workspace with an explicit root. #[test] fn init_explicit_workspace() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { @@ -2083,7 +2083,7 @@ fn init_explicit_workspace() -> Result<()> { /// Run `uv init --virtual` to create a virtual project. #[test] fn init_virtual_project() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.child("foo"); child.create_dir_all()?; @@ -2154,7 +2154,7 @@ fn init_virtual_project() -> Result<()> { /// Run `uv init` from within a virtual workspace. #[test] fn init_virtual_workspace() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.child("foo"); child.create_dir_all()?; @@ -2198,7 +2198,7 @@ fn init_virtual_workspace() -> Result<()> { /// Run `uv init --virtual` from within a workspace. #[test] fn init_nested_virtual_workspace() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { @@ -2255,7 +2255,7 @@ fn init_nested_virtual_workspace() -> Result<()> { /// Run `uv init` from within a workspace. The path is already included via `members`. #[test] fn init_matches_members() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { @@ -2299,7 +2299,7 @@ fn init_matches_members() -> Result<()> { /// Run `uv init` from within a workspace. The path is excluded via `exclude`. #[test] fn init_matches_exclude() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { @@ -2342,7 +2342,7 @@ fn init_matches_exclude() -> Result<()> { /// Run `uv init`, inheriting the `requires-python` from the workspace. #[test] fn init_requires_python_workspace() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { @@ -2400,7 +2400,7 @@ fn init_requires_python_workspace() -> Result<()> { /// Run `uv init`, inferring the `requires-python` from the `--python` flag. #[test] fn init_requires_python_version() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { @@ -2459,7 +2459,7 @@ fn init_requires_python_version() -> Result<()> { /// specifiers verbatim. #[test] fn init_requires_python_specifiers() -> Result<()> { - let context = TestContext::new_with_versions(&["3.9", "3.12"]); + let context = uv_test::test_context_with_versions!(&["3.9", "3.12"]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { @@ -2517,7 +2517,7 @@ fn init_requires_python_specifiers() -> Result<()> { /// Run `uv init`, inferring the `requires-python` from the `.python-version` file. #[test] fn init_requires_python_version_file() -> Result<()> { - let context = TestContext::new_with_versions(&["3.9", "3.12"]); + let context = uv_test::test_context_with_versions!(&["3.9", "3.12"]); context.temp_dir.child(".python-version").write_str("3.9")?; @@ -2554,7 +2554,7 @@ fn init_requires_python_version_file() -> Result<()> { /// Run `uv init`, inferring the Python version from an existing `.venv` #[test] fn init_existing_environment() -> Result<()> { - let context = TestContext::new_with_versions(&["3.9", "3.12"]); + let context = uv_test::test_context_with_versions!(&["3.9", "3.12"]); let child = context.temp_dir.child("foo"); child.create_dir_all()?; @@ -2603,7 +2603,7 @@ fn init_existing_environment() -> Result<()> { /// Run `uv init`, it should ignore the Python version from a parent `.venv` #[test] fn init_existing_environment_parent() -> Result<()> { - let context = TestContext::new_with_versions(&["3.9", "3.12"]); + let context = uv_test::test_context_with_versions!(&["3.9", "3.12"]); // Create a new virtual environment in the parent directory uv_snapshot!(context.filters(), context.venv().current_dir(&context.temp_dir).arg("--python").arg("3.12"), @" @@ -2651,7 +2651,7 @@ fn init_existing_environment_parent() -> Result<()> { /// Run `uv init` from within an unmanaged project. #[test] fn init_unmanaged() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { @@ -2687,7 +2687,7 @@ fn init_unmanaged() -> Result<()> { #[test] fn init_hidden() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.init().arg(".foo"), @" success: false @@ -2701,7 +2701,7 @@ fn init_hidden() { #[test] fn init_non_ascii_directory() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let directory = context.temp_dir.child("püthon"); directory.create_dir_all()?; @@ -2724,7 +2724,7 @@ fn init_non_ascii_directory() -> Result<()> { /// Run `uv init` with an invalid `pyproject.toml` in a parent directory. #[test] fn init_failure() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create an empty `pyproject.toml`. let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -2771,7 +2771,7 @@ fn init_failure() -> Result<()> { #[test] fn init_failure_with_invalid_option_named_backend() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.init().arg("foo").arg("--backend"), @" success: false exit_code: 2 @@ -2804,7 +2804,7 @@ fn init_failure_with_invalid_option_named_backend() { #[test] #[cfg(feature = "test-git")] fn init_git() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.child("foo"); @@ -2844,7 +2844,7 @@ fn init_git() -> Result<()> { #[test] fn init_vcs_none() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.child("foo"); @@ -2865,7 +2865,7 @@ fn init_vcs_none() { #[test] #[cfg(feature = "test-git")] fn init_inside_git_repo() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); Command::new("git") .arg("init") @@ -2901,7 +2901,7 @@ fn init_inside_git_repo() { #[test] fn init_git_not_installed() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.child("foo"); @@ -2930,7 +2930,7 @@ fn init_git_not_installed() { #[test] fn init_with_author() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a Git repository and set the author. Command::new("git") @@ -3062,7 +3062,7 @@ fn init_with_author() { /// Run `uv init --app --package --build-backend flit` to create a packaged application project #[test] fn init_application_package_flit() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.child("foo"); child.create_dir_all()?; @@ -3136,7 +3136,7 @@ fn init_application_package_flit() -> Result<()> { /// Run `uv init --lib --build-backend flit` to create an library project #[test] fn init_library_flit() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.child("foo"); child.create_dir_all()?; @@ -3217,7 +3217,7 @@ fn init_library_flit() -> Result<()> { /// Run `uv init --build-backend flit` should be equivalent to `uv init --package --build-backend flit`. #[test] fn init_backend_implies_package() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.init().arg("project").arg("--build-backend").arg("flit"), @" success: true @@ -3256,7 +3256,7 @@ fn init_backend_implies_package() { /// Run `uv init --build-backend poetry` to create a project with poetry-core build backend #[test] fn init_library_poetry() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-04-28T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-04-28T00:00:00Z"); let child = context.temp_dir.child("foo"); child.create_dir_all()?; @@ -3338,7 +3338,7 @@ fn init_library_poetry() -> Result<()> { #[test] #[cfg(feature = "test-crates-io")] fn init_app_build_backend_maturin() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.child("foo"); child.create_dir_all()?; @@ -3468,7 +3468,7 @@ fn init_app_build_backend_maturin() -> Result<()> { /// Run `uv init --app --package --build-backend scikit` to create a packaged application project #[test] fn init_app_build_backend_scikit() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.child("foo"); child.create_dir_all()?; @@ -3593,7 +3593,7 @@ fn init_app_build_backend_scikit() -> Result<()> { #[test] #[cfg(feature = "test-crates-io")] fn init_lib_build_backend_maturin() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.child("foo"); child.create_dir_all()?; @@ -3720,7 +3720,7 @@ fn init_lib_build_backend_maturin() -> Result<()> { /// Run `uv init --lib --build-backend scikit` to create a packaged application project #[test] fn init_lib_build_backend_scikit() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.child("foo"); child.create_dir_all()?; @@ -3841,7 +3841,7 @@ fn init_lib_build_backend_scikit() -> Result<()> { /// Run `uv init --app --package --build-backend hatchling` to create a packaged application project #[test] fn init_application_package_hatchling() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.child("foo"); child.create_dir_all()?; @@ -3910,7 +3910,7 @@ fn init_application_package_hatchling() -> Result<()> { #[test] fn init_with_description() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.join("foo"); fs_err::create_dir_all(&child)?; @@ -3954,7 +3954,7 @@ fn init_with_description() -> Result<()> { #[test] fn init_without_description() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.join("bar"); fs_err::create_dir_all(&child)?; @@ -3997,7 +3997,7 @@ fn init_without_description() -> Result<()> { /// Run `uv init --python 3.13t` to create a pin to a freethreaded Python. #[test] fn init_python_variant() { - let context = TestContext::new("3.13"); + let context = uv_test::test_context!("3.13"); uv_snapshot!(context.filters(), context.init().arg("foo").arg("--python").arg("3.13t"), @" success: true exit_code: 0 @@ -4014,7 +4014,7 @@ fn init_python_variant() { /// Check how `uv init` reacts to working and broken git with different `--vcs` options. #[test] fn git_states() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // First, with working git. @@ -4075,7 +4075,7 @@ fn git_states() { /// Using `uv init` with `--project` isn't allowed #[test] fn init_project_flag_is_not_allowed_under_preview() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.child("foo"); child.create_dir_all()?; @@ -4105,7 +4105,7 @@ fn init_project_flag_is_not_allowed_under_preview() -> Result<()> { #[test] fn init_project_flag_is_ignored_with_explicit_path() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // with explicit path uv_snapshot!(context.filters(), context.init().arg("--project").arg("bar").arg("foo"), @" @@ -4138,7 +4138,7 @@ fn init_project_flag_is_ignored_with_explicit_path() { #[test] fn init_project_flag_is_warned_without_path() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // with explicit path uv_snapshot!(context.filters(), context.init().arg("--project").arg("bar"), @" @@ -4160,7 +4160,7 @@ fn init_project_flag_is_warned_without_path() { /// The `--directory` flag is used as the base for path #[test] fn init_working_directory_change() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.child("bar"); child.create_dir_all()?; diff --git a/crates/uv/tests/it/lock.rs b/crates/uv/tests/it/lock.rs index 9107096cf..e38916911 100644 --- a/crates/uv/tests/it/lock.rs +++ b/crates/uv/tests/it/lock.rs @@ -6,18 +6,17 @@ use insta::assert_snapshot; use std::io::BufReader; use url::Url; -#[cfg(feature = "test-git")] -use crate::common::{READ_ONLY_GITHUB_TOKEN, decode_token}; -use crate::common::{ - TestContext, build_vendor_links_url, download_to_disk, packse_index_url, uv_snapshot, - venv_bin_path, -}; use uv_fs::Simplified; use uv_static::EnvVars; +#[cfg(feature = "test-git")] +use uv_test::{READ_ONLY_GITHUB_TOKEN, decode_token}; +use uv_test::{ + build_vendor_links_url, download_to_disk, packse_index_url, uv_snapshot, venv_bin_path, +}; #[test] fn lock_wheel_registry() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -149,7 +148,7 @@ fn lock_wheel_registry() -> Result<()> { /// Lock a requirement from PyPI. #[test] fn lock_sdist_registry() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-29T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-29T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -244,7 +243,7 @@ fn lock_sdist_registry() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn lock_sdist_git() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -514,7 +513,7 @@ fn lock_sdist_git() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn lock_sdist_git_subdirectory() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -608,7 +607,7 @@ fn lock_sdist_git_subdirectory() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn lock_sdist_git_pep508() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -843,7 +842,7 @@ fn lock_sdist_git_pep508() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn lock_sdist_git_short_rev() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -950,7 +949,7 @@ fn lock_sdist_git_short_rev() -> Result<()> { /// Lock a requirement from a direct URL to a wheel. #[test] fn lock_wheel_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1104,7 +1103,7 @@ fn lock_wheel_url() -> Result<()> { /// Lock a requirement from a direct URL to a source distribution. #[test] fn lock_sdist_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1245,7 +1244,7 @@ fn lock_sdist_url() -> Result<()> { /// Lock a requirement from a direct URL to a source distribution, with a subdirectory. #[test] fn lock_sdist_url_subdirectory() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1382,7 +1381,7 @@ fn lock_sdist_url_subdirectory() -> Result<()> { /// Lock a requirement from a direct URL to a source distribution, with a subdirectory. #[test] fn lock_sdist_url_subdirectory_pep508() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1516,7 +1515,7 @@ fn lock_sdist_url_subdirectory_pep508() -> Result<()> { /// Lock a project with an extra. When resolving, all extras should be included. #[test] fn lock_project_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1660,7 +1659,7 @@ fn lock_project_extra() -> Result<()> { /// Lock a project with `uv.tool.override-dependencies`. #[test] fn lock_project_with_overrides() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1719,7 +1718,7 @@ fn lock_project_with_overrides() -> Result<()> { /// Lock a project with `uv.tool.override-dependencies` that reference `tool.uv.sources`. #[test] fn lock_project_with_override_sources() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1777,7 +1776,7 @@ fn lock_project_with_override_sources() -> Result<()> { /// Lock a project with `uv.tool.exclude-dependencies`. #[test] fn lock_project_with_excludes() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1974,7 +1973,7 @@ fn lock_project_with_excludes() -> Result<()> { /// Lock a project with `uv.tool.constraint-dependencies`. #[test] fn lock_project_with_constraints() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2029,7 +2028,7 @@ fn lock_project_with_constraints() -> Result<()> { /// Lock a project with `uv.tool.constraint-dependencies` that reference `tool.uv.sources`. #[test] fn lock_project_with_constraint_sources() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2087,7 +2086,7 @@ fn lock_project_with_constraint_sources() -> Result<()> { /// Lock a project with `uv.tool.build-constraint-dependencies`. #[test] fn lock_project_with_build_constraints() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2171,7 +2170,7 @@ fn lock_project_with_build_constraints() -> Result<()> { /// Lock a project with `uv.tool.build-constraint-dependencies` that reference `tool.uv.sources`. #[test] fn lock_project_with_build_constraint_sources() -> Result<()> { - let context = TestContext::new("3.9"); + let context = uv_test::test_context!("3.9"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2227,7 +2226,7 @@ fn lock_project_with_build_constraint_sources() -> Result<()> { /// Lock a project with a dependency that has an extra. #[test] fn lock_dependency_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2424,7 +2423,7 @@ fn lock_dependency_extra() -> Result<()> { #[cfg(feature = "test-python-eol")] #[test] fn lock_conditional_dependency_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2685,7 +2684,7 @@ fn lock_conditional_dependency_extra() -> Result<()> { "); // Validate that the extra is included on relevant Python versions. - let context_38 = TestContext::new("3.8"); + let context_38 = uv_test::test_context!("3.8"); fs_err::copy(pyproject_toml, context_38.temp_dir.join("pyproject.toml"))?; fs_err::copy(lockfile, context_38.temp_dir.join("uv.lock"))?; @@ -2723,7 +2722,7 @@ fn lock_conditional_dependency_extra() -> Result<()> { /// Lock a project with a dependency that requests a non-existent extra. #[test] fn lock_dependency_non_existent_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2906,7 +2905,7 @@ fn lock_dependency_non_existent_extra() -> Result<()> { /// project itself. #[test] fn lock_conflicting_project_basic1() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // First we test that resolving a group with a dependency that conflicts // with the project fails. @@ -3093,7 +3092,7 @@ fn lock_conflicting_project_basic1() -> Result<()> { /// This tests a case where workspace members conflict with each other. #[test] fn lock_conflicting_workspace_members() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3277,7 +3276,7 @@ fn lock_conflicting_workspace_members() -> Result<()> { /// workspace member #[test] fn lock_conflicting_workspace_members_depends_direct() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3350,7 +3349,7 @@ fn lock_conflicting_workspace_members_depends_direct() -> Result<()> { /// conflicting workspace member via a direct optional dependency. #[test] fn lock_conflicting_workspace_members_depends_direct_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3551,7 +3550,7 @@ fn lock_conflicting_workspace_members_depends_direct_extra() -> Result<()> { /// intermediate package without conflict. #[test] fn lock_conflicting_workspace_members_depends_transitive() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3648,7 +3647,7 @@ fn lock_conflicting_workspace_members_depends_transitive() -> Result<()> { /// intermediate package without conflict. #[test] fn lock_conflicting_workspace_members_depends_transitive_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3865,7 +3864,7 @@ fn lock_conflicting_workspace_members_depends_transitive_extra() -> Result<()> { /// the project itself. #[test] fn lock_conflicting_project_basic2() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -4050,7 +4049,7 @@ fn lock_conflicting_project_basic2() -> Result<()> { /// This tests a case where we declare an extra and a group as conflicting. #[test] fn lock_conflicting_mixed() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // First we test that resolving with a conflicting extra // and group fails. @@ -4249,7 +4248,7 @@ fn lock_conflicting_mixed() -> Result<()> { /// Show updated dependencies on `lock --upgrade`. #[test] fn lock_upgrade_log() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -4419,7 +4418,7 @@ fn lock_upgrade_log() -> Result<()> { /// versions. #[test] fn lock_upgrade_log_multi_version() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -4579,7 +4578,7 @@ fn lock_upgrade_log_multi_version() -> Result<()> { /// Respect the locked version in an existing lockfile. #[test] fn lock_preference() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -4752,7 +4751,7 @@ fn lock_preference() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn lock_git_plus_prefix() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -4838,7 +4837,7 @@ fn lock_git_plus_prefix() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn lock_partial_git() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -4995,7 +4994,7 @@ fn lock_partial_git() -> Result<()> { /// See: #[test] fn lock_unsupported_tag() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5079,7 +5078,7 @@ fn lock_unsupported_tag() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn lock_git_sha() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Lock against `main`. let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -5195,7 +5194,7 @@ fn lock_git_sha() -> Result<()> { /// Lock a requirement from PyPI, respecting the `Requires-Python` metadata. #[test] fn lock_requires_python() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let lockfile = context.temp_dir.join("uv.lock"); @@ -5844,7 +5843,7 @@ fn lock_requires_python() -> Result<()> { }); // Validate that attempting to install with an unsupported Python version raises an error. - let context_unsupported = TestContext::new("3.9").with_filtered_python_sources(); + let context_unsupported = uv_test::test_context!("3.9").with_filtered_python_sources(); fs_err::copy( pyproject_toml, @@ -5882,7 +5881,7 @@ fn lock_requires_python() -> Result<()> { /// upper-bound. #[test] fn lock_requires_python_upper() -> Result<()> { - let context = TestContext::new("3.11").with_exclude_newer("2024-08-29T00:00:00Z"); + let context = uv_test::test_context!("3.11").with_exclude_newer("2024-08-29T00:00:00Z"); let lockfile = context.temp_dir.join("uv.lock"); @@ -6007,7 +6006,7 @@ fn lock_requires_python_upper() -> Result<()> { #[cfg(feature = "test-python-patch")] #[test] fn lock_requires_python_exact() -> Result<()> { - let context = TestContext::new("3.13.0"); + let context = uv_test::test_context!("3.13.0"); let lockfile = context.temp_dir.join("uv.lock"); @@ -6087,7 +6086,7 @@ fn lock_requires_python_exact() -> Result<()> { #[cfg(feature = "test-python-patch")] #[test] fn lock_requires_python_compatible_specifier() -> Result<()> { - let context = TestContext::new("3.13.0"); + let context = uv_test::test_context!("3.13.0"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -6150,7 +6149,7 @@ fn lock_requires_python_compatible_specifier() -> Result<()> { /// Fork, even with a single dependency, if the minimum Python version is increased. #[test] fn lock_requires_python_fork() -> Result<()> { - let context = TestContext::new("3.11").with_exclude_newer("2024-08-29T00:00:00Z"); + let context = uv_test::test_context!("3.11").with_exclude_newer("2024-08-29T00:00:00Z"); let lockfile = context.temp_dir.join("uv.lock"); @@ -6243,7 +6242,7 @@ fn lock_requires_python_fork() -> Result<()> { /// Lock a requirement from PyPI, respecting the `Requires-Python` metadata #[test] fn lock_requires_python_wheels() -> Result<()> { - let context = TestContext::new_with_versions(&["3.11", "3.12"]); + let context = uv_test::test_context_with_versions!(&["3.11", "3.12"]); let lockfile = context.temp_dir.join("uv.lock"); @@ -6424,7 +6423,7 @@ fn lock_requires_python_wheels() -> Result<()> { /// `Requires-Python` uses the equals-star syntax. #[test] fn lock_requires_python_star() -> Result<()> { - let context = TestContext::new("3.11"); + let context = uv_test::test_context!("3.11"); let lockfile = context.temp_dir.join("uv.lock"); @@ -6546,7 +6545,7 @@ fn lock_requires_python_star() -> Result<()> { /// `Requires-Python` uses the != operator. #[test] fn lock_requires_python_not_equal() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let lockfile = context.temp_dir.join("uv.lock"); @@ -6625,7 +6624,7 @@ fn lock_requires_python_not_equal() -> Result<()> { /// is interpreted as equivalent to `>=3.11.0`. #[test] fn lock_requires_python_pre() -> Result<()> { - let context = TestContext::new("3.11"); + let context = uv_test::test_context!("3.11"); let lockfile = context.temp_dir.join("uv.lock"); @@ -6746,7 +6745,7 @@ fn lock_requires_python_pre() -> Result<()> { /// Warn if `Requires-Python` does not include a lower bound. #[test] fn lock_requires_python_unbounded() -> Result<()> { - let context = TestContext::new("3.11"); + let context = uv_test::test_context!("3.11"); let lockfile = context.temp_dir.join("uv.lock"); @@ -6845,7 +6844,7 @@ fn lock_requires_python_unbounded() -> Result<()> { /// Error if `Requires-Python` is disjoint across the workspace. #[test] fn lock_requires_python_disjoint() -> Result<()> { - let context = TestContext::new("3.11"); + let context = uv_test::test_context!("3.11"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -6888,7 +6887,7 @@ fn lock_requires_python_disjoint() -> Result<()> { #[test] fn lock_requires_python_maximum_version() -> Result<()> { - let context = TestContext::new("3.11"); + let context = uv_test::test_context!("3.11"); let lockfile = context.temp_dir.join("uv.lock"); @@ -7044,7 +7043,7 @@ fn lock_requires_python_maximum_version() -> Result<()> { #[test] fn lock_requires_python_fewest_versions() -> Result<()> { - let context = TestContext::new("3.11"); + let context = uv_test::test_context!("3.11"); let lockfile = context.temp_dir.join("uv.lock"); @@ -7157,7 +7156,7 @@ fn lock_requires_python_fewest_versions() -> Result<()> { /// like `3.10.0b0`. #[test] fn lock_python_version_marker_complement() -> Result<()> { - let context = TestContext::new("3.11"); + let context = uv_test::test_context!("3.11"); let lockfile = context.temp_dir.join("uv.lock"); @@ -7274,7 +7273,7 @@ fn lock_python_version_marker_complement() -> Result<()> { /// Lock the development dependencies for a project. #[test] fn lock_dev() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -7395,7 +7394,7 @@ fn lock_dev() -> Result<()> { /// Lock a package that's included both conditionally and unconditionally in the lockfile. #[test] fn lock_conditional_unconditional() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -7473,7 +7472,7 @@ fn lock_conditional_unconditional() -> Result<()> { /// Lock a package that's included twice with different markers. #[test] fn lock_multiple_markers() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -7551,7 +7550,7 @@ fn lock_multiple_markers() -> Result<()> { /// Check relative and absolute path handling in lockfiles. #[test] fn lock_relative_and_absolute_paths() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(&formatdoc! {r#" @@ -7669,7 +7668,7 @@ fn lock_relative_and_absolute_paths() -> Result<()> { /// Lock a project that includes cyclic dependencies. #[test] fn lock_cycles() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -7872,7 +7871,7 @@ fn lock_cycles() -> Result<()> { /// Ensures that stale lockfile metadata is detected. #[test] fn lock_new_extras() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -8145,7 +8144,7 @@ fn lock_new_extras() -> Result<()> { /// In this case, the hashes for `idna` have all been incremented by one in the left-most digit. #[test] fn lock_invalid_hash() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -8246,7 +8245,7 @@ fn lock_invalid_hash() -> Result<()> { /// without clearing the cache. #[test] fn lock_mixed_hashes() -> Result<()> { - let context = TestContext::new("3.13"); + let context = uv_test::test_context!("3.13"); let root = context.temp_dir.child("simple-html"); fs_err::create_dir_all(&root)?; @@ -8469,7 +8468,7 @@ async fn lock_zstd_wheel() -> Result<()> { matchers::{method, path}, }; - let context = TestContext::new("3.13"); + let context = uv_test::test_context!("3.13"); let server = MockServer::start().await; // Copy the wheel to serve it @@ -8590,7 +8589,7 @@ async fn lock_zstd_wheel() -> Result<()> { /// Vary the `--resolution-mode`, and ensure that the lockfile is updated. #[test] fn lock_resolution_mode() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -8770,7 +8769,7 @@ fn lock_resolution_mode() -> Result<()> { /// with the `Requires-Python` constraint. #[test] fn lock_requires_python_no_wheels() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -8802,7 +8801,7 @@ fn lock_requires_python_no_wheels() -> Result<()> { /// URLs. #[test] fn lock_same_version_multiple_urls() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let v1 = context.temp_dir.child("v1"); fs_err::create_dir_all(&v1)?; @@ -8986,7 +8985,7 @@ fn lock_same_version_multiple_urls() -> Result<()> { /// dependencies. #[test] fn lock_unsafe_lowest() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -9029,7 +9028,7 @@ fn lock_unsafe_lowest() -> Result<()> { /// Lock a package that's excluded from the parent workspace, but depends on that parent. #[test] fn lock_exclusion() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -9126,7 +9125,7 @@ fn lock_exclusion() -> Result<()> { /// See: #[test] fn lock_relative_lock_deserialization() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -9228,7 +9227,7 @@ fn lock_relative_lock_deserialization() -> Result<()> { /// Lock a workspace member with a non-workspace source. #[test] fn lock_non_workspace_source() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -9282,7 +9281,7 @@ fn lock_non_workspace_source() -> Result<()> { /// Lock a workspace member with a non-workspace source. #[test] fn lock_no_workspace_source() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -9333,7 +9332,7 @@ fn lock_no_workspace_source() -> Result<()> { /// Lock a workspace with a member that's a peer to the root. #[test] fn lock_peer_member() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context .temp_dir @@ -9438,7 +9437,7 @@ fn lock_peer_member() -> Result<()> { /// Lock a workspace in which a member defines an explicit index that requires authentication. #[test] fn lock_index_workspace_member() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -9580,7 +9579,7 @@ fn lock_index_workspace_member() -> Result<()> { /// on `foo`, but `bar/uv.lock` should omit `anyio`, but should include `typing-extensions`. #[test] fn lock_dev_transitive() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let foo = context.temp_dir.child("foo"); fs_err::create_dir_all(&foo)?; @@ -9766,7 +9765,7 @@ fn lock_redact_https() -> Result<()> { // which in turns means we don't use the test context cache location. // We should probably add a way to configure the `--no-cache` temporary // directory location during testing. - let context = TestContext::new("3.12").with_filtered_link_mode_warning(); + let context = uv_test::test_context!("3.12").with_filtered_link_mode_warning(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -9948,7 +9947,7 @@ fn lock_redact_https() -> Result<()> { /// Test that packages aren't unnecessarily updated when an index URL contains a username. #[test] fn lock_index_url_username_change_no_update() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create initial lockfile with exact version constraint let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -10026,7 +10025,7 @@ fn lock_index_url_username_change_no_update() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn lock_redact_git_pep508() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_link_mode_warning(); + let context = uv_test::test_context!("3.12").with_filtered_link_mode_warning(); let token = decode_token(READ_ONLY_GITHUB_TOKEN); let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -10111,7 +10110,7 @@ fn lock_redact_git_pep508() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn lock_redact_git_sources() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_link_mode_warning(); + let context = uv_test::test_context!("3.12").with_filtered_link_mode_warning(); let token = decode_token(READ_ONLY_GITHUB_TOKEN); let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -10199,7 +10198,7 @@ fn lock_redact_git_sources() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn lock_redact_git_pep508_non_project() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_link_mode_warning(); + let context = uv_test::test_context!("3.12").with_filtered_link_mode_warning(); let token = decode_token(READ_ONLY_GITHUB_TOKEN); let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -10279,7 +10278,7 @@ fn lock_redact_git_pep508_non_project() -> Result<()> { #[test] fn lock_redact_index_sources() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_link_mode_warning(); + let context = uv_test::test_context!("3.12").with_filtered_link_mode_warning(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -10372,7 +10371,7 @@ fn lock_redact_index_sources() -> Result<()> { #[test] fn lock_redact_url_sources() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_link_mode_warning(); + let context = uv_test::test_context!("3.12").with_filtered_link_mode_warning(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(r#" @@ -10460,7 +10459,7 @@ fn lock_redact_url_sources() -> Result<()> { /// Pass credentials for a named index via environment variables. #[test] fn lock_env_credentials() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -10549,7 +10548,7 @@ fn lock_env_credentials() -> Result<()> { /// credentials for one index will be used for both indexes and the request will fail. #[test] fn lock_multiple_indexes_same_realm_different_credentials() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -10595,7 +10594,7 @@ fn lock_multiple_indexes_same_realm_different_credentials() -> Result<()> { // on the index URL #[test] fn lock_multiple_indexes_same_realm_different_credentials_trailing_slash() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -10640,7 +10639,7 @@ fn lock_multiple_indexes_same_realm_different_credentials_trailing_slash() -> Re /// Resolve against an index that uses relative links. #[test] fn lock_relative_index() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -10730,7 +10729,7 @@ fn lock_relative_index() -> Result<()> { /// Lock a package that's excluded from the parent workspace, but depends on that parent. #[test] fn lock_no_sources() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -10962,7 +10961,7 @@ fn lock_no_sources() -> Result<()> { /// Lock a project that has an existing lockfile with a deprecated schema. #[test] fn lock_migrate() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -11105,7 +11104,7 @@ fn lock_migrate() -> Result<()> { /// Upgrade a specific package with `--upgrade-package`. #[test] fn lock_upgrade_package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Constrain `anyio` and `idna.` let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -11388,7 +11387,7 @@ fn lock_upgrade_package() -> Result<()> { /// Check that we discard the fork marker from the lockfile when using `--upgrade`. #[test] fn lock_upgrade_drop_fork_markers() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements = r#"[project] name = "forking" @@ -11431,7 +11430,7 @@ fn lock_upgrade_drop_fork_markers() -> Result<()> { /// Warn when there are missing bounds on transitive dependencies with `--resolution lowest`. #[test] fn lock_warn_missing_transitive_lower_bounds() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -11462,7 +11461,7 @@ fn lock_warn_missing_transitive_lower_bounds() -> Result<()> { /// Lock a local wheel via `--find-links`. #[test] fn lock_find_links_local_wheel() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Populate the `--find-links` entries. fs_err::create_dir_all(context.temp_dir.join("links"))?; @@ -11576,7 +11575,7 @@ fn lock_find_links_local_wheel() -> Result<()> { /// Prefer an explicit index over any `--find-links` entries. #[test] fn lock_find_links_ignore_explicit_index() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Populate the `--find-links` entries. fs_err::create_dir_all(context.temp_dir.join("links"))?; @@ -11697,7 +11696,7 @@ fn lock_find_links_ignore_explicit_index() -> Result<()> { /// `url` field. #[test] fn lock_find_links_relative_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Populate the `--find-links` entries. fs_err::create_dir_all(context.temp_dir.join("links"))?; @@ -11813,7 +11812,7 @@ fn lock_find_links_relative_url() -> Result<()> { /// Lock a local source distribution via `--find-links`. #[test] fn lock_find_links_local_sdist() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Populate the `--find-links` entries. fs_err::create_dir_all(context.temp_dir.join("links"))?; @@ -11925,7 +11924,7 @@ fn lock_find_links_local_sdist() -> Result<()> { /// Lock a wheel over HTTP via `--find-links`. #[test] fn lock_find_links_http_wheel() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(&formatdoc! { r#" @@ -12016,7 +12015,7 @@ fn lock_find_links_http_wheel() -> Result<()> { /// Lock a source distribution over HTTP via `--find-links`. #[test] fn lock_find_links_http_sdist() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(&formatdoc! { r#" @@ -12107,7 +12106,7 @@ fn lock_find_links_http_sdist() -> Result<()> { /// Use an explicit `--find-links` index. #[test] fn lock_find_links_explicit_index() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Populate the `--find-links` entries. fs_err::create_dir_all(context.temp_dir.join("links"))?; @@ -12213,7 +12212,7 @@ fn lock_find_links_explicit_index() -> Result<()> { /// Use the same index priority rules, interchangeably, for `--find-links` and Simple API indexes. #[test] fn lock_find_links_higher_priority_index() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Populate the `--find-links` entries. fs_err::create_dir_all(context.temp_dir.join("links"))?; @@ -12304,7 +12303,7 @@ fn lock_find_links_higher_priority_index() -> Result<()> { /// Use the same index priority rules, interchangeably, for `--find-links` and Simple API indexes. #[test] fn lock_find_links_lower_priority_index() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Populate the `--find-links` entries. fs_err::create_dir_all(context.temp_dir.join("links"))?; @@ -12412,7 +12411,7 @@ fn lock_find_links_lower_priority_index() -> Result<()> { /// Lock against a local directory laid out as a PEP 503-compatible index. #[test] fn lock_local_index() -> Result<()> { - let context = TestContext::new("3.13"); + let context = uv_test::test_context!("3.13"); let root = context.temp_dir.child("simple-html"); fs_err::create_dir_all(&root)?; @@ -12559,7 +12558,7 @@ fn lock_local_index() -> Result<()> { /// When resolving, we should ignore the `tool.uv.sources` and instead pull in `anyio` from PyPI. #[test] fn lock_sources_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -12687,7 +12686,7 @@ fn lock_sources_url() -> Result<()> { /// When resolving, we should ignore the `tool.uv.sources` and instead pull in `anyio` from PyPI. #[test] fn lock_sources_archive() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Download the source. let workspace_archive = context.temp_dir.child("workspace.zip"); @@ -12823,7 +12822,7 @@ fn lock_sources_archive() -> Result<()> { /// When resolving, we should respect the `tool.uv.sources` and pull in the stub `anyio`. #[test] fn lock_sources_source_tree() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Download the source. let workspace_archive = context.temp_dir.child("workspace.zip"); @@ -12943,7 +12942,7 @@ fn lock_sources_source_tree() -> Result<()> { /// editable, and once as non-editable. This should trigger a conflicting URL error. #[test] fn lock_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create the workspace root. context @@ -13099,7 +13098,7 @@ fn lock_editable() -> Result<()> { /// editable, and once as non-editable. #[test] fn lock_mixed_extras() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a workspace (`workspace1`) with a dependency on another workspace (`workspace2`). let workspace1 = context.temp_dir.child("workspace1"); @@ -13334,7 +13333,7 @@ fn lock_mixed_extras() -> Result<()> { /// editable, and once as non-editable. #[test] fn lock_transitive_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a workspace (`workspace1`) with a dependency on another workspace (`workspace2`). let workspace = context.temp_dir.child("workspace"); @@ -13510,7 +13509,7 @@ fn lock_transitive_extra() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn lock_mismatched_sources() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -13624,7 +13623,7 @@ fn lock_mismatched_sources() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn lock_mismatched_versions() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -13711,7 +13710,7 @@ fn lock_mismatched_versions() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn lock_no_sources_package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -13816,7 +13815,7 @@ fn lock_no_sources_package() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn lock_no_sources_package_multiple() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -13934,7 +13933,7 @@ fn lock_no_sources_package_multiple() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn lock_no_sources_with_no_sources_package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -14044,7 +14043,7 @@ fn lock_no_sources_with_no_sources_package() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn lock_no_sources_package_env_var() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -14153,7 +14152,7 @@ fn lock_no_sources_package_env_var() -> Result<()> { /// version constraints fails to resolve. #[test] fn unconditional_overlapping_marker_disjoint_version_constraints() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -14185,7 +14184,7 @@ fn unconditional_overlapping_marker_disjoint_version_constraints() -> Result<()> /// Checks the output of `uv lock --check` when there isn't a lock #[test] fn check_no_lock() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -14213,7 +14212,7 @@ fn check_no_lock() -> Result<()> { /// Checks the output of `uv lock --check` when the lock is outdated #[test] fn check_outdated_lock() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -14289,7 +14288,7 @@ fn check_outdated_lock() -> Result<()> { /// Otherwise `uv lock --check` will always fail. #[test] fn normalize_false_marker_dependency_groups() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -14358,7 +14357,7 @@ fn normalize_false_marker_dependency_groups() -> Result<()> { /// Otherwise `uv lock --check` will always fail. #[test] fn normalize_false_marker_requires_dist() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -14422,7 +14421,7 @@ fn normalize_false_marker_requires_dist() -> Result<()> { /// Change indexes between locking operations. #[test] fn lock_change_index() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -14545,7 +14544,7 @@ fn lock_change_index() -> Result<()> { /// updated on the next run. #[test] fn lock_remove_member() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a workspace member. let leaf = context.temp_dir.child("leaf"); @@ -14847,7 +14846,7 @@ fn lock_remove_member() -> Result<()> { /// we wouldn't be able to determine that a new member was added. #[test] fn lock_add_member_with_build_system() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a workspace, but don't add the member. let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -15059,7 +15058,7 @@ fn lock_add_member_with_build_system() -> Result<()> { #[test] fn lock_add_member_without_build_system() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a workspace, but don't add the member. let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -15395,7 +15394,7 @@ fn lock_add_member_without_build_system() -> Result<()> { /// the existing lockfile. #[test] fn lock_redundant_add_member() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Lock `anyio`. let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -15596,7 +15595,7 @@ fn lock_redundant_add_member() -> Result<()> { /// next run. #[test] fn lock_new_constraints() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -15794,7 +15793,7 @@ fn lock_new_constraints() -> Result<()> { /// next run. #[test] fn lock_remove_member_non_project() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a virtual workspace root. let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -15963,7 +15962,7 @@ fn lock_remove_member_non_project() -> Result<()> { /// the next run. #[test] fn lock_rename_project() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a workspace, but don't add the member. let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -16110,7 +16109,7 @@ fn lock_rename_project() -> Result<()> { /// Test backwards compatibility for `[package.metadata]`. #[test] fn lock_missing_metadata() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -16252,7 +16251,7 @@ fn lock_missing_metadata() -> Result<()> { /// `package.dev-dependencies`, with backwards compatibility for `package.dependency-groups`. #[test] fn lock_dev_dependencies_alias() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -16399,7 +16398,7 @@ fn lock_dev_dependencies_alias() -> Result<()> { /// on the next run. #[test] fn lock_reorder() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -16530,7 +16529,7 @@ fn lock_reorder() -> Result<()> { /// Ensure that `requires-python` bounds are correctly narrowed in the presence of upper-bound caps. #[test] fn lock_narrowed_python_version_upper() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let dependency = context.temp_dir.child("dependency"); dependency.child("pyproject.toml").write_str( @@ -16640,7 +16639,7 @@ fn lock_narrowed_python_version_upper() -> Result<()> { #[test] fn lock_narrowed_python_version() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let dependency = context.temp_dir.child("dependency"); dependency.child("pyproject.toml").write_str( @@ -16757,7 +16756,7 @@ fn lock_narrowed_python_version() -> Result<()> { /// See: #[test] fn lock_exclude_unnecessary_python_forks() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -16864,7 +16863,7 @@ fn lock_exclude_unnecessary_python_forks() -> Result<()> { /// Lock with a user-provided constraint on the space of supported environments. #[test] fn lock_constrained_environment() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -17180,7 +17179,7 @@ fn lock_constrained_environment() -> Result<()> { /// virtual workspace root. #[test] fn lock_constrained_environment_legacy() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -17344,7 +17343,7 @@ fn lock_constrained_environment_legacy() -> Result<()> { /// User-provided constraints must be disjoint. #[test] fn lock_overlapping_environment() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -17377,7 +17376,7 @@ fn lock_overlapping_environment() -> Result<()> { /// Lock a (legacy) non-project workspace root with forked dev dependencies. #[test] fn lock_non_project_fork() -> Result<()> { - let context = TestContext::new("3.10"); + let context = uv_test::test_context!("3.10"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -17573,7 +17572,7 @@ fn lock_non_project_fork() -> Result<()> { /// Lock a (legacy) non-project workspace root with a conditional dependency. #[test] fn lock_non_project_conditional() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -17678,7 +17677,7 @@ fn lock_non_project_conditional() -> Result<()> { /// Lock a (legacy) non-project workspace root with `dependency-groups`. #[test] fn lock_non_project_group() -> Result<()> { - let context = TestContext::new("3.10"); + let context = uv_test::test_context!("3.10"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -17820,7 +17819,7 @@ fn lock_non_project_group() -> Result<()> { /// Lock a (legacy) non-project workspace root with `tool.uv.sources`. #[test] fn lock_non_project_sources() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -17905,7 +17904,7 @@ fn lock_non_project_sources() -> Result<()> { /// `coverage` defines a `toml` extra, but it doesn't enable any dependencies after Python 3.11. #[test] fn lock_dropped_dev_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -18022,7 +18021,7 @@ fn lock_dropped_dev_extra() -> Result<()> { /// Lock with an empty (but existent) `tool.uv.dev-dependencies` group. #[test] fn lock_empty_dev_dependencies() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -18130,7 +18129,7 @@ fn lock_empty_dev_dependencies() -> Result<()> { /// Lock with an empty (but existent) `dependency-groups` group. #[test] fn lock_empty_dependency_group() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -18234,7 +18233,7 @@ fn lock_empty_dependency_group() -> Result<()> { /// Add and remove an empty dependency group. #[test] fn lock_add_empty_dependency_group() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -18473,7 +18472,7 @@ fn lock_add_empty_dependency_group() -> Result<()> { /// Use a trailing slash on the declared index. #[test] fn lock_trailing_slash_index_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -18597,7 +18596,7 @@ fn lock_trailing_slash_index_url() -> Result<()> { #[test] fn lock_invalid_index() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -18644,7 +18643,7 @@ fn lock_invalid_index() -> Result<()> { #[test] fn lock_explicit_index() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -18751,7 +18750,7 @@ fn lock_explicit_index() -> Result<()> { #[test] fn lock_explicit_default_index() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -18913,7 +18912,7 @@ fn lock_explicit_default_index() -> Result<()> { /// Error when an explicit index does not have a name. #[test] fn lock_unnamed_explicit_index() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -18956,7 +18955,7 @@ fn lock_unnamed_explicit_index() -> Result<()> { #[test] fn lock_named_index() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -19033,7 +19032,7 @@ fn lock_named_index() -> Result<()> { #[test] fn lock_default_index() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // If an index is included, PyPI will still be used as the default index. let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -19165,7 +19164,7 @@ fn lock_default_index() -> Result<()> { #[test] fn lock_named_index_cli() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -19256,7 +19255,7 @@ fn lock_named_index_cli() -> Result<()> { /// If a name is reused, within a single file, we should raise an error. #[test] fn lock_repeat_named_index() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -19297,7 +19296,7 @@ fn lock_repeat_named_index() -> Result<()> { /// If multiple indexes are marked as default within a single file, we should raise an error. #[test] fn lock_multiple_default_indexes() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -19340,7 +19339,7 @@ fn lock_multiple_default_indexes() -> Result<()> { /// If a name is defined in both the workspace root and the member, prefer the index in the member. #[test] fn lock_repeat_named_index_member() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -19454,7 +19453,7 @@ fn lock_repeat_named_index_member() -> Result<()> { #[test] fn lock_unique_named_index() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -19529,7 +19528,7 @@ fn lock_unique_named_index() -> Result<()> { /// This includes names passed in via the CLI. #[test] fn lock_repeat_named_index_cli() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -19696,7 +19695,7 @@ fn lock_repeat_named_index_cli() -> Result<()> { /// See: #[test] fn lock_named_index_overlap() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -19775,7 +19774,7 @@ fn lock_named_index_overlap() -> Result<()> { /// Lock a project with `package = false`, making it a virtual project. #[test] fn lock_explicit_virtual_project() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -20002,7 +20001,7 @@ fn lock_explicit_virtual_project() -> Result<()> { /// Lock a project that is implicitly virtual (by way of omitting `build-system`). #[test] fn lock_implicit_virtual_project() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -20225,7 +20224,7 @@ fn lock_implicit_virtual_project() -> Result<()> { /// omitting `build-system`). #[test] fn lock_implicit_package_path() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -20386,7 +20385,7 @@ fn lock_implicit_package_path() -> Result<()> { #[test] fn lock_conflicting_environment() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -20416,7 +20415,7 @@ fn lock_conflicting_environment() -> Result<()> { #[test] fn lock_split_python_environment() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -20534,7 +20533,7 @@ fn lock_split_python_environment() -> Result<()> { /// See: #[test] fn lock_python_upper_bound() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -20900,7 +20899,7 @@ fn lock_python_upper_bound() -> Result<()> { /// See: #[test] fn lock_simplified_environments() -> Result<()> { - let context = TestContext::new("3.11"); + let context = uv_test::test_context!("3.11"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -21011,7 +21010,7 @@ fn lock_simplified_environments() -> Result<()> { #[test] fn lock_dependency_metadata() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -21250,7 +21249,7 @@ fn lock_dependency_metadata() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn lock_dependency_metadata_git() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -21371,7 +21370,7 @@ fn lock_dependency_metadata_git() -> Result<()> { #[test] fn lock_strip_fragment() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -21455,7 +21454,7 @@ fn lock_strip_fragment() -> Result<()> { #[test] fn lock_request_requires_python() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -21499,7 +21498,7 @@ fn lock_request_requires_python() -> Result<()> { #[test] fn lock_duplicate_sources() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -21569,7 +21568,7 @@ fn lock_duplicate_sources() -> Result<()> { #[test] fn lock_invalid_project_table() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("a/pyproject.toml"); pyproject_toml.write_str( @@ -21614,7 +21613,7 @@ fn lock_invalid_project_table() -> Result<()> { #[test] fn lock_missing_name() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc::indoc! { @@ -21645,7 +21644,7 @@ fn lock_missing_name() -> Result<()> { #[test] fn lock_missing_version() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc::indoc! { @@ -21676,7 +21675,7 @@ fn lock_missing_version() -> Result<()> { #[test] fn lock_unsupported_version() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -21767,7 +21766,7 @@ fn lock_unsupported_version() -> Result<()> { /// See: #[test] fn lock_change_requires_python() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -21995,7 +21994,7 @@ fn lock_change_requires_python() -> Result<()> { /// Retrieve credentials for a named index from the keyring. #[test] fn lock_keyring_credentials() -> Result<()> { - let keyring_context = TestContext::new("3.12"); + let keyring_context = uv_test::test_context!("3.12"); // Install our keyring plugin keyring_context @@ -22010,7 +22009,7 @@ fn lock_keyring_credentials() -> Result<()> { .assert() .success(); - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -22090,7 +22089,7 @@ fn lock_keyring_credentials() -> Result<()> { /// Get credentials from the keyring with `explicit = true` and `authenticate = always` #[test] fn lock_keyring_explicit_always() -> Result<()> { - let keyring_context = TestContext::new("3.12"); + let keyring_context = uv_test::test_context!("3.12"); // Install our keyring plugin keyring_context @@ -22112,7 +22111,7 @@ fn lock_keyring_explicit_always() -> Result<()> { .assert() .success(); - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -22175,7 +22174,7 @@ fn lock_keyring_explicit_always() -> Result<()> { /// always` #[test] fn lock_keyring_credentials_always_authenticate_fetches_username() -> Result<()> { - let keyring_context = TestContext::new("3.12"); + let keyring_context = uv_test::test_context!("3.12"); // Install our keyring plugin keyring_context @@ -22199,7 +22198,7 @@ fn lock_keyring_credentials_always_authenticate_fetches_username() -> Result<()> .assert() .success(); - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -22279,7 +22278,7 @@ fn lock_keyring_credentials_always_authenticate_fetches_username() -> Result<()> /// always` — but the keyring version installed does not support `--mode creds` #[test] fn lock_keyring_credentials_always_authenticate_unsupported_mode() -> Result<()> { - let keyring_context = TestContext::new("3.12"); + let keyring_context = uv_test::test_context!("3.12"); // Install our keyring plugin keyring_context @@ -22294,7 +22293,7 @@ fn lock_keyring_credentials_always_authenticate_unsupported_mode() -> Result<()> .assert() .success(); - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -22334,7 +22333,7 @@ fn lock_keyring_credentials_always_authenticate_unsupported_mode() -> Result<()> #[test] fn lock_multiple_sources() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -22433,7 +22432,7 @@ fn lock_multiple_sources() -> Result<()> { #[test] fn lock_multiple_sources_conflict() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -22473,7 +22472,7 @@ fn lock_multiple_sources_conflict() -> Result<()> { #[test] fn lock_multiple_sources_no_marker() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -22511,7 +22510,7 @@ fn lock_multiple_sources_no_marker() -> Result<()> { #[test] fn lock_multiple_sources_index_disjoint_markers() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -22646,7 +22645,7 @@ fn lock_multiple_sources_index_disjoint_markers() -> Result<()> { #[test] fn lock_multiple_sources_index_mixed() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -22784,7 +22783,7 @@ fn lock_multiple_sources_index_mixed() -> Result<()> { #[test] fn lock_multiple_sources_index_non_total() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -22884,7 +22883,7 @@ fn lock_multiple_sources_index_non_total() -> Result<()> { #[test] fn lock_multiple_sources_index_explicit() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -23035,7 +23034,7 @@ fn lock_multiple_sources_index_explicit() -> Result<()> { #[test] fn lock_multiple_sources_non_total() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -23136,7 +23135,7 @@ fn lock_multiple_sources_non_total() -> Result<()> { #[test] fn lock_multiple_sources_respect_marker() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -23215,7 +23214,7 @@ fn lock_multiple_sources_respect_marker() -> Result<()> { #[test] fn lock_multiple_sources_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -23302,7 +23301,7 @@ fn lock_multiple_sources_extra() -> Result<()> { #[test] fn lock_multiple_sources_index_overlapping_extras() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -23356,7 +23355,7 @@ fn lock_multiple_sources_index_overlapping_extras() -> Result<()> { /// Sources will be ignored when an `extra` is applied, but references a non-existent extra. #[test] fn lock_multiple_index_with_missing_extra() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -23396,7 +23395,7 @@ fn lock_multiple_index_with_missing_extra() -> Result<()> { /// group. #[test] fn lock_multiple_index_with_absent_extra() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -23438,7 +23437,7 @@ fn lock_multiple_index_with_absent_extra() -> Result<()> { /// Sources will be ignored when a `group` is applied, but references a non-existent group. #[test] fn lock_multiple_index_with_missing_group() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -23478,7 +23477,7 @@ fn lock_multiple_index_with_missing_group() -> Result<()> { /// group. #[test] fn lock_multiple_index_with_absent_group() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -23519,7 +23518,7 @@ fn lock_multiple_index_with_absent_group() -> Result<()> { #[test] fn lock_dry_run() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -23586,7 +23585,7 @@ fn lock_dry_run() -> Result<()> { #[test] fn lock_dry_run_noop() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -23649,7 +23648,7 @@ fn lock_dry_run_noop() -> Result<()> { #[test] fn lock_group_include() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -23833,7 +23832,7 @@ fn lock_group_include() -> Result<()> { #[test] fn lock_group_requires_python() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -23951,7 +23950,7 @@ fn lock_group_requires_python() -> Result<()> { #[test] fn lock_group_includes_requires_python() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -24102,7 +24101,7 @@ fn lock_group_includes_requires_python() -> Result<()> { /// Referring to a dependency-group with group-requires-python that does not exist #[test] fn lock_group_requires_undefined_group() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -24136,7 +24135,7 @@ fn lock_group_requires_undefined_group() -> Result<()> { /// The legacy dev-dependencies cannot be referred to by group-requires-python #[test] fn lock_group_requires_dev_dep() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -24170,7 +24169,7 @@ fn lock_group_requires_dev_dep() -> Result<()> { #[test] fn lock_group_includes_requires_python_contradiction() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -24293,7 +24292,7 @@ fn lock_group_includes_requires_python_contradiction() -> Result<()> { #[test] fn lock_group_include_cycle() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -24326,7 +24325,7 @@ fn lock_group_include_cycle() -> Result<()> { #[test] fn lock_group_include_dev() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -24361,7 +24360,7 @@ fn lock_group_include_dev() -> Result<()> { #[test] fn lock_group_include_missing() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -24392,7 +24391,7 @@ fn lock_group_include_missing() -> Result<()> { #[test] fn lock_group_invalid_entry_package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -24439,7 +24438,7 @@ fn lock_group_invalid_entry_package() -> Result<()> { #[test] fn lock_group_invalid_entry_group_name() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -24474,7 +24473,7 @@ fn lock_group_invalid_entry_group_name() -> Result<()> { #[test] fn lock_group_invalid_duplicate_group_name() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -24510,7 +24509,7 @@ fn lock_group_invalid_duplicate_group_name() -> Result<()> { #[test] fn lock_group_invalid_entry_table() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -24541,7 +24540,7 @@ fn lock_group_invalid_entry_table() -> Result<()> { #[test] fn lock_group_invalid_entry_type() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -24576,7 +24575,7 @@ fn lock_group_invalid_entry_type() -> Result<()> { #[test] fn lock_group_empty_entry_table() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -24611,7 +24610,7 @@ fn lock_group_empty_entry_table() -> Result<()> { #[test] fn lock_group_workspace() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -24829,7 +24828,7 @@ fn lock_group_workspace() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn lock_transitive_git() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -24972,7 +24971,7 @@ fn lock_transitive_git() -> Result<()> { /// Lock a package with a dynamic version. #[test] fn lock_dynamic_version() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -25083,7 +25082,7 @@ fn lock_dynamic_version() -> Result<()> { /// Lock a package with a dynamic version and dynamic dependencies. #[test] fn lock_dynamic_version_dependencies() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -25194,7 +25193,7 @@ fn lock_dynamic_version_dependencies() -> Result<()> { /// building the package. #[test] fn lock_dynamic_version_no_build() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -25260,7 +25259,7 @@ fn lock_dynamic_version_no_build() -> Result<()> { /// Lock a package that depends on a package with a dynamic version using a `workspace` source. #[test] fn lock_dynamic_version_workspace_member() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -25451,7 +25450,7 @@ fn lock_dynamic_version_workspace_member() -> Result<()> { /// opposed to a workspace). #[test] fn lock_dynamic_version_path_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -25628,7 +25627,7 @@ fn lock_dynamic_version_path_dependency() -> Result<()> { /// N.B. `hatchling` "flattens" recursive extras. #[test] fn lock_dynamic_version_self_extra_hatchling() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-01T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-01T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -25782,7 +25781,7 @@ fn lock_dynamic_version_self_extra_hatchling() -> Result<()> { /// N.B. `setuptools` does not "flatten" recursive extras. #[test] fn lock_dynamic_version_self_extra_setuptools() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-01T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-01T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -25940,7 +25939,7 @@ fn lock_dynamic_version_self_extra_setuptools() -> Result<()> { /// See: #[test] fn lock_dynamic_built_cache() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -26061,7 +26060,7 @@ fn lock_dynamic_built_cache() -> Result<()> { /// See: #[test] fn lock_shared_build_dependency() -> Result<()> { - let context = TestContext::new("3.13").with_exclude_newer("2025-01-28T00:00:00Z"); + let context = uv_test::test_context!("3.13").with_exclude_newer("2025-01-28T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -26343,7 +26342,7 @@ fn lock_shared_build_dependency() -> Result<()> { /// Re-lock after converting a package from dynamic to static. #[test] fn lock_dynamic_to_static() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -26473,7 +26472,7 @@ fn lock_dynamic_to_static() -> Result<()> { /// Re-lock after converting a package from static to dynamic. #[test] fn lock_static_to_dynamic() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -26602,7 +26601,7 @@ fn lock_static_to_dynamic() -> Result<()> { #[test] fn lock_bump_static_version() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -26705,7 +26704,7 @@ fn lock_bump_static_version() -> Result<()> { #[test] fn lock_derivation_chain_prod() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -26761,7 +26760,7 @@ fn lock_derivation_chain_prod() -> Result<()> { #[test] fn lock_derivation_chain_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -26818,7 +26817,7 @@ fn lock_derivation_chain_extra() -> Result<()> { #[test] fn lock_derivation_chain_group() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -26877,7 +26876,7 @@ fn lock_derivation_chain_group() -> Result<()> { #[test] fn lock_derivation_chain_extended() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -26949,7 +26948,7 @@ fn lock_derivation_chain_extended() -> Result<()> { /// itself isn't a package. #[test] fn mismatched_name_self_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -26983,7 +26982,7 @@ fn mismatched_name_self_editable() -> Result<()> { #[test] fn lock_relative_project() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context .temp_dir @@ -27085,7 +27084,7 @@ fn lock_relative_project() -> Result<()> { #[test] fn lock_recursive_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -27194,7 +27193,7 @@ fn lock_recursive_extra() -> Result<()> { /// ``` #[test] fn no_lowest_warning_with_name_and_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -27231,7 +27230,7 @@ fn no_lowest_warning_with_name_and_url() -> Result<()> { #[test] fn lock_no_build_static_metadata() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -27328,7 +27327,7 @@ fn lock_no_build_static_metadata() -> Result<()> { #[test] fn lock_no_build_dynamic_metadata() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -27356,7 +27355,7 @@ fn lock_no_build_dynamic_metadata() -> Result<()> { #[test] fn lock_self_compatible() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -27456,7 +27455,7 @@ fn lock_self_compatible() -> Result<()> { #[test] fn lock_self_exact() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -27556,7 +27555,7 @@ fn lock_self_exact() -> Result<()> { #[test] fn lock_self_incompatible() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -27586,7 +27585,7 @@ fn lock_self_incompatible() -> Result<()> { #[test] fn lock_self_extra_to_extra_compatible() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -27690,7 +27689,7 @@ fn lock_self_extra_to_extra_compatible() -> Result<()> { #[test] fn lock_self_extra_to_same_extra_incompatible() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -27723,7 +27722,7 @@ fn lock_self_extra_to_same_extra_incompatible() -> Result<()> { #[test] fn lock_self_extra_to_other_extra_incompatible() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -27757,7 +27756,7 @@ fn lock_self_extra_to_other_extra_incompatible() -> Result<()> { #[test] fn lock_self_extra_compatible() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -27861,7 +27860,7 @@ fn lock_self_extra_compatible() -> Result<()> { #[test] fn lock_self_extra_incompatible() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -27894,7 +27893,7 @@ fn lock_self_extra_incompatible() -> Result<()> { #[test] fn lock_self_marker_compatible() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -27994,7 +27993,7 @@ fn lock_self_marker_compatible() -> Result<()> { #[test] fn lock_self_marker_incompatible() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -28026,7 +28025,7 @@ fn lock_self_marker_incompatible() -> Result<()> { /// Windows. This may change in the future. #[test] fn lock_split_on_windows() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2024-12-18T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2024-12-18T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -28118,7 +28117,7 @@ fn lock_split_on_windows() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn lock_missing_git_prefix() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -28150,7 +28149,7 @@ fn lock_missing_git_prefix() -> Result<()> { #[test] fn lock_arm() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -28225,7 +28224,7 @@ fn lock_arm() -> Result<()> { #[test] fn lock_x86_64() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -28301,7 +28300,7 @@ fn lock_x86_64() -> Result<()> { #[test] fn lock_x86() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -28374,7 +28373,7 @@ fn lock_x86() -> Result<()> { #[test] fn lock_script() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let script = context.temp_dir.child("script.py"); script.write_str(indoc! { r#" @@ -28489,7 +28488,7 @@ fn lock_script() -> Result<()> { #[test] fn lock_script_path() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let script = context.temp_dir.child("script.py"); script.write_str(indoc! { r#" @@ -28625,7 +28624,7 @@ fn lock_script_path() -> Result<()> { /// `uv lock --script` should add a PEP 723 tag, if it doesn't exist already. #[test] fn lock_script_initialize() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_missing_file_error(); + let context = uv_test::test_context!("3.12").with_filtered_missing_file_error(); uv_snapshot!(context.filters(), context.lock().arg("--script").arg("script.py"), @" success: false @@ -28673,7 +28672,7 @@ fn lock_script_initialize() -> Result<()> { #[test] fn lock_pytorch_cpu() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -29358,7 +29357,7 @@ fn lock_pytorch_cpu() -> Result<()> { /// Regression test for: #[test] fn lock_pytorch_index_preferences() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -29852,7 +29851,7 @@ fn lock_pytorch_index_preferences() -> Result<()> { #[test] fn lock_intel_mac() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2024-12-18T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2024-12-18T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -30231,7 +30230,7 @@ fn lock_intel_mac() -> Result<()> { #[test] fn lock_pytorch_local_preference() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -30577,7 +30576,7 @@ fn lock_pytorch_local_preference() -> Result<()> { #[test] fn windows_arm() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -30654,7 +30653,7 @@ fn windows_arm() -> Result<()> { #[test] fn windows_amd64_required() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -30729,7 +30728,7 @@ fn windows_amd64_required() -> Result<()> { #[test] fn windows_arm64_required() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -30802,7 +30801,7 @@ fn windows_arm64_required() -> Result<()> { #[test] fn lock_empty_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -30993,7 +30992,7 @@ fn lock_empty_extra() -> Result<()> { /// need to discard the lockfile. #[test] fn lock_invalid_fork_markers() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context.temp_dir.child("pyproject.toml").write_str( r#" @@ -31072,7 +31071,7 @@ fn lock_invalid_fork_markers() -> Result<()> { #[test] fn lock_omit_wheels_exclude_newer() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2024-08-01T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2024-08-01T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -31163,7 +31162,7 @@ fn lock_omit_wheels_exclude_newer() -> Result<()> { /// Check that we hint if the resolution failed in a different Python version. #[test] fn lock_conflict_for_disjoint_python_version() -> Result<()> { - let context = TestContext::new("3.9"); + let context = uv_test::test_context!("3.9"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -31225,7 +31224,7 @@ fn lock_requires_python_empty_lock_file() -> Result<()> { // N.B. These versions were selected based on what was // in `.python-versions` at the time of writing (2025-06-16). let (v1, v2) = ("3.13.0", "3.13.2"); - let context = TestContext::new_with_versions(&[v1, v2]); + let context = uv_test::test_context_with_versions!(&[v1, v2]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(&format!( @@ -31385,7 +31384,7 @@ fn lock_requires_python_empty_lock_file() -> Result<()> { /// Check that we hint if the resolution failed for a different platform. #[test] fn lock_conflict_for_disjoint_platform() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -31448,7 +31447,7 @@ fn lock_conflict_for_disjoint_platform() -> Result<()> { /// exists with a trailing slash in the `pyproject.toml`. #[test] fn lock_trailing_slash_index_url_in_pyproject_not_index_argument() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -31577,7 +31576,7 @@ fn lock_trailing_slash_index_url_in_pyproject_not_index_argument() -> Result<()> /// `pyproject.toml` without a trailing slash on the index URL. #[test] fn lock_trailing_slash_index_url_in_lockfile_not_pyproject() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -31668,7 +31667,7 @@ fn lock_trailing_slash_index_url_in_lockfile_not_pyproject() -> Result<()> { /// lockfile without trailing slashes on the index URL. #[test] fn lock_trailing_slash_index_url_in_pyproject_and_not_lockfile() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -31759,7 +31758,7 @@ fn lock_trailing_slash_index_url_in_pyproject_and_not_lockfile() -> Result<()> { /// URL. #[test] fn lock_trailing_slash_index_url_in_lockfile_and_pyproject_toml() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -31847,7 +31846,7 @@ fn lock_trailing_slash_index_url_in_lockfile_and_pyproject_toml() -> Result<()> #[test] fn lock_trailing_slash_find_links() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#" @@ -31993,7 +31992,7 @@ fn lock_trailing_slash_find_links() -> Result<()> { #[test] fn lock_prefix_match() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -32022,7 +32021,7 @@ fn lock_prefix_match() -> Result<()> { /// Regression test for . #[test] fn test_tilde_equals_python_version() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -32053,7 +32052,7 @@ fn test_tilde_equals_python_version() -> Result<()> { /// Test that exclude-newer-package can be disabled for specific packages using `false`. #[test] fn lock_exclude_newer_package_disable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -32141,7 +32140,7 @@ fn lock_exclude_newer_package_disable() -> Result<()> { /// Test that exclude-newer-package is properly serialized in the lockfile. #[test] fn lock_exclude_newer_package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -32284,7 +32283,7 @@ fn lock_exclude_newer_package() -> Result<()> { /// #[test] fn lock_path_dependency_explicit_index() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create the path dependency with explicit index let pkg_a = context.temp_dir.child("pkg_a"); @@ -32360,7 +32359,7 @@ fn lock_path_dependency_explicit_index() -> Result<()> { /// defined in a non-root workspace member. #[test] fn lock_path_dependency_explicit_index_workspace_member() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create the path dependency with explicit index let pkg_a = context.temp_dir.child("pkg_a"); @@ -32458,7 +32457,7 @@ fn lock_path_dependency_explicit_index_workspace_member() -> Result<()> { /// both explicit and non-explicit indexes. #[test] fn lock_path_dependency_mixed_indexes() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create the path dependency with both explicit and non-explicit indexes. let pkg_a = context.temp_dir.child("pkg_a"); @@ -32538,7 +32537,7 @@ fn lock_path_dependency_mixed_indexes() -> Result<()> { /// Test that path dependencies without an index don't affect validation. #[test] fn lock_path_dependency_no_index() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create the path dependency without explicit indexes. let pkg_a = context.temp_dir.child("pkg_a"); @@ -32599,7 +32598,7 @@ fn lock_path_dependency_no_index() -> Result<()> { /// Test that a nested path dependency with an explicit index validates correctly. #[test] fn lock_nested_path_dependency_explicit_index() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create the inner dependency with explicit index. let pkg_a = context.temp_dir.child("pkg_a"); @@ -32692,7 +32691,7 @@ fn lock_nested_path_dependency_explicit_index() -> Result<()> { /// Test that validating circular path dependency indexes doesn't cause an infinite loop. #[test] fn lock_circular_path_dependency_explicit_index() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create pkg_a (with explicit index) that depends on pkg_b. let pkg_a = context.temp_dir.child("pkg_a"); @@ -32769,7 +32768,7 @@ fn lock_circular_path_dependency_explicit_index() -> Result<()> { #[test] fn lock_android() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-06-01T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-06-01T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -32866,7 +32865,7 @@ fn lock_android() -> Result<()> { #[test] fn lock_required_intersection() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -32969,7 +32968,7 @@ fn lock_required_intersection() -> Result<()> { #[test] fn lock_refresh() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -33196,7 +33195,7 @@ fn lock_refresh() -> Result<()> { /// Ensure conflicts on virtual packages (such as markers) give good error messages. #[test] fn collapsed_error_with_marker_packages() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = indoc! {r#" [project] @@ -33231,7 +33230,7 @@ fn collapsed_error_with_marker_packages() -> Result<()> { /// #[test] fn no_warning_without_and_with_lower_bound() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -33261,7 +33260,7 @@ fn no_warning_without_and_with_lower_bound() -> Result<()> { #[test] fn lock_unsupported_wheel_url_requires_python() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -33290,7 +33289,7 @@ fn lock_unsupported_wheel_url_requires_python() -> Result<()> { #[test] fn lock_unsupported_wheel_url_required_platform() -> Result<()> { - let context = TestContext::new("3.11"); + let context = uv_test::test_context!("3.11"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -33327,7 +33326,7 @@ fn lock_unsupported_wheel_url_required_platform() -> Result<()> { /// See: #[test] fn lock_check_multiple_default_indexes_explicit_assignment_dependency_group() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( diff --git a/crates/uv/tests/it/lock_conflict.rs b/crates/uv/tests/it/lock_conflict.rs index d2ea9c77e..6adb8f21b 100644 --- a/crates/uv/tests/it/lock_conflict.rs +++ b/crates/uv/tests/it/lock_conflict.rs @@ -2,7 +2,7 @@ use anyhow::Result; use assert_fs::prelude::*; use insta::assert_snapshot; -use crate::common::{TestContext, uv_snapshot}; +use uv_test::uv_snapshot; // All of the tests in this file should use `tool.uv.conflicts` in some way. // @@ -20,7 +20,7 @@ use crate::common::{TestContext, uv_snapshot}; /// #[test] fn extra_basic() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // First we test that resolving with two extras that have // conflicting dependencies fails. @@ -211,7 +211,7 @@ fn extra_basic() -> Result<()> { /// extras instead of two. #[test] fn extra_basic_three_extras() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // First we test that resolving with two extras that have // conflicting dependencies fails. @@ -357,7 +357,7 @@ fn extra_basic_three_extras() -> Result<()> { /// distinct groups of extras. #[test] fn extra_multiple_not_conflicting1() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -487,7 +487,7 @@ fn extra_multiple_not_conflicting1() -> Result<()> { /// conflicting.) #[test] fn extra_multiple_not_conflicting2() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -648,7 +648,7 @@ fn extra_multiple_not_conflicting2() -> Result<()> { /// extras correctly. #[test] fn extra_multiple_independent() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // If we don't declare any conflicting extras, then resolution // will of course fail. @@ -871,7 +871,7 @@ fn extra_multiple_independent() -> Result<()> { #[test] fn extra_config_change_ignore_lockfile() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1005,7 +1005,7 @@ fn extra_config_change_ignore_lockfile() -> Result<()> { /// enables a conflicting extra. #[test] fn extra_unconditional() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let root_pyproject_toml = context.temp_dir.child("pyproject.toml"); root_pyproject_toml.write_str( @@ -1158,7 +1158,7 @@ fn extra_unconditional() -> Result<()> { /// would be completely ignored here. #[test] fn extra_unconditional_non_conflicting() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let root_pyproject_toml = context.temp_dir.child("pyproject.toml"); root_pyproject_toml.write_str( @@ -1236,7 +1236,7 @@ fn extra_unconditional_non_conflicting() -> Result<()> { #[test] fn extra_unconditional_in_optional() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let root_pyproject_toml = context.temp_dir.child("pyproject.toml"); root_pyproject_toml.write_str( @@ -1348,7 +1348,7 @@ fn extra_unconditional_in_optional() -> Result<()> { #[test] fn extra_unconditional_non_local_conflict() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let root_pyproject_toml = context.temp_dir.child("pyproject.toml"); root_pyproject_toml.write_str( @@ -1454,7 +1454,7 @@ fn extra_unconditional_non_local_conflict() -> Result<()> { /// packages in a workspace. #[test] fn extra_nested_across_workspace() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let root_pyproject_toml = context.temp_dir.child("pyproject.toml"); root_pyproject_toml.write_str( @@ -1656,7 +1656,7 @@ fn extra_nested_across_workspace() -> Result<()> { /// The project declares conflicting extras, but one of the extras directly depends on the other. #[test] fn extra_depends_on_conflicting_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1708,7 +1708,7 @@ fn extra_depends_on_conflicting_extra() -> Result<()> { /// another package. #[test] fn extra_depends_on_conflicting_extra_transitive() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1899,7 +1899,7 @@ fn extra_depends_on_conflicting_extra_transitive() -> Result<()> { /// This tests a "basic" case for specifying conflicting groups. #[test] fn group_basic() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // First we test that resolving with two groups that have // conflicting dependencies fails. @@ -2082,7 +2082,7 @@ fn group_basic() -> Result<()> { /// default. #[test] fn group_default() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Tell uv about the conflicting groups, which forces it to resolve each in // their own fork. @@ -2262,7 +2262,7 @@ fn group_default() -> Result<()> { /// This tests a case where we declare an extra and a group as conflicting. #[test] fn mixed() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // First we test that resolving with a conflicting extra // and group fails. @@ -2450,7 +2450,7 @@ fn mixed() -> Result<()> { #[test] fn multiple_sources_index_disjoint_extras() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2600,7 +2600,7 @@ fn multiple_sources_index_disjoint_extras() -> Result<()> { #[test] fn multiple_sources_index_disjoint_groups() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2749,7 +2749,7 @@ fn multiple_sources_index_disjoint_groups() -> Result<()> { #[test] fn multiple_sources_index_disjoint_extras_with_extra() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2918,7 +2918,7 @@ fn multiple_sources_index_disjoint_extras_with_extra() -> Result<()> { #[test] fn multiple_sources_index_disjoint_extras_with_marker() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3098,7 +3098,7 @@ fn multiple_sources_index_disjoint_extras_with_marker() -> Result<()> { /// despite `sniffio` being an unconditional dependency. #[test] fn non_optional_dependency_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3145,7 +3145,7 @@ fn non_optional_dependency_extra() -> Result<()> { /// This test never regressed, but we added it here to ensure it doesn't. #[test] fn non_optional_dependency_group() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3193,7 +3193,7 @@ fn non_optional_dependency_group() -> Result<()> { /// This test never regressed, but we added it here to ensure it doesn't. #[test] fn non_optional_dependency_mixed() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3249,7 +3249,7 @@ fn non_optional_dependency_mixed() -> Result<()> { /// [1]: #[test] fn shared_optional_dependency_extra1() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3389,7 +3389,7 @@ fn shared_optional_dependency_extra1() -> Result<()> { /// Ref #[test] fn shared_optional_dependency_group1() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3528,7 +3528,7 @@ fn shared_optional_dependency_group1() -> Result<()> { /// Ref #[test] fn shared_optional_dependency_mixed1() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3676,7 +3676,7 @@ fn shared_optional_dependency_mixed1() -> Result<()> { /// Regression test for: #[test] fn shared_optional_dependency_extra2() -> Result<()> { - let context = TestContext::new("3.11"); + let context = uv_test::test_context!("3.11"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3817,7 +3817,7 @@ fn shared_optional_dependency_extra2() -> Result<()> { /// Regression test for: #[test] fn shared_optional_dependency_group2() -> Result<()> { - let context = TestContext::new("3.11"); + let context = uv_test::test_context!("3.11"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3961,7 +3961,7 @@ fn shared_optional_dependency_group2() -> Result<()> { /// Regression test for: #[test] fn shared_optional_dependency_mixed2() -> Result<()> { - let context = TestContext::new("3.11"); + let context = uv_test::test_context!("3.11"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -4110,7 +4110,7 @@ fn shared_optional_dependency_mixed2() -> Result<()> { /// Regression test for: #[test] fn shared_dependency_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -4285,7 +4285,7 @@ fn shared_dependency_extra() -> Result<()> { /// Regression test for: #[test] fn shared_dependency_group() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -4459,7 +4459,7 @@ fn shared_dependency_group() -> Result<()> { /// Regression test for: #[test] fn shared_dependency_mixed() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -4647,7 +4647,7 @@ fn shared_dependency_mixed() -> Result<()> { /// Ref #[test] fn extras_are_namespaced() -> Result<()> { - let context = TestContext::new("3.11"); + let context = uv_test::test_context!("3.11"); let root_pyproject_toml = context.temp_dir.child("pyproject.toml"); root_pyproject_toml.write_str( @@ -4856,7 +4856,7 @@ conflicts = [ /// [1]: #[test] fn jinja_no_conflict_markers1() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5018,7 +5018,7 @@ fn jinja_no_conflict_markers1() -> Result<()> { /// shouldn't see any conflict markers in the lock file here. #[test] fn jinja_no_conflict_markers2() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5193,7 +5193,7 @@ fn jinja_no_conflict_markers2() -> Result<()> { /// Ref: #[test] fn collision_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5411,7 +5411,7 @@ fn collision_extra() -> Result<()> { /// Ref: #[test] fn extra_inferences() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -7453,7 +7453,7 @@ fn extra_inferences() -> Result<()> { /// [1]: #[test] fn deduplicate_resolution_markers() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -7602,7 +7602,7 @@ fn deduplicate_resolution_markers() -> Result<()> { /// Ref: #[test] fn incorrect_extra_simplification_leads_to_multiple_torch_packages() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-02-07T00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-02-07T00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -10352,7 +10352,7 @@ fn incorrect_extra_simplification_leads_to_multiple_torch_packages() -> Result<( /// Ref: #[test] fn duplicate_torch_and_sympy_because_of_wrong_inferences() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-02-14T00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-02-14T00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -13596,7 +13596,7 @@ fn duplicate_torch_and_sympy_because_of_wrong_inferences() -> Result<()> { #[test] fn overlapping_resolution_markers() -> Result<()> { - let context = TestContext::new("3.10").with_exclude_newer("2025-01-30T00:00Z"); + let context = uv_test::test_context!("3.10").with_exclude_newer("2025-01-30T00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -14273,7 +14273,7 @@ fn overlapping_resolution_markers() -> Result<()> { /// Ref: #[test] fn avoids_exponential_lock_file_growth() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-02-06T00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-02-06T00:00Z"); let pyproject = r#" [project] @@ -15155,7 +15155,7 @@ fn avoids_exponential_lock_file_growth() -> Result<()> { /// Ref: #[test] fn do_not_simplify_if_not_all_conflict_extras_satisfy_the_marker_by_themselves() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-02-06T00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-02-06T00:00Z"); let pyproject = r#" [project] @@ -15307,7 +15307,7 @@ fn do_not_simplify_if_not_all_conflict_extras_satisfy_the_marker_by_themselves() /// silently ignored. #[test] fn conflict_item_unknown_field() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( diff --git a/crates/uv/tests/it/lock_exclude_newer_relative.rs b/crates/uv/tests/it/lock_exclude_newer_relative.rs index 21e409ffc..40d80d88b 100644 --- a/crates/uv/tests/it/lock_exclude_newer_relative.rs +++ b/crates/uv/tests/it/lock_exclude_newer_relative.rs @@ -3,7 +3,7 @@ use assert_fs::fixture::{FileWriteStr, PathChild}; use insta::assert_snapshot; use uv_static::EnvVars; -use crate::common::{TestContext, uv_snapshot}; +use uv_test::uv_snapshot; /// Lock with a relative exclude-newer value. /// @@ -12,7 +12,7 @@ use crate::common::{TestContext, uv_snapshot}; /// - 3.7: 2024-04-11 #[test] fn lock_exclude_newer_relative() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#" @@ -218,7 +218,7 @@ fn lock_exclude_newer_relative() -> Result<()> { /// - 3.7: 2024-04-11 #[test] fn lock_exclude_newer_older_vs_newer() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#" @@ -333,7 +333,7 @@ fn lock_exclude_newer_older_vs_newer() -> Result<()> { /// - 3.7: 2024-04-11 #[test] fn lock_exclude_newer_package_relative() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#" @@ -523,7 +523,7 @@ fn lock_exclude_newer_package_relative() -> Result<()> { /// - 3.7: 2024-04-11 #[test] fn lock_exclude_newer_relative_pyproject() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#" @@ -594,7 +594,7 @@ fn lock_exclude_newer_relative_pyproject() -> Result<()> { /// - 3.7: 2024-04-11 #[test] fn lock_exclude_newer_package_relative_pyproject() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#" @@ -670,7 +670,7 @@ fn lock_exclude_newer_package_relative_pyproject() -> Result<()> { /// - 4.11.0: 2024-04-05 #[test] fn lock_exclude_newer_relative_global_and_package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#" @@ -953,7 +953,7 @@ fn lock_exclude_newer_relative_global_and_package() -> Result<()> { /// Lock with various relative exclude newer value formats. #[test] fn lock_exclude_newer_relative_values() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#" @@ -1199,7 +1199,7 @@ fn lock_exclude_newer_relative_values() -> Result<()> { /// Lock with various relative exclude newer value formats in a `pyproject.toml`. #[test] fn lock_exclude_newer_relative_values_pyproject() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#" diff --git a/crates/uv/tests/it/lock_scenarios.rs b/crates/uv/tests/it/lock_scenarios.rs index f04566f22..6a413874c 100644 --- a/crates/uv/tests/it/lock_scenarios.rs +++ b/crates/uv/tests/it/lock_scenarios.rs @@ -15,7 +15,7 @@ use insta::assert_snapshot; use uv_static::EnvVars; -use crate::common::{TestContext, packse_index_url, uv_snapshot}; +use uv_test::{packse_index_url, uv_snapshot}; /// There are two packages, `a` and `b`. We select `a` with `a==2.0.0` first, and then `b`, but `a==2.0.0` conflicts with all new versions of `b`, so we backtrack through versions of `b`. /// @@ -83,7 +83,7 @@ use crate::common::{TestContext, packse_index_url, uv_snapshot}; /// ``` #[test] fn wrong_backtracking_basic() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -250,7 +250,7 @@ fn wrong_backtracking_basic() -> Result<()> { /// ``` #[test] fn wrong_backtracking_indirect() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -392,7 +392,7 @@ fn wrong_backtracking_indirect() -> Result<()> { /// ``` #[test] fn fork_allows_non_conflicting_non_overlapping_dependencies() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -510,7 +510,7 @@ fn fork_allows_non_conflicting_non_overlapping_dependencies() -> Result<()> { /// ``` #[test] fn fork_allows_non_conflicting_repeated_dependencies() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -613,7 +613,7 @@ fn fork_allows_non_conflicting_repeated_dependencies() -> Result<()> { /// ``` #[test] fn fork_basic() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -748,7 +748,7 @@ fn fork_basic() -> Result<()> { /// ``` #[test] fn conflict_in_fork() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -818,7 +818,7 @@ fn conflict_in_fork() -> Result<()> { /// ``` #[test] fn fork_conflict_unsatisfiable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -899,7 +899,7 @@ fn fork_conflict_unsatisfiable() -> Result<()> { /// ``` #[test] fn fork_filter_sibling_dependencies() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1081,7 +1081,7 @@ fn fork_filter_sibling_dependencies() -> Result<()> { /// ``` #[test] fn fork_upgrade() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1200,7 +1200,7 @@ fn fork_upgrade() -> Result<()> { /// ``` #[test] fn fork_incomplete_markers() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1355,7 +1355,7 @@ fn fork_incomplete_markers() -> Result<()> { /// ``` #[test] fn fork_marker_accrue() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1489,7 +1489,7 @@ fn fork_marker_accrue() -> Result<()> { /// ``` #[test] fn fork_marker_disjoint() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1559,7 +1559,7 @@ fn fork_marker_disjoint() -> Result<()> { /// ``` #[test] fn fork_marker_inherit_combined_allowed() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1740,7 +1740,7 @@ fn fork_marker_inherit_combined_allowed() -> Result<()> { /// ``` #[test] fn fork_marker_inherit_combined_disallowed() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1910,7 +1910,7 @@ fn fork_marker_inherit_combined_disallowed() -> Result<()> { /// ``` #[test] fn fork_marker_inherit_combined() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2073,7 +2073,7 @@ fn fork_marker_inherit_combined() -> Result<()> { /// ``` #[test] fn fork_marker_inherit_isolated() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2222,7 +2222,7 @@ fn fork_marker_inherit_isolated() -> Result<()> { /// ``` #[test] fn fork_marker_inherit_transitive() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2379,7 +2379,7 @@ fn fork_marker_inherit_transitive() -> Result<()> { /// ``` #[test] fn fork_marker_inherit() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2517,7 +2517,7 @@ fn fork_marker_inherit() -> Result<()> { /// ``` #[test] fn fork_marker_limited_inherit() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2673,7 +2673,7 @@ fn fork_marker_limited_inherit() -> Result<()> { /// ``` #[test] fn fork_marker_selection() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2829,7 +2829,7 @@ fn fork_marker_selection() -> Result<()> { /// ``` #[test] fn fork_marker_track() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2983,7 +2983,7 @@ fn fork_marker_track() -> Result<()> { /// ``` #[test] fn fork_non_fork_marker_transitive() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -3118,7 +3118,7 @@ fn fork_non_fork_marker_transitive() -> Result<()> { /// ``` #[test] fn fork_non_local_fork_marker_direct() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -3190,7 +3190,7 @@ fn fork_non_local_fork_marker_direct() -> Result<()> { /// ``` #[test] fn fork_non_local_fork_marker_transitive() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -3278,7 +3278,7 @@ fn fork_non_local_fork_marker_transitive() -> Result<()> { /// ``` #[test] fn fork_overlapping_markers_basic() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -3448,7 +3448,7 @@ fn fork_overlapping_markers_basic() -> Result<()> { /// ``` #[test] fn preferences_dependent_forking_bistable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -3683,7 +3683,7 @@ fn preferences_dependent_forking_bistable() -> Result<()> { /// ``` #[test] fn preferences_dependent_forking_conflicting() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -3825,7 +3825,7 @@ fn preferences_dependent_forking_conflicting() -> Result<()> { /// ``` #[test] fn preferences_dependent_forking_tristable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -4109,7 +4109,7 @@ fn preferences_dependent_forking_tristable() -> Result<()> { /// ``` #[test] fn preferences_dependent_forking() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -4285,7 +4285,7 @@ fn preferences_dependent_forking() -> Result<()> { /// ``` #[test] fn fork_remaining_universe_partitioning() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -4438,7 +4438,7 @@ fn fork_remaining_universe_partitioning() -> Result<()> { /// ``` #[test] fn fork_requires_python_full_prerelease() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -4522,7 +4522,7 @@ fn fork_requires_python_full_prerelease() -> Result<()> { /// ``` #[test] fn fork_requires_python_full() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -4611,7 +4611,7 @@ fn fork_requires_python_full() -> Result<()> { /// ``` #[test] fn fork_requires_python_patch_overlap() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -4704,7 +4704,7 @@ fn fork_requires_python_patch_overlap() -> Result<()> { /// ``` #[test] fn fork_requires_python() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -4785,7 +4785,7 @@ fn fork_requires_python() -> Result<()> { /// ``` #[test] fn requires_python_wheels() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -4882,7 +4882,7 @@ fn requires_python_wheels() -> Result<()> { /// ``` #[test] fn unreachable_package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -4982,7 +4982,7 @@ fn unreachable_package() -> Result<()> { /// ``` #[test] fn unreachable_wheels() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -5114,7 +5114,7 @@ fn unreachable_wheels() -> Result<()> { /// ``` #[test] fn marker_variants_have_different_extras() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -5252,7 +5252,7 @@ fn marker_variants_have_different_extras() -> Result<()> { /// ``` #[test] fn virtual_package_extra_priorities() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -5373,7 +5373,7 @@ fn virtual_package_extra_priorities() -> Result<()> { /// ``` #[test] fn specific_architecture() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); diff --git a/crates/uv/tests/it/main.rs b/crates/uv/tests/it/main.rs index acef5f98f..b809c1091 100644 --- a/crates/uv/tests/it/main.rs +++ b/crates/uv/tests/it/main.rs @@ -1,8 +1,6 @@ //! this is the single integration test, as documented by matklad //! in -pub(crate) mod common; - mod auth; mod branching_urls; diff --git a/crates/uv/tests/it/network.rs b/crates/uv/tests/it/network.rs index 3df451ab0..3c53af37b 100644 --- a/crates/uv/tests/it/network.rs +++ b/crates/uv/tests/it/network.rs @@ -16,8 +16,7 @@ use wiremock::matchers::{any, method}; use wiremock::{Mock, MockServer, Request, ResponseTemplate}; use uv_static::EnvVars; - -use crate::common::{TestContext, uv_snapshot}; +use uv_test::{TestContext, uv_snapshot}; /// Creates a CONNECT tunnel proxy that forwards connections to the target. /// @@ -237,7 +236,7 @@ fn read_timeout_server() -> (String, impl Drop) { /// Check the simple index error message when the server returns HTTP status 500, a retryable error. #[tokio::test] async fn simple_http_500() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let (_server_drop_guard, mock_server_uri) = http_error_server().await; @@ -262,7 +261,7 @@ async fn simple_http_500() { /// Check the simple index error message when the server returns a retryable IO error. #[tokio::test] async fn simple_io_err() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let (_server_drop_guard, mock_server_uri) = io_error_server().await; @@ -289,7 +288,7 @@ async fn simple_io_err() { /// Check the find links error message when the server returns HTTP status 500, a retryable error. #[tokio::test] async fn find_links_http_500() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let (_server_drop_guard, mock_server_uri) = http_error_server().await; @@ -316,7 +315,7 @@ async fn find_links_http_500() { /// Check the find links error message when the server returns a retryable IO error. #[tokio::test] async fn find_links_io_error() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let (_server_drop_guard, mock_server_uri) = io_error_server().await; @@ -346,7 +345,7 @@ async fn find_links_io_error() { /// returns different kinds of retryable errors. #[tokio::test] async fn find_links_mixed_error() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let (_server_drop_guard, mock_server_uri) = mixed_error_server().await; @@ -374,7 +373,7 @@ async fn find_links_mixed_error() { /// error. #[tokio::test] async fn direct_url_http_500() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let (_server_drop_guard, mock_server_uri) = http_error_server().await; @@ -401,7 +400,7 @@ async fn direct_url_http_500() { /// Check the direct package URL error message when the server returns a retryable IO error. #[tokio::test] async fn direct_url_io_error() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let (_server_drop_guard, mock_server_uri) = io_error_server().await; @@ -431,7 +430,7 @@ async fn direct_url_io_error() { /// different kinds of retryable errors. #[tokio::test] async fn direct_url_mixed_error() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let (_server_drop_guard, mock_server_uri) = mixed_error_server().await; @@ -485,7 +484,7 @@ fn write_python_downloads_json(context: &TestContext, mock_server_uri: &String) /// error. #[tokio::test] async fn python_install_http_500() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_python_keys() .with_filtered_exe_suffix() .with_managed_python_dirs(); @@ -516,7 +515,7 @@ async fn python_install_http_500() { /// Check the Python install error message when the server returns a retryable IO error. #[tokio::test] async fn python_install_io_error() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_python_keys() .with_filtered_exe_suffix() .with_managed_python_dirs(); @@ -548,7 +547,7 @@ async fn python_install_io_error() { #[tokio::test] async fn install_http_retries() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let server = MockServer::start().await; @@ -621,7 +620,7 @@ async fn install_http_retries() { #[tokio::test] async fn install_http_retry_low_level() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let server = MockServer::start().await; @@ -656,7 +655,7 @@ async fn install_http_retry_low_level() { /// Test problem details with a 403 error containing license compliance information #[tokio::test] async fn rfc9457_problem_details_license_violation() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let server = MockServer::start().await; @@ -704,7 +703,7 @@ async fn rfc9457_problem_details_license_violation() { /// Test that invalid proxy URL in uv.toml produces a helpful error message. #[tokio::test] async fn proxy_invalid_url_in_uv_toml() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let uv_toml = context.temp_dir.child("uv.toml"); uv_toml @@ -735,7 +734,7 @@ async fn proxy_invalid_url_in_uv_toml() { /// Test that invalid proxy URL (not a URL) in uv.toml produces a helpful error message. #[tokio::test] async fn proxy_invalid_url_not_a_url_in_uv_toml() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let uv_toml = context.temp_dir.child("uv.toml"); uv_toml @@ -767,7 +766,7 @@ async fn proxy_invalid_url_not_a_url_in_uv_toml() { #[cfg(feature = "test-pypi")] #[tokio::test] async fn proxy_valid_url_in_uv_toml() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let target_server = MockServer::start().await; Mock::given(any()) @@ -826,7 +825,7 @@ async fn proxy_valid_url_in_uv_toml() { #[cfg(feature = "test-pypi")] #[test] fn proxy_https_proxy_in_uv_toml() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let proxy_addr = start_connect_tunnel_proxy(); let proxy_uri = format!("http://{proxy_addr}"); @@ -863,7 +862,7 @@ fn proxy_https_proxy_in_uv_toml() { #[cfg(feature = "test-pypi")] #[tokio::test] async fn proxy_no_proxy_in_uv_toml() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let target_server = MockServer::start().await; mock_simple_api(&target_server).await; @@ -931,7 +930,7 @@ no-proxy = ["{target_host}"] #[cfg(feature = "test-pypi")] #[tokio::test] async fn proxy_schemeless_url_in_uv_toml() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let target_server = MockServer::start().await; Mock::given(any()) @@ -994,7 +993,7 @@ async fn proxy_schemeless_url_in_uv_toml() { #[test] fn connect_timeout_index() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a server that never responds, causing a timeout for our requests. let listener = std::net::TcpListener::bind("127.0.0.1:0").unwrap(); @@ -1029,7 +1028,7 @@ fn connect_timeout_index() { #[test] fn connect_timeout_stream() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a server that never responds, causing a timeout for our requests. let listener = std::net::TcpListener::bind("127.0.0.1:0").unwrap(); @@ -1063,7 +1062,7 @@ fn connect_timeout_stream() { #[tokio::test] async fn retry_read_timeout_index() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let (server, _guard) = read_timeout_server(); @@ -1090,7 +1089,7 @@ async fn retry_read_timeout_index() { #[tokio::test] async fn retry_read_timeout_stream() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let (server, _guard) = read_timeout_server(); diff --git a/crates/uv/tests/it/pip_check.rs b/crates/uv/tests/it/pip_check.rs index 6ececc130..20f24f7c0 100644 --- a/crates/uv/tests/it/pip_check.rs +++ b/crates/uv/tests/it/pip_check.rs @@ -2,12 +2,11 @@ use anyhow::Result; use assert_fs::fixture::FileWriteStr; use assert_fs::fixture::PathChild; -use crate::common::TestContext; -use crate::common::uv_snapshot; +use uv_test::uv_snapshot; #[test] fn check_compatible_packages() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("requests==2.31.0")?; @@ -51,7 +50,7 @@ fn check_compatible_packages() -> Result<()> { // this test force-installs idna 2.4 to trigger a failure. #[test] fn check_incompatible_packages() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("requests==2.31.0")?; @@ -120,7 +119,7 @@ fn check_incompatible_packages() -> Result<()> { // with multiple incompatible packages. #[test] fn check_multiple_incompatible_packages() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("requests==2.31.0")?; @@ -190,7 +189,7 @@ fn check_multiple_incompatible_packages() -> Result<()> { #[test] fn check_python_version() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context .pip_install() diff --git a/crates/uv/tests/it/pip_compile.rs b/crates/uv/tests/it/pip_compile.rs index 5091b037e..9ee72de4f 100644 --- a/crates/uv/tests/it/pip_compile.rs +++ b/crates/uv/tests/it/pip_compile.rs @@ -17,13 +17,13 @@ use wiremock::{Mock, MockServer, ResponseTemplate}; use uv_fs::Simplified; use uv_static::EnvVars; -use crate::common::{ +use uv_test::{ DEFAULT_PYTHON_VERSION, TestContext, download_to_disk, packse_index_url, uv_snapshot, }; #[test] fn compile_requirements_in() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio==3.7.0")?; @@ -52,7 +52,7 @@ fn compile_requirements_in() -> Result<()> { /// Resolve a specific version of `anyio` from a `requirements.in` file with a `--annotation-style=line` flag. #[test] fn compile_requirements_in_annotation_line() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio==3.7.0")?; @@ -80,7 +80,7 @@ fn compile_requirements_in_annotation_line() -> Result<()> { /// when passed a path of `-`. #[test] fn compile_requirements_in_stdin() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio==3.7.0")?; @@ -108,7 +108,7 @@ fn compile_requirements_in_stdin() -> Result<()> { #[test] fn missing_requirements_in() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); uv_snapshot!(context.filters(), context.pip_compile() @@ -127,7 +127,7 @@ fn missing_requirements_in() { #[test] fn missing_venv() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context.temp_dir.child("requirements.in").touch()?; fs_err::remove_dir_all(context.venv.path())?; @@ -152,7 +152,7 @@ fn missing_venv() -> Result<()> { #[test] fn empty_output() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context .temp_dir .child("requirements.in") @@ -182,7 +182,7 @@ fn empty_output() -> Result<()> { /// Resolve a specific version of `anyio` from a `pyproject.toml` file. #[test] fn compile_pyproject_toml() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#"[build-system] @@ -223,7 +223,7 @@ dependencies = [ /// dynamic, we shouldn't need to build the package, since the requirements are static. #[test] fn compile_pyproject_toml_dynamic_version() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#"[build-system] @@ -263,7 +263,7 @@ dependencies = [ /// Resolve a specific version of `anyio` from a `pyproject.toml` file with `--annotation-style=line`. #[test] fn compile_pyproject_toml_with_line_annotation() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#"[build-system] @@ -300,7 +300,7 @@ dependencies = [ #[test] fn compile_pyproject_toml_eager_validation() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" [project] @@ -332,7 +332,7 @@ fn compile_pyproject_toml_eager_validation() -> Result<()> { /// Resolve a package from a `requirements.in` file, with a `constraints.txt` file. #[test] fn compile_constraints_txt() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio==3.7.0")?; @@ -368,7 +368,7 @@ fn compile_constraints_txt() -> Result<()> { /// Resolve a package from a `requirements.in` file, with an inline constraint. #[test] fn compile_constraints_inline() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio==3.7.0")?; requirements_in.write_str("-c constraints.txt")?; @@ -396,7 +396,7 @@ fn compile_constraints_inline() -> Result<()> { /// uses markers. #[test] fn compile_constraints_markers() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio")?; @@ -437,7 +437,7 @@ fn compile_constraints_markers() -> Result<()> { /// (though it currently _is_ included). #[test] fn compile_constraint_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("flask")?; @@ -488,7 +488,7 @@ fn compile_constraint_extra() -> Result<()> { /// See: #[test] fn compile_constraints_omit_impossible_dependencies() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str( "\ @@ -694,7 +694,7 @@ portalocker==2.5.1 /// Resolve a package from an optional extra in a `pyproject.toml` file. #[test] fn compile_pyproject_toml_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#"[build-system] @@ -737,7 +737,7 @@ optional-dependencies.foo = [ /// Resolve a package from an extra with non-normalized names in a `pyproject.toml` file. #[test] fn compile_pyproject_toml_extra_name_normalization() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#"[build-system] @@ -780,7 +780,7 @@ optional-dependencies."FrIeNdLy-._.-bArD" = [ /// Request an extra that does not exist in a `pyproject.toml` file. #[test] fn compile_pyproject_toml_extra_missing() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#"[build-system] @@ -815,7 +815,7 @@ optional-dependencies.foo = [ /// Compile a `pyproject.toml` file with a `poetry` section. #[test] fn compile_pyproject_toml_poetry() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#"[tool.poetry] @@ -874,7 +874,7 @@ build-backend = "poetry.core.masonry.api" /// `dependencies` field, which should be treated as an empty list. #[test] fn compile_pyproject_toml_poetry_empty_dependencies() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#"[project] @@ -925,7 +925,7 @@ build-backend = "poetry.core.masonry.api" /// `dependencies` field. #[test] fn compile_pyproject_toml_poetry_invalid_dependencies() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#"[project] @@ -976,7 +976,7 @@ build-backend = "poetry.core.masonry.api" /// Compile a `pyproject.toml` file that uses setuptools as the build backend. #[test] fn compile_pyproject_toml_setuptools() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#"[build-system] @@ -1041,7 +1041,7 @@ setup( /// Compile a `setup.cfg` file. #[test] fn compile_setup_cfg() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let setup_cfg = context.temp_dir.child("setup.cfg"); setup_cfg.write_str( @@ -1099,7 +1099,7 @@ setup( /// Compile a `setup.py` file. #[test] fn compile_setup_py() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let setup_py = context.temp_dir.child("setup.py"); setup_py.write_str( @@ -1147,7 +1147,7 @@ setup( /// Resolve a `pyproject.toml` file with an invalid project name. #[test] fn compile_pyproject_toml_invalid_name() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#"[build-system] @@ -1183,7 +1183,7 @@ dependencies = [ /// Request multiple extras that do not exist in a `pyproject.toml` file. #[test] fn compile_pyproject_toml_extras_missing() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#"[build-system] @@ -1222,7 +1222,7 @@ optional-dependencies.foo = [ /// Request extras when using a `requirements.in` file which does not support extras. #[test] fn compile_requirements_file_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio==3.7.0")?; @@ -1245,7 +1245,7 @@ fn compile_requirements_file_extra() -> Result<()> { /// Request an extra with a name that does not conform to the specification. #[test] fn invalid_extra_name() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#"[build-system] @@ -1281,7 +1281,7 @@ optional-dependencies.foo = [ /// Resolve a specific version of Black at Python 3.12. #[test] fn compile_python_312() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("black==23.10.1")?; @@ -1401,7 +1401,7 @@ fn compile_python_312() -> Result<()> { /// Resolve a specific version of Black at Python 3.12 with `--annotation-style=line`. #[test] fn compile_python_312_annotation_line() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("black==23.10.1")?; @@ -1433,7 +1433,7 @@ fn compile_python_312_annotation_line() -> Result<()> { /// Compile for 3.12 when only a different interpreter version is available. #[test] fn compile_fallback_interpreter() -> Result<()> { - let context = TestContext::new("3.10").with_filtered_python_sources(); + let context = uv_test::test_context!("3.10").with_filtered_python_sources(); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("black==23.10.1")?; @@ -1588,7 +1588,7 @@ fn compile_fallback_interpreter() -> Result<()> { #[test] fn compile_python_conflicts() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("black==23.10.1")?; @@ -1704,8 +1704,8 @@ fn compile_python_conflicts() -> Result<()> { #[test] fn compile_python_build_version_different_than_target() -> Result<()> { - let context = - TestContext::new_with_versions(&["3.12", "3.10", "3.11"]).with_filtered_python_sources(); + let context = uv_test::test_context_with_versions!(&["3.12", "3.10", "3.11"]) + .with_filtered_python_sources(); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("black==23.10.1")?; @@ -1877,7 +1877,7 @@ fn compile_python_build_version_different_than_target() -> Result<()> { fn compile_fallback_interpreter_broken_in_path() -> Result<()> { use std::os::unix::fs::PermissionsExt; - let context = TestContext::new("3.10"); + let context = uv_test::test_context!("3.10"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("black==23.10.1")?; @@ -1930,7 +1930,7 @@ fn compile_fallback_interpreter_broken_in_path() -> Result<()> { /// Resolve a specific version of Black at Python 3.12 without deps. #[test] fn compile_python_312_no_deps() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("black==23.10.1")?; @@ -1958,7 +1958,7 @@ fn compile_python_312_no_deps() -> Result<()> { /// Resolve a specific version of Black at Python 3.7. #[test] fn compile_python_37() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("black==23.10.1")?; @@ -1997,7 +1997,7 @@ fn compile_python_37() -> Result<()> { /// requirements aren't resolved at their lowest compatible version. #[test] fn compile_sdist_resolution_lowest() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio @ https://files.pythonhosted.org/packages/2d/b8/7333d87d5f03247215d86a86362fd3e324111788c6cdd8d2e6196a6ba833/anyio-4.2.0.tar.gz")?; @@ -2029,7 +2029,7 @@ fn compile_sdist_resolution_lowest() -> Result<()> { /// Resolve a specific version of Black against an invalid Python version. #[test] fn compile_python_invalid_version() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("black==23.10.1")?; @@ -2054,7 +2054,7 @@ fn compile_python_invalid_version() -> Result<()> { /// Resolve a specific version of Black against an invalid Python version. #[test] fn compile_python_dev_version() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("black==23.10.1")?; @@ -2080,7 +2080,7 @@ fn compile_python_dev_version() -> Result<()> { /// applicable due to a marker expression. #[test] fn omit_non_matching_annotation() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio")?; @@ -2116,7 +2116,7 @@ fn omit_non_matching_annotation() -> Result<()> { #[cfg(feature = "test-python-eol")] #[test] fn compile_numpy_py38() -> Result<()> { - let context = TestContext::new("3.8"); + let context = uv_test::test_context!("3.8"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("numpy")?; @@ -2143,7 +2143,7 @@ fn compile_numpy_py38() -> Result<()> { /// Resolve a specific Flask wheel via a URL dependency. #[test] fn compile_wheel_url_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("flask @ https://files.pythonhosted.org/packages/36/42/015c23096649b908c809c69388a805a571a3bea44362fe87e33fc3afa01f/flask-3.0.0-py3-none-any.whl")?; @@ -2184,7 +2184,7 @@ fn compile_wheel_url_dependency() -> Result<()> { /// Exercises the `prepare_metadata_for_build_wheel` hooks. #[test] fn compile_sdist_url_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("flask @ https://files.pythonhosted.org/packages/d8/09/c1a7354d3925a3c6c8cfdebf4245bae67d633ffda1ba415add06ffc839c5/flask-3.0.0.tar.gz")?; @@ -2224,7 +2224,7 @@ fn compile_sdist_url_dependency() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn compile_git_https_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str( "uv-public-pypackage @ git+https://github.com/astral-test/uv-public-pypackage", @@ -2257,7 +2257,7 @@ fn compile_git_https_dependency() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn compile_git_branch_https_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str( "uv-public-pypackage @ git+https://github.com/astral-test/uv-public-pypackage@test-branch", @@ -2285,7 +2285,7 @@ fn compile_git_branch_https_dependency() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn compile_git_tag_https_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str( "uv-public-pypackage @ git+https://github.com/astral-test/uv-public-pypackage@test-tag", @@ -2315,7 +2315,7 @@ fn compile_git_tag_https_dependency() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn compile_git_date_tag_https_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str( "uv-public-pypackage @ git+https://github.com/astral-test/uv-public-pypackage@20240402", @@ -2343,7 +2343,7 @@ fn compile_git_date_tag_https_dependency() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn compile_git_long_commit_https_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str( "uv-public-pypackage @ git+https://github.com/astral-test/uv-public-pypackage@0dacfd662c64cb4ceb16e6cf65a157a8b715b979", @@ -2371,7 +2371,7 @@ fn compile_git_long_commit_https_dependency() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn compile_git_short_commit_https_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str( "uv-public-pypackage @ git+https://github.com/astral-test/uv-public-pypackage@0dacfd6", @@ -2399,7 +2399,7 @@ fn compile_git_short_commit_https_dependency() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn compile_git_refs_https_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in .write_str("uv-public-pypackage @ git+https://github.com/astral-test/uv-public-pypackage@refs/pull/4/head")?; @@ -2426,7 +2426,7 @@ fn compile_git_refs_https_dependency() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn compile_git_subdirectory_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("example-pkg-a @ git+https://github.com/pypa/sample-namespace-packages.git@df7530eeb8fa0cb7dbb8ecb28363e8e36bfa2f45#subdirectory=pkg_resources/pkg_a")?; @@ -2452,7 +2452,7 @@ fn compile_git_subdirectory_dependency() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn compile_git_concurrent_access() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in .write_str("example-pkg-a @ git+https://github.com/pypa/sample-namespace-packages.git@df7530eeb8fa0cb7dbb8ecb28363e8e36bfa2f45#subdirectory=pkg_resources/pkg_a\nexample-pkg-b @ git+https://github.com/pypa/sample-namespace-packages.git@df7530eeb8fa0cb7dbb8ecb28363e8e36bfa2f45#subdirectory=pkg_resources/pkg_b")?; @@ -2481,7 +2481,7 @@ fn compile_git_concurrent_access() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn compile_git_unnamed_concurrent_access() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in .write_str("git+https://github.com/pypa/sample-namespace-packages.git@df7530eeb8fa0cb7dbb8ecb28363e8e36bfa2f45#subdirectory=pkg_resources/pkg_a\ngit+https://github.com/pypa/sample-namespace-packages.git@df7530eeb8fa0cb7dbb8ecb28363e8e36bfa2f45#subdirectory=pkg_resources/pkg_b")?; @@ -2510,7 +2510,7 @@ fn compile_git_unnamed_concurrent_access() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn compile_git_mismatched_name() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in .write_str("flask @ git+https://github.com/pallets/flask.git@2.0.0\ndask @ git+https://github.com/pallets/flask.git@3.0.0")?; @@ -2535,7 +2535,7 @@ fn compile_git_mismatched_name() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn compile_git_subdirectory_static_metadata() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("uv-public-pypackage @ git+https://github.com/astral-test/uv-workspace-pypackage#subdirectory=uv-public-pypackage")?; @@ -2562,7 +2562,7 @@ fn compile_git_subdirectory_static_metadata() -> Result<()> { /// duplicate dependency from `PyPI`. #[test] fn mixed_url_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("flask==3.0.0\nwerkzeug @ https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl")?; @@ -2604,7 +2604,7 @@ fn mixed_url_dependency() -> Result<()> { /// should result in a conflict. #[test] fn conflicting_direct_url_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("werkzeug==3.0.0\nwerkzeug @ https://files.pythonhosted.org/packages/ff/1d/960bb4017c68674a1cb099534840f18d3def3ce44aed12b5ed8b78e0153e/Werkzeug-2.0.0-py3-none-any.whl")?; @@ -2627,7 +2627,7 @@ fn conflicting_direct_url_dependency() -> Result<()> { /// should prefer the direct URL dependency. #[test] fn compatible_direct_url_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("werkzeug==2.0.0\nwerkzeug @ https://files.pythonhosted.org/packages/ff/1d/960bb4017c68674a1cb099534840f18d3def3ce44aed12b5ed8b78e0153e/Werkzeug-2.0.0-py3-none-any.whl")?; @@ -2652,7 +2652,7 @@ fn compatible_direct_url_dependency() -> Result<()> { /// Request Werkzeug via two different URLs at different versions, which should result in a conflict. #[test] fn conflicting_repeated_url_dependency_version_mismatch() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("werkzeug @ https://files.pythonhosted.org/packages/bd/24/11c3ea5a7e866bf2d97f0501d0b4b1c9bbeade102bb4b588f0d2919a5212/Werkzeug-2.0.1-py3-none-any.whl\nwerkzeug @ https://files.pythonhosted.org/packages/ff/1d/960bb4017c68674a1cb099534840f18d3def3ce44aed12b5ed8b78e0153e/Werkzeug-2.0.0-py3-none-any.whl")?; @@ -2676,7 +2676,7 @@ fn conflicting_repeated_url_dependency_version_mismatch() -> Result<()> { /// URLs is compatible with the requested Python version, so there shouldn't be any conflict. #[test] fn conflicting_repeated_url_dependency_markers() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc! {r" werkzeug @ https://files.pythonhosted.org/packages/bd/24/11c3ea5a7e866bf2d97f0501d0b4b1c9bbeade102bb4b588f0d2919a5212/Werkzeug-2.0.1-py3-none-any.whl ; python_version >= '3.10' @@ -2706,7 +2706,7 @@ fn conflicting_repeated_url_dependency_markers() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn conflicting_repeated_url_dependency_version_match() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("werkzeug @ git+https://github.com/pallets/werkzeug.git@2.0.0\nwerkzeug @ https://files.pythonhosted.org/packages/ff/1d/960bb4017c68674a1cb099534840f18d3def3ce44aed12b5ed8b78e0153e/Werkzeug-2.0.0-py3-none-any.whl")?; @@ -2730,7 +2730,7 @@ fn conflicting_repeated_url_dependency_version_match() -> Result<()> { /// Request Flask, but include a URL dependency for a conflicting version of Werkzeug. #[test] fn conflicting_transitive_url_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("flask==3.0.0\nwerkzeug @ https://files.pythonhosted.org/packages/ff/1d/960bb4017c68674a1cb099534840f18d3def3ce44aed12b5ed8b78e0153e/Werkzeug-2.0.0-py3-none-any.whl")?; @@ -2754,7 +2754,7 @@ fn conflicting_transitive_url_dependency() -> Result<()> { #[cfg(feature = "test-git")] #[test] fn compatible_repeated_url_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc! {r" uv-public-pypackage @ git+https://github.com/astral-test/uv-public-pypackage.git@0.0.2 @@ -2784,7 +2784,7 @@ fn compatible_repeated_url_dependency() -> Result<()> { #[cfg(feature = "test-git")] #[test] fn conflicting_repeated_url_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc! {r" uv-public-pypackage @ git+https://github.com/astral-test/uv-public-pypackage.git@0.0.2 @@ -2812,7 +2812,7 @@ fn conflicting_repeated_url_dependency() -> Result<()> { #[cfg(feature = "test-git")] #[test] fn compatible_narrowed_url_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc! {r" uv-public-pypackage @ git+https://github.com/astral-test/uv-public-pypackage.git@0.0.2 @@ -2843,7 +2843,7 @@ fn compatible_narrowed_url_dependency() -> Result<()> { #[cfg(feature = "test-git")] #[test] fn compatible_broader_url_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc! {r" uv-public-pypackage @ git+https://github.com/astral-test/uv-public-pypackage.git@b270df1a2fb5d012294e9aaf05e7e0bab1e6a389 @@ -2874,7 +2874,7 @@ fn compatible_broader_url_dependency() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn compatible_repeated_narrowed_url_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc! {r" uv-public-pypackage @ git+https://github.com/astral-test/uv-public-pypackage.git@0.0.2 @@ -2908,7 +2908,7 @@ fn compatible_repeated_narrowed_url_dependency() -> Result<()> { #[cfg(feature = "test-git")] #[test] fn incompatible_narrowed_url_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc! {r" uv-public-pypackage @ git+https://github.com/astral-test/uv-public-pypackage.git@0.0.2 @@ -2936,7 +2936,7 @@ fn incompatible_narrowed_url_dependency() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn allowed_transitive_git_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("hatchling_editable @ https://github.com/astral-sh/uv/files/14762645/hatchling_editable.zip")?; @@ -2966,7 +2966,7 @@ fn allowed_transitive_git_dependency() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn allowed_transitive_url_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("hatchling_editable @ https://github.com/astral-sh/uv/files/14762645/hatchling_editable.zip")?; @@ -3004,7 +3004,7 @@ fn allowed_transitive_url_dependency() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn allowed_transitive_canonical_url_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("hatchling_editable @ https://github.com/astral-sh/uv/files/14762645/hatchling_editable.zip")?; @@ -3041,7 +3041,7 @@ fn allowed_transitive_canonical_url_dependency() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn allowed_transitive_url_path_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("hatchling_editable @ ${HATCH_PATH}")?; @@ -3072,7 +3072,7 @@ fn allowed_transitive_url_path_dependency() -> Result<()> { /// if the dependency has an override. #[test] fn requirement_constraint_override_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio @ https://files.pythonhosted.org/packages/db/4d/3970183622f0330d3c23d9b8a5f52e365e50381fd484d08e3285104333d3/anyio-4.3.0.tar.gz")?; @@ -3107,7 +3107,7 @@ fn requirement_constraint_override_url() -> Result<()> { /// a pre-release version. #[test] fn requirement_override_prerelease() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("flask<2.0.0rc4")?; @@ -3150,7 +3150,7 @@ fn requirement_override_prerelease() -> Result<()> { /// Resolve packages from all extras in a `pyproject.toml` file. #[test] fn compile_pyproject_toml_all_extras() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#"[build-system] @@ -3206,7 +3206,7 @@ optional-dependencies.bar = [ #[test] fn compile_pyproject_toml_all_extras_annotation_line() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#"[build-system] @@ -3253,7 +3253,7 @@ optional-dependencies.bar = [ /// Resolve packages from all extras in a `pyproject.toml` file. #[test] fn compile_does_not_allow_both_extra_and_all_extras() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#"[build-system] @@ -3296,7 +3296,7 @@ optional-dependencies.bar = [ /// Compile requirements that cannot be solved due to conflict in a `pyproject.toml` fil;e. #[test] fn compile_unsolvable_requirements() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#"[build-system] @@ -3328,7 +3328,7 @@ dependencies = ["anyio==3.7.0", "anyio==4.0.0"] /// a requirement with a version that is not available online. #[test] fn compile_unsolvable_requirements_version_not_available() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#"[build-system] @@ -3359,7 +3359,7 @@ dependencies = ["anyio==300.1.4"] /// Resolve at a specific time in the past #[test] fn compile_exclude_newer() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("tqdm")?; @@ -3449,7 +3449,7 @@ fn compile_exclude_newer() -> Result<()> { /// Test per-package exclude-newer functionality #[test] fn compile_exclude_newer_package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("tqdm\nrequests")?; @@ -3557,7 +3557,7 @@ fn compile_exclude_newer_package() -> Result<()> { /// Test error handling for malformed --exclude-newer-package #[test] fn compile_exclude_newer_package_errors() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("tqdm")?; @@ -3603,7 +3603,7 @@ fn compile_exclude_newer_package_errors() -> Result<()> { /// Resolve a local path dependency on a specific wheel. #[test] fn compile_wheel_path_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Download a wheel. let flask_wheel = context.temp_dir.child("flask-3.0.0-py3-none-any.whl"); @@ -3855,7 +3855,7 @@ fn compile_wheel_path_dependency() -> Result<()> { /// Resolve a local path dependency on a specific source distribution. #[test] fn compile_source_distribution_path_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Download a source distribution. let flask_wheel = context.temp_dir.child("flask-3.0.0.tar.gz"); download_to_disk( @@ -3903,7 +3903,7 @@ fn compile_source_distribution_path_dependency() -> Result<()> { /// Resolve a local path dependency to a non-existent file. #[test] fn compile_wheel_path_dependency_missing() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(&format!( "flask @ {}", @@ -3929,7 +3929,7 @@ fn compile_wheel_path_dependency_missing() -> Result<()> { /// Resolve a yanked version of `attrs` by specifying the version directly. #[test] fn compile_yanked_version_direct() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("attrs==21.1.0")?; @@ -3955,7 +3955,7 @@ fn compile_yanked_version_direct() -> Result<()> { /// Fail to resolve `attrs` due to the indirect use of a yanked version (`21.1.0`). #[test] fn compile_yanked_version_indirect() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("attrs>20.3.0,<21.2.0")?; @@ -3983,7 +3983,7 @@ fn compile_yanked_version_indirect() -> Result<()> { /// requirement with an incompatible version. #[test] fn override_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("flask==3.0.0")?; @@ -4029,7 +4029,7 @@ fn override_dependency() -> Result<()> { /// Check that `tool.uv.override-dependencies` in `pyproject.toml` is respected. #[test] fn override_dependency_from_pyproject() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#"[project] @@ -4085,7 +4085,7 @@ fn override_dependency_from_pyproject() -> Result<()> { /// Check that `tool.uv.constraint-dependencies` in `pyproject.toml` is respected. #[test] fn constraint_dependency_from_pyproject() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#"[project] @@ -4129,7 +4129,7 @@ fn constraint_dependency_from_pyproject() -> Result<()> { /// Check that `override-dependencies` in `uv.toml` is respected. #[test] fn override_dependency_from_specific_uv_toml() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let _ = context.temp_dir.child("project").create_dir_all(); let pyproject_toml = context.temp_dir.child("project/pyproject.toml"); pyproject_toml.write_str( @@ -4194,7 +4194,7 @@ fn override_dependency_from_specific_uv_toml() -> Result<()> { /// override it with a multi-line override. #[test] fn override_multi_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("black==23.10.1")?; @@ -4241,7 +4241,7 @@ fn override_multi_dependency() -> Result<()> { /// So we shouldn't apply the `pysocks==1.7.1` override without the `socks` extra. #[test] fn dont_add_override_for_non_activated_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("urllib3==2.2.1")?; @@ -4271,7 +4271,7 @@ fn dont_add_override_for_non_activated_extra() -> Result<()> { /// Check how invalid `tool.uv.override-dependencies` is handled in `pyproject.toml`. #[test] fn override_dependency_from_workspace_invalid_syntax() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#"[project] @@ -4324,7 +4324,7 @@ fn override_dependency_from_workspace_invalid_syntax() -> Result<()> { /// requirement with a URL. #[test] fn override_dependency_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("flask==3.0.0")?; @@ -4369,7 +4369,7 @@ fn override_dependency_url() -> Result<()> { /// requirement with an unnamed URL. #[test] fn override_dependency_unnamed_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("flask==3.0.0")?; @@ -4413,7 +4413,7 @@ fn override_dependency_unnamed_url() -> Result<()> { /// Request an extra that doesn't exist on the specified package. #[test] fn missing_registry_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("black[tensorboard]==23.10.1")?; @@ -4449,7 +4449,7 @@ fn missing_registry_extra() -> Result<()> { /// Request an extra that doesn't exist on the specified package. #[test] fn missing_url_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("flask[tensorboard] @ https://files.pythonhosted.org/packages/36/42/015c23096649b908c809c69388a805a571a3bea44362fe87e33fc3afa01f/flask-3.0.0-py3-none-any.whl")?; @@ -4490,7 +4490,7 @@ fn missing_url_extra() -> Result<()> { /// requirements file. #[test] fn preserve_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("flask @ https://files.PYTHONHOSTED.org/packages/36/42/015c23096649b908c809c69388a805a571a3bea44362fe87e33fc3afa01f/flask-3.0.0-py3-none-any.whl")?; @@ -4530,7 +4530,7 @@ fn preserve_url() -> Result<()> { /// the requirements file. #[test] fn preserve_project_root() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Download a wheel. let flask_wheel = context.temp_dir.child("flask-3.0.0-py3-none-any.whl"); download_to_disk( @@ -4576,7 +4576,7 @@ fn preserve_project_root() -> Result<()> { /// Resolve a dependency from a URL, passing in the entire URL as an environment variable. #[test] fn respect_http_env_var() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("flask @ ${URL}")?; @@ -4617,7 +4617,7 @@ fn respect_http_env_var() -> Result<()> { /// A requirement defined as a single unnamed environment variable should be parsed as such. #[test] fn respect_unnamed_env_var() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("${URL}")?; @@ -4659,7 +4659,7 @@ fn respect_unnamed_env_var() -> Result<()> { /// variable is not set. #[test] fn error_missing_unnamed_env_var() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("${URL}")?; @@ -4684,7 +4684,7 @@ fn error_missing_unnamed_env_var() -> Result<()> { /// Resolve a dependency from a file path, passing in the entire path as an environment variable. #[test] fn respect_file_env_var() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Download a wheel. let flask_wheel = context.temp_dir.child("flask-3.0.0-py3-none-any.whl"); download_to_disk( @@ -4730,7 +4730,7 @@ fn respect_file_env_var() -> Result<()> { #[test] fn compile_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc! {r" -e ../../test/packages/poetry_editable @@ -4790,7 +4790,7 @@ fn compile_editable() -> Result<()> { /// If an editable is repeated, it should only be built once. #[test] fn deduplicate_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc! {r" -e file://../../test/packages/black_editable @@ -4839,7 +4839,7 @@ fn deduplicate_editable() -> Result<()> { #[test] fn strip_fragment_unnamed() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc! {r" ../../test/packages/black_editable#egg=black @@ -4866,7 +4866,7 @@ fn strip_fragment_unnamed() -> Result<()> { #[test] fn strip_fragment_named() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc! {r" black @ ../../test/packages/black_editable#egg=black @@ -4893,7 +4893,7 @@ fn strip_fragment_named() -> Result<()> { #[test] fn recursive_extras_direct_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("black[dev] @ ../../test/packages/black_editable")?; @@ -4940,7 +4940,7 @@ fn recursive_extras_direct_url() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn compile_editable_url_requirement() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("-e ../../test/packages/hatchling_editable")?; @@ -4968,7 +4968,7 @@ fn compile_editable_url_requirement() -> Result<()> { #[test] #[cfg(not(target_env = "musl"))] // No musllinux wheels in the torch index fn compile_html() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("jinja2<=3.1.2")?; @@ -4997,7 +4997,7 @@ fn compile_html() -> Result<()> { /// Resolve a distribution from a registry with and without a trailing slash. #[test] fn trailing_slash() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("jinja2")?; @@ -5045,7 +5045,7 @@ fn trailing_slash() -> Result<()> { /// Resolve a project without a `pyproject.toml`, using the PEP 517 build backend. #[test] fn compile_legacy_sdist_pep_517() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("flake8 @ https://files.pythonhosted.org/packages/66/53/3ad4a3b74d609b3b9008a10075c40e7c8909eae60af53623c3888f7a529a/flake8-6.0.0.tar.gz")?; @@ -5076,7 +5076,7 @@ fn compile_legacy_sdist_pep_517() -> Result<()> { /// Include hashes from the registry in the generated output. #[test] fn generate_hashes_registry() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio==4.0.0")?; @@ -5112,7 +5112,7 @@ fn generate_hashes_registry() -> Result<()> { /// Include hashes from the URL in the generated output. #[test] fn generate_hashes_source_distribution_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio @ https://files.pythonhosted.org/packages/2d/b8/7333d87d5f03247215d86a86362fd3e324111788c6cdd8d2e6196a6ba833/anyio-4.2.0.tar.gz")?; @@ -5147,7 +5147,7 @@ fn generate_hashes_source_distribution_url() -> Result<()> { /// Include hashes from the URL in the generated output. #[test] fn generate_hashes_built_distribution_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio @ https://files.pythonhosted.org/packages/14/fd/2f20c40b45e4fb4324834aea24bd4afdf1143390242c0b33774da0e2e34f/anyio-4.3.0-py3-none-any.whl")?; @@ -5183,7 +5183,7 @@ fn generate_hashes_built_distribution_url() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn generate_hashes_git() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio @ git+https://github.com/agronholm/anyio@4.3.0")?; @@ -5217,7 +5217,7 @@ fn generate_hashes_git() -> Result<()> { /// Given an unnamed URL, include hashes for the URL and its dependencies. #[test] fn generate_hashes_unnamed_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("https://files.pythonhosted.org/packages/14/fd/2f20c40b45e4fb4324834aea24bd4afdf1143390242c0b33774da0e2e34f/anyio-4.3.0-py3-none-any.whl")?; @@ -5252,9 +5252,9 @@ fn generate_hashes_unnamed_url() -> Result<()> { /// Given a local directory, include hashes for its dependencies, but not the directory itself. #[test] fn generate_hashes_local_directory() -> Result<()> { - let _context = TestContext::new("3.12"); + let _context = uv_test::test_context!("3.12"); - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc! {r" ../../test/packages/poetry_editable @@ -5295,9 +5295,9 @@ fn generate_hashes_local_directory() -> Result<()> { /// Given an editable dependency, include hashes for its dependencies, but not the directory itself. #[test] fn generate_hashes_editable() -> Result<()> { - let _context = TestContext::new("3.12"); + let _context = uv_test::test_context!("3.12"); - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc! {r" -e ../../test/packages/poetry_editable @@ -5338,7 +5338,7 @@ fn generate_hashes_editable() -> Result<()> { /// Include hashes from a `--find-links` index in the generated output. #[test] fn generate_hashes_find_links_directory() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("tqdm")?; @@ -5367,7 +5367,7 @@ fn generate_hashes_find_links_directory() -> Result<()> { /// Include hashes from a `--find-links` index in the generated output. #[test] fn generate_hashes_find_links_url() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("tqdm")?; @@ -5397,7 +5397,7 @@ fn generate_hashes_find_links_url() -> Result<()> { /// Compile using `--find-links` with a local directory. #[test] fn find_links_directory() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc! {r" tqdm @@ -5433,7 +5433,7 @@ fn find_links_directory() -> Result<()> { /// Compile using `--find-links` with a URL by resolving `tqdm` from the PyTorch wheels index. #[test] fn find_links_url() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("tqdm")?; @@ -5461,7 +5461,7 @@ fn find_links_url() -> Result<()> { /// Compile using `--find-links` with a URL passed via an environment variable. #[test] fn find_links_env_var() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("tqdm\n--find-links ${URL}")?; @@ -5489,7 +5489,7 @@ fn find_links_env_var() -> Result<()> { /// with the URL itself provided in a `requirements.txt` file. #[test] fn find_links_requirements_txt() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in .write_str("-f https://astral-sh.github.io/pytorch-mirror/whl/torch_stable.html\ntqdm")?; @@ -5519,7 +5519,7 @@ fn find_links_requirements_txt() -> Result<()> { /// Compile using the `UV_FIND_LINKS` environment variable #[test] fn find_links_uv_env_var() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("tqdm")?; @@ -5548,7 +5548,7 @@ fn find_links_uv_env_var() -> Result<()> { /// requirement. #[test] fn avoid_irrelevant_extras() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc! {r" extras==0.0.1 @@ -5587,7 +5587,7 @@ fn avoid_irrelevant_extras() -> Result<()> { /// we'll end up with a broken build. #[test] fn avoid_irrelevant_recursive_extras() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create an editable package with an optional URL dependency. let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -5639,7 +5639,7 @@ coverage = ["example[test]", "extras>=0.0.1,<=0.0.2"] #[cfg(feature = "test-python-eol")] #[test] fn requires_python_prefetch() -> Result<()> { - let context = TestContext::new("3.8").with_exclude_newer("2025-01-01T00:00:00Z"); + let context = uv_test::test_context!("3.8").with_exclude_newer("2025-01-01T00:00:00Z"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("voluptuous<=0.15.1")?; @@ -5665,7 +5665,7 @@ fn requires_python_prefetch() -> Result<()> { /// Nothing should change. #[test] fn upgrade_none() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("black==23.10.1")?; @@ -5718,7 +5718,7 @@ fn upgrade_none() -> Result<()> { /// Both packages should be upgraded. #[test] fn upgrade_all() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("black==23.10.1")?; @@ -5774,7 +5774,7 @@ fn upgrade_all() -> Result<()> { /// Only `click` should be upgraded. #[test] fn upgrade_package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("black==23.10.1")?; @@ -5830,7 +5830,7 @@ fn upgrade_package() -> Result<()> { /// Upgrade a package with a constraint on the allowed upgrade. #[test] fn upgrade_constraint() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("iniconfig")?; @@ -5885,7 +5885,7 @@ fn upgrade_constraint() -> Result<()> { /// Attempt to resolve a requirement at a path that doesn't exist. #[test] fn missing_path_requirement() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(if cfg!(windows) { "anyio @ file://C:/tmp/anyio-3.7.0.tar.gz" @@ -5914,7 +5914,7 @@ fn missing_path_requirement() -> Result<()> { /// Attempt to resolve an editable requirement at a file path that doesn't exist. #[test] fn missing_editable_file() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("-e foo/anyio-3.7.0.tar.gz")?; @@ -5935,7 +5935,7 @@ fn missing_editable_file() -> Result<()> { /// Attempt to resolve an editable requirement at a directory path that doesn't exist. #[test] fn missing_editable_directory() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("-e foo/bar")?; @@ -5956,7 +5956,7 @@ fn missing_editable_directory() -> Result<()> { /// from the URL. #[test] fn unnamed_requirement_with_package_name() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("https://files.pythonhosted.org/packages/36/42/015c23096649b908c809c69388a805a571a3bea44362fe87e33fc3afa01f/flask-3.0.0-py3-none-any.whl")?; @@ -5995,7 +5995,7 @@ fn unnamed_requirement_with_package_name() -> Result<()> { /// Exclude annotations from the output. #[test] fn no_annotate() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("black==23.10.1")?; @@ -6025,7 +6025,7 @@ fn no_annotate() -> Result<()> { /// Exclude header from the output. #[test] fn no_header() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("black==23.10.1")?; @@ -6059,7 +6059,7 @@ fn no_header() -> Result<()> { /// Include custom compile command in the header. #[test] fn custom_compile_command() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("black==23.10.1")?; @@ -6123,7 +6123,7 @@ fn custom_compile_command() -> Result<()> { /// Emit warnings when users pass redundant options from `pip-compile`. #[test] fn allow_unsafe() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("werkzeug==3.0.1")?; @@ -6152,7 +6152,7 @@ fn allow_unsafe() -> Result<()> { /// Emit warnings when users pass redundant options from `pip-compile`. #[test] fn resolver_legacy() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("werkzeug==3.0.1")?; @@ -6174,7 +6174,7 @@ fn resolver_legacy() -> Result<()> { /// Avoid including the `--index` and `-i` flags in the header. #[test] fn hide_index_urls() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("iniconfig")?; @@ -6350,7 +6350,7 @@ fn hide_index_urls() -> Result<()> { /// `--extra-index-url` flags in the command in the header. #[test] fn emit_index_urls() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("iniconfig")?; @@ -6559,7 +6559,7 @@ fn emit_index_urls() -> Result<()> { /// Emit the `--find-links` locations. #[test] fn emit_find_links() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("black==23.10.1")?; @@ -6600,7 +6600,7 @@ fn emit_find_links() -> Result<()> { /// path should be preserved. #[test] fn emit_find_links_relative() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("-f ./\niniconfig")?; @@ -6628,7 +6628,7 @@ fn emit_find_links_relative() -> Result<()> { /// Emit the `--no-binary` and `--only-binary` options. #[test] fn emit_build_options() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("black==23.10.1")?; @@ -6671,7 +6671,7 @@ fn emit_build_options() -> Result<()> { /// Respect the `--no-index` flag in a `requirements.txt` file. #[test] fn no_index_requirements_txt() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("--no-index\ntqdm")?; @@ -6697,7 +6697,7 @@ fn no_index_requirements_txt() -> Result<()> { /// unless we specify `--emit-index-url`. #[test] fn index_url_requirements_txt() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("--index-url https://google.com\ntqdm")?; @@ -6724,7 +6724,7 @@ fn index_url_requirements_txt() -> Result<()> { /// Raise an error when multiple `requirements.txt` files include different `--index-url` flags. #[test] fn conflicting_index_urls_requirements_txt() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("--index-url https://google.com\ntqdm")?; @@ -6750,7 +6750,7 @@ fn conflicting_index_urls_requirements_txt() -> Result<()> { /// Doesn't raise an error when multiple `requirements.txt` files include matching `--index-url` flags. #[test] fn matching_index_urls_requirements_txt() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("--index-url https://pypi.org/simple")?; @@ -6778,7 +6778,7 @@ fn matching_index_urls_requirements_txt() -> Result<()> { /// Resolve a registry package without network access via the `--offline` flag. #[test] fn offline_registry() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("black==23.10.1")?; @@ -6858,7 +6858,7 @@ fn offline_registry() -> Result<()> { /// to the latest version of the package that's available in the cache. #[test] fn offline_registry_backtrack() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("iniconfig==1.1.1")?; @@ -6905,7 +6905,7 @@ fn offline_registry_backtrack() -> Result<()> { /// HTML registry. #[test] fn offline_find_links() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("tqdm")?; @@ -6954,7 +6954,7 @@ fn offline_find_links() -> Result<()> { /// Resolve a direct URL package without network access via the `--offline` flag. #[test] fn offline_direct_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("iniconfig @ https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl")?; @@ -7012,7 +7012,7 @@ fn offline_direct_url() -> Result<()> { /// `METADATA` file. #[test] fn invalid_metadata_requires_python() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("validation==2.0.0")?; @@ -7043,7 +7043,7 @@ fn invalid_metadata_requires_python() -> Result<()> { /// Resolve a package with multiple `.dist-info` directories. #[test] fn invalid_metadata_multiple_dist_info() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("validation==3.0.0")?; @@ -7072,7 +7072,7 @@ fn invalid_metadata_multiple_dist_info() -> Result<()> { /// Resolve a package, but backtrack past versions with invalid metadata. #[test] fn invalid_metadata_backtrack() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("validation")?; @@ -7102,7 +7102,7 @@ fn invalid_metadata_backtrack() -> Result<()> { /// Resolve nested `-r` requirements files with relative paths. #[test] fn compile_relative_subfile() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("-r subdir/requirements.in")?; @@ -7138,7 +7138,7 @@ fn compile_relative_subfile() -> Result<()> { /// Resolve a package with an invalid extra named `.none`. #[test] fn compile_none_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("entrypoints==0.3")?; @@ -7165,7 +7165,7 @@ fn compile_none_extra() -> Result<()> { /// See: #[test] fn compile_types_pytz() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("types-pytz")?; @@ -7196,7 +7196,7 @@ fn compile_types_pytz() -> Result<()> { /// ignored. #[test] fn compile_unnamed_preference() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("black")?; @@ -7237,7 +7237,7 @@ fn compile_unnamed_preference() -> Result<()> { /// to a specific URL. #[test] fn compile_constraints_compatible_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio>4")?; @@ -7274,7 +7274,7 @@ fn compile_constraints_compatible_url() -> Result<()> { /// pinning it to a specific version. #[test] fn compile_constraints_compatible_url_version() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio @ https://files.pythonhosted.org/packages/bf/cd/d6d9bb1dadf73e7af02d18225cbd2c93f8552e13130484f1c8dcfece292b/anyio-4.2.0-py3-none-any.whl")?; @@ -7311,7 +7311,7 @@ fn compile_constraints_compatible_url_version() -> Result<()> { /// a specific URL with an incompatible version. #[test] fn compile_constraints_incompatible_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio<4")?; @@ -7339,7 +7339,7 @@ fn compile_constraints_incompatible_url() -> Result<()> { /// `requirements.in` file. The resolution should fail, since the package doesn't exist at the #[test] fn index_url_in_requirements() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in .write_str("--index-url https://astral-sh.github.io/pytorch-mirror/whl\nanyio<4")?; @@ -7363,7 +7363,7 @@ fn index_url_in_requirements() -> Result<()> { /// command line over that in a `requirements.in` file. #[test] fn index_url_from_command_line() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in .write_str("--index-url https://astral-sh.github.io/pytorch-mirror/whl\nanyio<4")?; @@ -7396,7 +7396,7 @@ fn index_url_from_command_line() -> Result<()> { /// scheme. #[test] fn unsupported_scheme() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio @ bzr+https://example.com/anyio")?; @@ -7420,7 +7420,7 @@ fn unsupported_scheme() -> Result<()> { /// Resolve a package with `--no-deps`, including a valid extra. #[test] fn no_deps_valid_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("flask[dotenv]")?; @@ -7446,7 +7446,7 @@ fn no_deps_valid_extra() -> Result<()> { /// Resolve a package with `--no-deps`, including an invalid extra. We don't warn here. #[test] fn no_deps_invalid_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("flask[empty]")?; @@ -7474,7 +7474,7 @@ fn no_deps_invalid_extra() -> Result<()> { /// transitive dependencies. #[test] fn no_deps_transitive_conflict() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create an editable with a dependency on `anyio` at a dedicated URL. let editable_dir1 = context.temp_dir.child("editable1"); @@ -7542,7 +7542,7 @@ dependencies = [ /// Resolve an editable package with an invalid extra. #[test] fn editable_invalid_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("-e ../../test/packages/black_editable[empty]")?; @@ -7568,7 +7568,7 @@ fn editable_invalid_extra() -> Result<()> { /// Resolve a package with `--no-strip-extras`. #[test] fn no_strip_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("flask[dotenv]")?; @@ -7611,7 +7611,7 @@ fn no_strip_extra() -> Result<()> { #[test] #[cfg(not(windows))] fn no_strip_extras() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio[trio]\nanyio[doc]")?; @@ -7710,7 +7710,7 @@ fn no_strip_extras() -> Result<()> { /// Resolve a package with `--no-strip-markers`. #[test] fn no_strip_markers() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio ; python_version > '3.11'")?; @@ -7743,7 +7743,7 @@ fn no_strip_markers() -> Result<()> { /// multiple markers. #[test] fn no_strip_markers_multiple_markers() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" trio ; python_version > '3.11' @@ -7791,7 +7791,7 @@ fn no_strip_markers_multiple_markers() -> Result<()> { /// on its own requirements. #[test] fn no_strip_markers_transitive_marker() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("trio ; python_version > '3.11'")?; @@ -7835,7 +7835,7 @@ fn no_strip_markers_transitive_marker() -> Result<()> { /// Perform a universal resolution with a package that has a marker. #[test] fn universal() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" trio ; python_version > '3.11' @@ -7880,7 +7880,7 @@ fn universal() -> Result<()> { /// Perform a universal resolution with conflicting versions and markers. #[test] fn universal_conflicting() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" trio==0.25.0 ; sys_platform == 'darwin' @@ -7929,7 +7929,7 @@ fn universal_conflicting() -> Result<()> { /// Perform a universal resolution with a package that contains cycles in its dependency graph. #[test] fn universal_cycles() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" testtools==2.3.0 @@ -7987,7 +7987,7 @@ fn universal_cycles() -> Result<()> { /// Perform a universal resolution with a constraint. #[test] fn universal_constraint() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" anyio ; sys_platform == 'win32' @@ -8028,7 +8028,7 @@ fn universal_constraint() -> Result<()> { /// Perform a universal resolution with a constraint, where the constraint itself has a marker. #[test] fn universal_constraint_marker() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" anyio ; sys_platform == 'win32' @@ -8074,7 +8074,7 @@ fn universal_constraint_marker() -> Result<()> { /// See: #[test] fn universal_multi_version() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" iniconfig @@ -8112,7 +8112,7 @@ fn universal_multi_version() -> Result<()> { #[test] fn universal_platform_fork() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" --index-url https://astral-sh.github.io/pytorch-mirror/whl/cpu @@ -8174,7 +8174,7 @@ fn universal_platform_fork() -> Result<()> { /// Requested distinct local versions with disjoint markers. #[test] fn universal_disjoint_locals() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" --find-links https://astral-sh.github.io/pytorch-mirror/whl/torch_stable.html @@ -8232,7 +8232,7 @@ fn universal_disjoint_locals() -> Result<()> { /// that is also present as a transitive dependency. #[test] fn universal_transitive_disjoint_locals() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" --find-links https://astral-sh.github.io/pytorch-mirror/whl/torch_stable.html @@ -8313,7 +8313,7 @@ fn universal_transitive_disjoint_locals() -> Result<()> { /// Prefer local versions for dependencies of path requirements. #[test] fn universal_local_path_requirement() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -8384,7 +8384,7 @@ fn universal_local_path_requirement() -> Result<()> { /// we should prefer the local in both forks. #[test] fn universal_overlapping_local_requirement() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -8455,7 +8455,7 @@ fn universal_overlapping_local_requirement() -> Result<()> { /// we should fork the root requirement. #[test] fn universal_disjoint_local_requirement() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -8533,7 +8533,7 @@ fn universal_disjoint_local_requirement() -> Result<()> { /// expressions, we should fork the root requirement. #[test] fn universal_disjoint_base_or_local_requirement() -> Result<()> { - let context = TestContext::new("3.10").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.10").with_exclude_newer("2025-01-30T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -8617,7 +8617,7 @@ fn universal_disjoint_base_or_local_requirement() -> Result<()> { /// fork. #[test] fn universal_nested_overlapping_local_requirement() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -8778,7 +8778,7 @@ fn universal_nested_overlapping_local_requirement() -> Result<()> { /// that form a nested fork, we should create a nested fork. #[test] fn universal_nested_disjoint_local_requirement() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -8871,7 +8871,7 @@ fn universal_nested_disjoint_local_requirement() -> Result<()> { /// Respect an existing pre-release preference, even if preferences aren't enabled. #[test] fn existing_prerelease_preference() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2024-07-17T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2024-07-17T00:00:00Z"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" cffi @@ -8908,7 +8908,7 @@ fn existing_prerelease_preference() -> Result<()> { /// Requested distinct pre-release strategies with disjoint markers. #[test] fn universal_disjoint_prereleases() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2024-07-17T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2024-07-17T00:00:00Z"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" cffi >= 1.16.0rc1 ; os_name != 'linux' @@ -8939,7 +8939,7 @@ fn universal_disjoint_prereleases() -> Result<()> { /// Requested distinct pre-release strategies with disjoint markers. #[test] fn universal_disjoint_prereleases_preference() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2024-07-17T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2024-07-17T00:00:00Z"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" cffi ; os_name != 'linux' @@ -8980,7 +8980,7 @@ fn universal_disjoint_prereleases_preference() -> Result<()> { /// TODO(charlie): This should resolve to two different `cffi` versions, one for each fork. #[test] fn universal_disjoint_prereleases_preference_marker() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2024-07-17T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2024-07-17T00:00:00Z"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" cffi ; os_name != 'linux' @@ -9021,7 +9021,7 @@ fn universal_disjoint_prereleases_preference_marker() -> Result<()> { /// doesn't include a pre-release marker. #[test] fn universal_disjoint_prereleases_allow() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2024-07-17T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2024-07-17T00:00:00Z"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" cffi >= 1.15.0, < 1.17.0 ; os_name == 'linux' @@ -9057,7 +9057,7 @@ fn universal_disjoint_prereleases_allow() -> Result<()> { /// that is also present as a transitive dependency. #[test] fn universal_transitive_disjoint_prerelease_requirement() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2024-07-17T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2024-07-17T00:00:00Z"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" cffi ; os_name == 'linux' @@ -9097,7 +9097,7 @@ fn universal_transitive_disjoint_prerelease_requirement() -> Result<()> { /// Ensure that the global pre-release mode is respected across forks. #[test] fn universal_prerelease_mode() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2024-07-17T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2024-07-17T00:00:00Z"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" cffi ; os_name == 'linux' @@ -9130,7 +9130,7 @@ fn universal_prerelease_mode() -> Result<()> { /// we should prefer the pre-release version in both forks. #[test] fn universal_overlapping_prerelease_requirement() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2024-07-17T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2024-07-17T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -9178,7 +9178,7 @@ fn universal_overlapping_prerelease_requirement() -> Result<()> { /// we should fork the root requirement. #[test] fn universal_disjoint_prerelease_requirement() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2024-07-17T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2024-07-17T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -9233,7 +9233,7 @@ fn universal_disjoint_prerelease_requirement() -> Result<()> { /// fork branches. #[test] fn universal_requires_python() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" numpy >=1.26 ; python_version >= '3.9' @@ -9267,7 +9267,7 @@ fn universal_requires_python() -> Result<()> { /// Perform a universal resolution that requires narrowing the supported Python range in a non-fork. #[test] fn universal_requires_python_incomplete() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" uv; python_version >= '3.8' @@ -9303,7 +9303,7 @@ fn universal_requires_python_incomplete() -> Result<()> { /// [3]: https://github.com/astral-sh/uv/pull/5597 #[test] fn universal_no_repeated_unconditional_distributions_1() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" pylint @@ -9421,7 +9421,7 @@ fn universal_no_repeated_unconditional_distributions_1() -> Result<()> { /// [1]: https://github.com/astral-sh/uv/issues/6064 #[test] fn universal_no_repeated_unconditional_distributions_2() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" pylint @@ -9474,7 +9474,7 @@ fn universal_no_repeated_unconditional_distributions_2() -> Result<()> { /// can also work for `pylint > 2`, but the inverse isn't true (due to maximum version selection). #[test] fn universal_prefer_upper_bounds() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" pylint < 3 ; sys_platform == 'darwin' @@ -9530,7 +9530,7 @@ fn universal_prefer_upper_bounds() -> Result<()> { /// Remove `python_version` markers that are always true. #[test] fn universal_unnecessary_python() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" iniconfig ; python_version >= '3.7' @@ -9571,7 +9571,7 @@ fn universal_unnecessary_python() -> Result<()> { /// See: #[test] fn universal_marker_propagation() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" --find-links https://astral-sh.github.io/pytorch-mirror/whl/torch_stable.html @@ -9664,7 +9664,7 @@ fn universal_marker_propagation() -> Result<()> { #[test] fn universal_disjoint_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" flask[async]; sys_platform == 'linux' @@ -9710,7 +9710,7 @@ fn universal_disjoint_extra() -> Result<()> { #[test] fn universal_disjoint_extra_no_strip() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" flask[async]; sys_platform == 'linux' @@ -9761,7 +9761,7 @@ fn universal_disjoint_extra_no_strip() -> Result<()> { #[test] fn universal_overlap_extra_base() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" flask @@ -9807,7 +9807,7 @@ fn universal_overlap_extra_base() -> Result<()> { #[test] fn universal_overlap_extra_base_no_strip() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" flask @@ -9856,7 +9856,7 @@ fn universal_overlap_extra_base_no_strip() -> Result<()> { #[test] fn universal_overlap_extras() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" flask[async]; sys_platform == 'linux' or sys_platform == 'darwin' @@ -9902,7 +9902,7 @@ fn universal_overlap_extras() -> Result<()> { #[test] fn universal_overlap_extras_no_strip() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" flask[async]; sys_platform == 'linux' or sys_platform == 'darwin' @@ -9951,7 +9951,7 @@ fn universal_overlap_extras_no_strip() -> Result<()> { #[test] fn universal_identical_extras() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" flask[async]; sys_platform == 'darwin' @@ -9997,7 +9997,7 @@ fn universal_identical_extras() -> Result<()> { #[test] fn universal_identical_extras_no_strip() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" flask[async]; sys_platform == 'darwin' @@ -10046,7 +10046,7 @@ fn universal_identical_extras_no_strip() -> Result<()> { /// its transitive dependencies to a specific version. #[test] fn compile_constraints_compatible_version() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("virtualenv")?; @@ -10085,7 +10085,7 @@ fn compile_constraints_compatible_version() -> Result<()> { /// its direct dependencies to an incompatible version. #[test] fn compile_constraints_incompatible_version() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("filelock==1.0.0")?; @@ -10113,7 +10113,7 @@ fn compile_constraints_incompatible_version() -> Result<()> { /// its direct dependencies to an incompatible version. #[test] fn conflicting_url_markers() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("filelock==1.0.0")?; @@ -10140,7 +10140,7 @@ fn conflicting_url_markers() -> Result<()> { /// Override a regular package with an editable. This should resolve to the editable package. #[test] fn editable_override() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Add a non-editable requirement. let requirements_in = context.temp_dir.child("requirements.in"); @@ -10176,7 +10176,7 @@ fn editable_override() -> Result<()> { /// Override an editable with a regular package. This should resolve to the regular package. #[test] fn override_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("-e ../../test/packages/black_editable")?; @@ -10219,7 +10219,7 @@ fn override_editable() -> Result<()> { /// compatible, but resolve to exactly the same version. #[test] fn override_with_compatible_constraint() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio")?; @@ -10262,7 +10262,7 @@ fn override_with_compatible_constraint() -> Result<()> { /// incompatible, and so should error. (The correctness of this behavior is subject to debate.) #[test] fn override_with_incompatible_constraint() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio")?; @@ -10294,7 +10294,7 @@ fn override_with_incompatible_constraint() -> Result<()> { /// Resolve a package, marking a dependency as unsafe. #[test] fn unsafe_package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("flask")?; @@ -10339,7 +10339,7 @@ fn unsafe_package() -> Result<()> { /// that match the bound (e.g., `2.0.0rc1`) should be _not_ allowed. #[test] fn prerelease_upper_bound_exclude() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("flask<2.0.0")?; @@ -10376,7 +10376,7 @@ fn prerelease_upper_bound_exclude() -> Result<()> { /// pre-releases _should_ be allowed. #[test] fn prerelease_upper_bound_include() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("flask<2.0.0rc4")?; @@ -10414,7 +10414,7 @@ fn prerelease_upper_bound_include() -> Result<()> { /// Allow `--pre` as an alias for `--prerelease=allow`. #[test] fn pre_alias() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("flask<2.0.0")?; @@ -10450,7 +10450,7 @@ fn pre_alias() -> Result<()> { /// Allow a pre-release for a version specifier in a constraint file. #[test] fn prerelease_constraint() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("flask")?; @@ -10494,7 +10494,7 @@ fn prerelease_constraint() -> Result<()> { /// Resolve from a `pyproject.toml` file with a mutually recursive extra. #[test] fn compile_pyproject_toml_mutually_recursive_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#" @@ -10545,7 +10545,7 @@ dev = [ /// Resolve from a `pyproject.toml` file with a recursive extra. #[test] fn compile_pyproject_toml_recursive_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#" @@ -10595,7 +10595,7 @@ dev = [ /// Resolve from a `pyproject.toml` file with a recursive extra, with a marker attached. #[test] fn compile_pyproject_toml_recursive_extra_marker() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#" @@ -10646,7 +10646,7 @@ dev = [ /// Resolve from a `pyproject.toml` file with multiple recursive extras. #[test] fn compile_pyproject_toml_deeply_recursive_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#" @@ -10725,7 +10725,7 @@ qux = ["project[bop] ; python_version == '3.12'"] /// The dependencies of a local editable dependency should be considered "direct" dependencies. #[test] fn editable_direct_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("-e ../../test/packages/setuptools_editable")?; @@ -10754,7 +10754,7 @@ fn editable_direct_dependency() -> Result<()> { /// Setting `UV_INDEX_URL` to the empty string should treat it as "unset". #[test] fn empty_index_url_env_var() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio")?; @@ -10787,7 +10787,7 @@ fn empty_index_url_env_var() -> Result<()> { /// Setting `EXTRA_UV_INDEX_URL` to the empty string should treat it as "unset". #[test] fn empty_extra_index_url_env_var() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio")?; @@ -10821,7 +10821,7 @@ fn empty_extra_index_url_env_var() -> Result<()> { /// overridden by an `--index-url` in a requirements file. #[test] fn empty_index_url_env_var_override() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("--index-url https://test.pypi.org/simple\nidna")?; @@ -10850,7 +10850,7 @@ fn empty_index_url_env_var_override() -> Result<()> { /// The `UV_INDEX_URL` should override an `--index-url` in a requirements file. #[test] fn index_url_env_var_override() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("--index-url https://pypi.org/simple\nidna")?; @@ -10879,7 +10879,7 @@ fn index_url_env_var_override() -> Result<()> { /// Expand an environment variable in a `-r` path within a `requirements.in` file. #[test] fn expand_env_var_requirements_txt() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("-r ${PROJECT_ROOT}/requirements-dev.in")?; @@ -10912,7 +10912,7 @@ fn expand_env_var_requirements_txt() -> Result<()> { /// Raise an error when an editable's `Requires-Python` constraint is not met. #[test] fn requires_python_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create an editable package with a `Requires-Python` constraint that is not met. let editable_dir = context.temp_dir.child("editable"); @@ -10952,7 +10952,7 @@ requires-python = ">=3.13" /// Raise an error when an editable's `Requires-Python` constraint is not met. #[test] fn requires_python_editable_target_version() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create an editable package with a `Requires-Python` constraint that is not met. let editable_dir = context.temp_dir.child("editable"); @@ -11003,7 +11003,7 @@ requires-python = ">=3.13" #[test] fn editable_optional_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create an editable package with an optional URL dependency. let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -11054,7 +11054,7 @@ dev = [ /// In the below example, ensure that `setuptools` does not resolve to the lowest-available version. #[test] fn editable_optional_lowest_direct() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create an editable package with an optional URL dependency. let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -11102,7 +11102,7 @@ dev = ["setuptools"] /// Resolve a source distribution that leverages Metadata 2.2. #[test] fn metadata_2_2() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("pyo3-mixed @ https://files.pythonhosted.org/packages/2b/b8/e04b783d3569d5b61b1dcdfda683ac2e3617340539aecd0f099fbade0b4a/pyo3_mixed-2.1.5.tar.gz")?; @@ -11129,7 +11129,7 @@ fn metadata_2_2() -> Result<()> { /// Resolve a direct URL package with a URL that doesn't exist (i.e., returns a 404). #[test] fn not_found_direct_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("iniconfig @ https://files.pythonhosted.org/packages/ef/a6/fake/iniconfig-2.0.0-py3-none-any.whl")?; @@ -11152,7 +11152,7 @@ fn not_found_direct_url() -> Result<()> { /// Raise an error when a direct URL dependency's `Requires-Python` constraint is not met. #[test] fn requires_python_direct_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create an editable package with a `Requires-Python` constraint that is not met. let editable_dir = context.temp_dir.child("editable"); @@ -11192,7 +11192,7 @@ requires-python = ">=3.13" /// Build an editable package with Hatchling's {root:uri} feature. #[test] fn compile_root_uri_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("-e ${ROOT_PATH}")?; @@ -11222,7 +11222,7 @@ fn compile_root_uri_editable() -> Result<()> { /// Build a non-editable package with Hatchling's {root:uri} feature. #[test] fn compile_root_uri_non_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("${ROOT_PATH}\n${BLACK_PATH}")?; @@ -11256,7 +11256,7 @@ fn compile_root_uri_non_editable() -> Result<()> { /// Request a local wheel with a mismatched package name. #[test] fn requirement_wheel_name_mismatch() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("dateutil @ https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl")?; @@ -11279,7 +11279,7 @@ fn requirement_wheel_name_mismatch() -> Result<()> { /// upgraded. #[test] fn preserve_hashes_no_upgrade() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("markupsafe")?; @@ -11323,7 +11323,7 @@ fn preserve_hashes_no_upgrade() -> Result<()> { /// `--upgrade`. #[test] fn preserve_hashes_upgrade() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("markupsafe==2.1.2")?; @@ -11415,7 +11415,7 @@ fn preserve_hashes_upgrade() -> Result<()> { /// hashes, even if `--upgrade` is _not_ specified. #[test] fn preserve_hashes_no_existing_hashes() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("markupsafe")?; @@ -11503,7 +11503,7 @@ fn preserve_hashes_no_existing_hashes() -> Result<()> { /// to a change in requirements. #[test] fn preserve_hashes_newer_version() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("markupsafe==2.1.3")?; @@ -11603,7 +11603,7 @@ fn preserve_hashes_newer_version() -> Result<()> { /// Detect the package name from metadata sources from local directories. #[test] fn unnamed_path_requirement() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc! {r" ../../test/packages/poetry_editable @@ -11671,7 +11671,7 @@ fn unnamed_path_requirement() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn unnamed_git_requirement() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("git+https://github.com/pallets/flask.git@3.0.0")?; @@ -11710,7 +11710,7 @@ fn unnamed_git_requirement() -> Result<()> { #[test] fn unnamed_https_requirement() -> Result<()> { // Given the filename `3.0.2.tar.gz`, we need to download the file to determine the package name. - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("https://github.com/pallets/flask/archive/refs/tags/3.0.2.tar.gz")?; @@ -11748,7 +11748,7 @@ fn unnamed_https_requirement() -> Result<()> { /// Detect the package name from metadata sources from local directories. #[test] fn dynamic_dependencies() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("hatchling-dynamic @ ../../test/packages/hatchling_dynamic")?; @@ -11781,7 +11781,7 @@ fn dynamic_dependencies() -> Result<()> { #[cfg(feature = "test-python-patch")] #[test] fn emit_marker_expression_exciting_linux() -> Result<()> { - let context = TestContext::new("3.12.9"); + let context = uv_test::test_context!("3.12.9"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio")?; @@ -11817,7 +11817,7 @@ fn emit_marker_expression_exciting_linux() -> Result<()> { #[cfg(feature = "test-python-patch")] #[test] fn emit_marker_expression_direct() -> Result<()> { - let context = TestContext::new("3.12.9"); + let context = uv_test::test_context!("3.12.9"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio ; sys_platform == 'linux'")?; @@ -11856,7 +11856,7 @@ fn emit_marker_expression_direct() -> Result<()> { /// different (and indeed are different) on other platforms. #[test] fn emit_marker_expression_conditional() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio ; sys_platform == 'macos'")?; @@ -11887,7 +11887,7 @@ fn emit_marker_expression_conditional() -> Result<()> { #[cfg(feature = "test-python-patch")] #[test] fn emit_marker_expression_pypy() -> Result<()> { - let context = TestContext::new("3.12.9"); + let context = uv_test::test_context!("3.12.9"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("pendulum")?; @@ -11927,7 +11927,7 @@ fn emit_marker_expression_pypy() -> Result<()> { /// A local version of a package shadowing a remote package is installed. #[test] fn local_version_of_remote_package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let root_path = context.workspace_root.join("test/packages"); let requirements_in = context.temp_dir.child("requirements.in"); @@ -12025,7 +12025,7 @@ fn local_version_of_remote_package() -> Result<()> { #[test] fn pendulum_no_tzdata_on_windows() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("pendulum")?; @@ -12061,7 +12061,7 @@ fn pendulum_no_tzdata_on_windows() -> Result<()> { /// Allow URL dependencies recursively for local source trees. #[test] fn allow_recursive_url_local_path() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a standalone library named "anyio". let anyio = context.temp_dir.child("anyio"); @@ -12141,7 +12141,7 @@ requires-python = ">3.8" /// Allow URL dependencies recursively for local source trees, but respect overrides. #[test] fn allow_recursive_url_local_path_override() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a standalone library named "anyio". let anyio = context.temp_dir.child("anyio"); @@ -12234,7 +12234,7 @@ requires-python = ">3.8" /// We have app -> lib -> anyio and root has a directory requirement on app. #[test] fn allow_recursive_url_local_path_override_constraint() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a standalone library named "anyio". let anyio = context.temp_dir.child("anyio"); @@ -12346,7 +12346,7 @@ requires-python = ">3.8" /// Allow pre-releases for dependencies of source path requirements. #[test] fn prerelease_path_requirement() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a package that requires a pre-release version of `flask`. let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -12400,7 +12400,7 @@ requires-python = ">3.8" /// Allow pre-releases for dependencies of editable requirements. #[test] fn prerelease_editable_requirement() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a package that requires a pre-release version of `flask`.r let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -12457,7 +12457,7 @@ requires-python = ">3.8" /// should fail by default (even though a compatible version exists on the "primary" index). #[test] fn compile_index_url_first_match_base() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("jinja2==3.1.0")?; @@ -12490,7 +12490,7 @@ fn compile_index_url_first_match_base() -> Result<()> { /// should fail by default (even though a compatible version exists on the "primary" index). #[test] fn compile_index_url_first_match_marker() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("jinja2==3.1.0 ; sys_platform == 'linux'")?; @@ -12524,7 +12524,7 @@ fn compile_index_url_first_match_marker() -> Result<()> { /// should fail by default (even though a compatible version exists on the "primary" index). #[test] fn compile_index_url_first_match_all_versions() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("pandas")?; @@ -12556,7 +12556,7 @@ fn compile_index_url_first_match_all_versions() -> Result<()> { /// is provided. #[test] fn compile_index_url_fallback() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("jinja2==3.1.0")?; @@ -12596,7 +12596,7 @@ fn compile_index_url_fallback() -> Result<()> { /// preferred index. #[test] fn compile_index_url_fallback_prefer_primary() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio")?; @@ -12636,7 +12636,7 @@ fn compile_index_url_fallback_prefer_primary() -> Result<()> { /// "extra" index being the preferred index. #[test] fn compile_index_url_unsafe_highest() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio")?; @@ -12679,7 +12679,7 @@ fn compile_index_url_unsafe_highest() -> Result<()> { /// `--resolution lowest`. #[test] fn compile_index_url_unsafe_lowest() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio<100")?; @@ -12716,7 +12716,7 @@ fn compile_index_url_unsafe_lowest() -> Result<()> { /// index annotations are displayed via `--emit-index-annotation`. #[test] fn emit_index_annotation_hide_password() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("requests")?; @@ -12757,7 +12757,7 @@ fn emit_index_annotation_hide_password() -> Result<()> { /// Ensure that `--emit-index-annotation` prints the index URL for each package. #[test] fn emit_index_annotation_pypi_org_simple() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("requests")?; @@ -12800,7 +12800,7 @@ fn emit_index_annotation_pypi_org_simple() -> Result<()> { /// index annotation, and leave `--no-annotate` to only affect the package _source_ annotations. #[test] fn emit_index_annotation_no_annotate() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("requests")?; @@ -12836,7 +12836,7 @@ fn emit_index_annotation_no_annotate() -> Result<()> { /// Ensure that `--emit-index-annotation` plays nicely with `--annotation-style=line`. #[test] fn emit_index_annotation_line() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("requests")?; @@ -12873,7 +12873,7 @@ fn emit_index_annotation_line() -> Result<()> { /// `--emit-index-annotation` where packages are pulled from two distinct indexes. #[test] fn emit_index_annotation_multiple_indexes() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("httpcore\nrequests")?; @@ -12912,7 +12912,7 @@ fn emit_index_annotation_multiple_indexes() -> Result<()> { /// Test error message when direct dependency is an empty set. #[test] fn no_version_for_direct_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("pypyp==1,>=1.2")?; @@ -12937,7 +12937,7 @@ fn no_version_for_direct_dependency() -> Result<()> { /// Compile against a dedicated platform, which may differ from the current platform. #[test] fn python_platform() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("black")?; @@ -13009,7 +13009,7 @@ fn python_platform() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn git_source_default_branch() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -13051,7 +13051,7 @@ fn git_source_default_branch() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn git_source_branch() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -13087,7 +13087,7 @@ fn git_source_branch() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn git_source_tag() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -13123,7 +13123,7 @@ fn git_source_tag() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn git_source_long_commit() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -13159,7 +13159,7 @@ fn git_source_long_commit() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn git_source_short_commit() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -13195,7 +13195,7 @@ fn git_source_short_commit() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn git_source_refs() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -13232,7 +13232,7 @@ fn git_source_refs() -> Result<()> { #[cfg(feature = "test-git")] #[cfg_attr(windows, ignore = "Git error messages differ on Windows")] fn git_source_missing_tag() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let mut filters = context.filters(); filters.push(("`.*/git fetch (.*)`", "`git fetch $1`")); @@ -13271,7 +13271,7 @@ fn git_source_missing_tag() -> Result<()> { #[test] fn warn_missing_constraint() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -13313,7 +13313,7 @@ fn warn_missing_constraint() -> Result<()> { /// Ensure that this behavior is constraint to preview mode. #[test] fn dont_warn_missing_constraint_without_sources() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -13352,7 +13352,7 @@ fn dont_warn_missing_constraint_without_sources() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn tool_uv_sources() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Use a subdir to test path normalization. let require_path = "some_dir/pyproject.toml"; let pyproject_toml = context.temp_dir.child(require_path); @@ -13431,7 +13431,7 @@ fn tool_uv_sources() -> Result<()> { #[test] fn invalid_tool_uv_sources() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Write an invalid extension on a PEP 508 URL. let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -13490,7 +13490,7 @@ fn invalid_tool_uv_sources() -> Result<()> { /// Check that a dynamic `pyproject.toml` is supported a compile input file. #[test] fn dynamic_pyproject_toml() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" [project] @@ -13522,7 +13522,7 @@ fn dynamic_pyproject_toml() -> Result<()> { /// Accept `file://` URLs as installation sources. #[test] fn file_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements file.txt"); requirements_txt.write_str("iniconfig")?; @@ -13548,7 +13548,7 @@ fn file_url() -> Result<()> { /// Allow `--no-binary` to override `--only-binary`, to allow select source distributions. #[test] fn no_binary_only_binary() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-29T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-29T00:00:00Z"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("source-distribution<=0.0.1")?; @@ -13597,7 +13597,7 @@ fn no_binary_only_binary() -> Result<()> { /// the nonsensical extra. #[test] fn ignore_invalid_constraint() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("gunicorn>=20")?; @@ -13631,7 +13631,7 @@ fn ignore_invalid_constraint() -> Result<()> { /// Include a `build_constraints.txt` file with an incompatible constraint. #[test] fn incompatible_build_constraint() -> Result<()> { - let context = TestContext::new(DEFAULT_PYTHON_VERSION); + let context = uv_test::test_context!(DEFAULT_PYTHON_VERSION); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("requests==1.2")?; @@ -13660,7 +13660,7 @@ fn incompatible_build_constraint() -> Result<()> { /// Include a `build_constraints.txt` file with a compatible constraint. #[test] fn compatible_build_constraint() -> Result<()> { - let context = TestContext::new("3.9"); + let context = uv_test::test_context!("3.9"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("requests==1.2")?; @@ -13690,7 +13690,7 @@ fn compatible_build_constraint() -> Result<()> { /// Include `build-constraint-dependencies` in pyproject.toml with an incompatible constraint. #[test] fn incompatible_build_constraint_in_pyproject_toml() -> Result<()> { - let context = TestContext::new(DEFAULT_PYTHON_VERSION); + let context = uv_test::test_context!(DEFAULT_PYTHON_VERSION); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#"[build-system] @@ -13731,7 +13731,7 @@ build-constraint-dependencies = [ #[cfg(feature = "test-python-eol")] #[test] fn compatible_build_constraint_in_pyproject_toml() -> Result<()> { - let context = TestContext::new("3.8"); + let context = uv_test::test_context!("3.8"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#"[build-system] @@ -13772,7 +13772,7 @@ build-constraint-dependencies = [ /// Merge `build_constraints.txt` with `build-constraint-dependencies` in pyproject.toml with an incompatible constraint. #[test] fn incompatible_build_constraint_merged_with_pyproject_toml() -> Result<()> { - let context = TestContext::new(DEFAULT_PYTHON_VERSION); + let context = uv_test::test_context!(DEFAULT_PYTHON_VERSION); // incompatible setuptools version in pyproject.toml, compatible in build_constraints.txt let constraints_txt = context.temp_dir.child("build_constraints.txt"); @@ -13857,7 +13857,7 @@ build-constraint-dependencies = [ /// Merge CLI args `build_constraints.txt` with `build-constraint-dependencies` in pyproject.toml with a compatible constraint. #[test] fn compatible_build_constraint_merged_with_pyproject_toml() -> Result<()> { - let context = TestContext::new("3.9"); + let context = uv_test::test_context!("3.9"); // incompatible setuptools version in pyproject.toml, compatible in build_constraints.txt let constraints_txt = context.temp_dir.child("build_constraints.txt"); @@ -13945,7 +13945,7 @@ build-constraint-dependencies = [ /// non-spec-compliant extras. #[test] fn invalid_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let setup_py = context.temp_dir.child("setup.py"); setup_py.write_str(indoc! {r#" @@ -14023,7 +14023,7 @@ fn invalid_extra() -> Result<()> { #[test] #[cfg(not(windows))] fn symlink() -> Result<()> { - let context = TestContext::new(DEFAULT_PYTHON_VERSION); + let context = uv_test::test_context!(DEFAULT_PYTHON_VERSION); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio")?; @@ -14070,7 +14070,7 @@ fn symlink() -> Result<()> { /// environments. #[test] fn universal_constrained_environment() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -14118,7 +14118,7 @@ fn universal_constrained_environment() -> Result<()> { /// Resolve a package that has no versions that satisfy the current Python version. #[test] fn compile_enumerate_no_versions() -> Result<()> { - let context = TestContext::new("3.10").with_exclude_newer("2024-12-01"); + let context = uv_test::test_context!("3.10").with_exclude_newer("2024-12-01"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("rooster-blue")?; @@ -14142,7 +14142,7 @@ fn compile_enumerate_no_versions() -> Result<()> { /// otherwise doesn't include static metadata. #[test] fn compile_requires_txt() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("flask @ https://files.pythonhosted.org/packages/36/70/2234ee8842148cef44261c2cebca3a6384894bce6112b73b18693cdcc62f/Flask-1.0.4.tar.gz")?; @@ -14179,7 +14179,7 @@ fn compile_requires_txt() -> Result<()> { /// Regression test for: #[test] fn astroid_not_repeated() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str( @@ -14316,7 +14316,7 @@ exceptiongroup==1.0.0rc8 /// Regression test for: #[test] fn tomli_less_than_python311() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str( @@ -14426,7 +14426,7 @@ matplotlib /// Regression test for: #[test] fn importlib_metadata_not_repeated() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("build")?; @@ -14488,7 +14488,7 @@ fn importlib_metadata_not_repeated() -> Result<()> { /// Regression test for: #[test] fn prune_unreachable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("argcomplete ; python_version >= '3.8'")?; @@ -14534,7 +14534,7 @@ fn prune_unreachable() -> Result<()> { /// See: #[test] fn unsupported_requires_python_static_metadata() -> Result<()> { - let context = TestContext::new("3.11").with_exclude_newer("2024-11-04T00:00:00Z"); + let context = uv_test::test_context!("3.11").with_exclude_newer("2024-11-04T00:00:00Z"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("interpreters-pep-734 <= 0.4.1 ; python_version >= '3.13'")?; @@ -14564,7 +14564,7 @@ fn unsupported_requires_python_static_metadata() -> Result<()> { #[cfg(feature = "test-python-eol")] #[test] fn unsupported_requires_python_dynamic_metadata() -> Result<()> { - let context = TestContext::new("3.8").with_exclude_newer("2024-11-04T00:00:00Z"); + let context = uv_test::test_context!("3.8").with_exclude_newer("2024-11-04T00:00:00Z"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("source-distribution==0.0.3 ; python_version >= '3.10'")?; @@ -14590,7 +14590,7 @@ fn unsupported_requires_python_dynamic_metadata() -> Result<()> { #[test] fn negation_not_imply_prerelease() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("flask<2.0.1, !=2.0.0rc1")?; @@ -14626,7 +14626,7 @@ fn negation_not_imply_prerelease() -> Result<()> { #[test] fn lowest_direct_fork_min_python() -> Result<()> { - let context = TestContext::new("3.10"); + let context = uv_test::test_context!("3.10"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" pycountry >= 22.1.10 @@ -14664,7 +14664,7 @@ fn lowest_direct_fork_min_python() -> Result<()> { #[test] fn lowest_fork_min_python() -> Result<()> { - let context = TestContext::new("3.10"); + let context = uv_test::test_context!("3.10"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" anyio >= 3.0.0 @@ -14704,7 +14704,7 @@ fn lowest_fork_min_python() -> Result<()> { #[test] fn lowest_direct_fork_max_python() -> Result<()> { - let context = TestContext::new("3.10"); + let context = uv_test::test_context!("3.10"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" pycountry >= 22.1.10 @@ -14738,7 +14738,7 @@ fn lowest_direct_fork_max_python() -> Result<()> { #[test] fn lowest_fork_max_python() -> Result<()> { - let context = TestContext::new("3.10"); + let context = uv_test::test_context!("3.10"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" pycountry >= 22.1.10 @@ -14773,7 +14773,7 @@ fn lowest_fork_max_python() -> Result<()> { /// See: #[test] fn same_version_multi_index_incompatibility() -> Result<()> { - let context = TestContext::new("3.10"); + let context = uv_test::test_context!("3.10"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("cffi==1.15.1")?; @@ -14810,7 +14810,7 @@ fn same_version_multi_index_incompatibility() -> Result<()> { /// Show the derivation chain on build failure. #[test] fn compile_derivation_chain() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.child("child"); child.child("pyproject.toml").write_str( @@ -14881,7 +14881,7 @@ fn compile_derivation_chain() -> Result<()> { /// See: #[test] fn invalid_platform() -> Result<()> { - let context = TestContext::new("3.10"); + let context = uv_test::test_context!("3.10"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("open3d")?; @@ -14927,7 +14927,7 @@ fn invalid_platform() -> Result<()> { /// Treat `sys_platform` and `sys.platform` as equivalent markers in the marker algebra. #[test] fn universal_disjoint_deprecated_markers() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" anyio ; sys_platform == 'win32' and sys.platform == 'win32' @@ -14959,7 +14959,7 @@ fn universal_disjoint_deprecated_markers() -> Result<()> { #[test] fn universal_disjoint_override_urls() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" anyio @@ -15004,7 +15004,7 @@ fn universal_disjoint_override_urls() -> Result<()> { #[test] fn universal_conflicting_override_urls() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" anyio @@ -15038,7 +15038,7 @@ fn universal_conflicting_override_urls() -> Result<()> { #[test] fn compile_lowest_extra_unpinned_warning() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" @@ -15082,7 +15082,7 @@ fn compile_lowest_extra_unpinned_warning() -> Result<()> { #[cfg(feature = "test-python-eol")] #[test] fn disjoint_requires_python() -> Result<()> { - let context = TestContext::new("3.8").with_exclude_newer("2025-01-29T00:00:00Z"); + let context = uv_test::test_context!("3.8").with_exclude_newer("2025-01-29T00:00:00Z"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" @@ -15119,7 +15119,7 @@ fn disjoint_requires_python() -> Result<()> { /// `test_dynamic_version_sdist_wrong_version` checks that this version must be correct. #[test] fn dynamic_version_source_dist() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Write a source dist that has a version in its name, a dynamic version in pyproject.toml // and check that we don't build it when compiling. @@ -15183,7 +15183,7 @@ fn dynamic_version_source_dist() -> Result<()> { #[cfg(feature = "test-python-eol")] #[test] fn max_python_requirement() -> Result<()> { - let context = TestContext::new("3.8").with_exclude_newer("2024-12-18T00:00:00Z"); + let context = uv_test::test_context!("3.8").with_exclude_newer("2024-12-18T00:00:00Z"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc::indoc! {r" nox >=2024.04.15 @@ -15316,7 +15316,7 @@ fn max_python_requirement() -> Result<()> { /// See: #[test] fn respect_index_preference() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc::indoc! {r#" [project] @@ -15365,7 +15365,7 @@ fn respect_index_preference() -> Result<()> { fn dependency_group() -> Result<()> { // uv pip compile --group tests, with a single pyproject.toml fn new_context() -> Result { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -15542,7 +15542,7 @@ fn dependency_group() -> Result<()> { fn many_pyproject_group() -> Result<()> { // uv pip compile --group tests, with multiple pyproject.tomls at once fn new_context() -> Result { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -15637,7 +15637,7 @@ fn suspicious_group() -> Result<()> { // uv pip compile --group tests, where the invocations are suspicious // and we might want to add warnings fn new_context() -> Result { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -15762,7 +15762,7 @@ fn suspicious_group() -> Result<()> { fn invalid_group() -> Result<()> { // uv pip compile --group tests, where the invocations should fail fn new_context() -> Result { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -15858,7 +15858,7 @@ fn invalid_group() -> Result<()> { fn project_and_group_workspace_inherit() -> Result<()> { // Checking that --project is handled properly with --group fn new_context() -> Result { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -15957,7 +15957,7 @@ fn project_and_group_workspace_inherit() -> Result<()> { fn project_and_group_workspace() -> Result<()> { // Checking that --project is handled properly with --group fn new_context() -> Result { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -16082,7 +16082,7 @@ fn project_and_group_workspace() -> Result<()> { fn directory_and_group() -> Result<()> { // Checking that --directory is handled properly with --group fn new_context() -> Result { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -16189,7 +16189,7 @@ fn directory_and_group() -> Result<()> { #[test] fn group_target_does_not_exist() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -16219,7 +16219,7 @@ fn group_target_does_not_exist() -> Result<()> { #[cfg(feature = "test-python-eol")] #[test] fn compile_preserve_requires_python_split() -> Result<()> { - let context = TestContext::new("3.8").with_exclude_newer("2025-01-01T00:00:00Z"); + let context = uv_test::test_context!("3.8").with_exclude_newer("2025-01-01T00:00:00Z"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("zipp")?; @@ -16274,7 +16274,7 @@ fn compile_preserve_requires_python_split() -> Result<()> { /// Regression test for #[test] fn markers_on_extra_packages() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc! {" psycopg[binary]; platform_python_implementation != 'PyPy' @@ -16308,7 +16308,7 @@ fn markers_on_extra_packages() -> Result<()> { #[test] fn respect_non_local_preference() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00:00Z"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("torch")?; @@ -16360,7 +16360,7 @@ fn respect_non_local_preference() -> Result<()> { #[test] fn omit_wheels_exclude_newer() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2024-08-01T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2024-08-01T00:00:00Z"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("pillow-avif-plugin")?; @@ -16425,7 +16425,7 @@ fn omit_wheels_exclude_newer() -> Result<()> { /// See: #[test] fn compile_quotes() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("tbump")?; @@ -16465,7 +16465,7 @@ fn compile_quotes() -> Result<()> { #[test] fn compile_invalid_output_file() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio==3.7.0")?; @@ -16487,7 +16487,7 @@ fn compile_invalid_output_file() -> Result<()> { #[test] fn pep_751_filename() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("iniconfig")?; @@ -16513,7 +16513,7 @@ fn pep_751_filename() -> Result<()> { #[test] fn pep_751_compile_registry_wheel() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("iniconfig")?; @@ -16562,7 +16562,7 @@ fn pep_751_compile_registry_wheel() -> Result<()> { #[test] fn pep_751_compile_registry_sdist() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-29T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-29T00:00:00Z"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("source-distribution")?; @@ -16610,7 +16610,7 @@ fn pep_751_compile_registry_sdist() -> Result<()> { #[test] fn pep_751_compile_directory() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a local dependency in a subdirectory. let pyproject_toml = context.temp_dir.child("foo").child("pyproject.toml"); @@ -16715,7 +16715,7 @@ fn pep_751_compile_directory() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn pep_751_compile_git() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str( @@ -16765,7 +16765,7 @@ fn pep_751_compile_git() -> Result<()> { #[test] fn pep_751_compile_url_wheel() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str( @@ -16829,7 +16829,7 @@ fn pep_751_compile_url_wheel() -> Result<()> { #[test] fn pep_751_compile_url_sdist() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str( @@ -16893,7 +16893,7 @@ fn pep_751_compile_url_sdist() -> Result<()> { #[test] fn pep_751_compile_path_wheel() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Download the source. let archive = context.temp_dir.child("iniconfig-2.0.0-py3-none-any.whl"); @@ -16972,7 +16972,7 @@ fn pep_751_compile_path_wheel() -> Result<()> { #[test] fn pep_751_compile_path_sdist() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Download the source. let archive = context.temp_dir.child("iniconfig-2.0.0.tar.gz"); @@ -17052,7 +17052,7 @@ fn pep_751_compile_path_sdist() -> Result<()> { #[test] fn pep_751_compile_preferences() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(indoc::indoc! {r" @@ -17222,7 +17222,7 @@ fn pep_751_compile_preferences() -> Result<()> { #[test] fn pep_751_compile_warn() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("iniconfig")?; @@ -17259,7 +17259,7 @@ fn pep_751_compile_warn() -> Result<()> { #[test] fn pep_751_compile_non_universal() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("black")?; @@ -17397,7 +17397,7 @@ fn pep_751_compile_non_universal() -> Result<()> { /// Test that `--only-binary` excludes source distributions from pylock.toml output. #[test] fn pep_751_compile_only_binary() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("iniconfig")?; @@ -17435,7 +17435,7 @@ fn pep_751_compile_only_binary() -> Result<()> { /// Test that `--no-binary` excludes wheels from pylock.toml output. #[test] fn pep_751_compile_no_binary() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("iniconfig")?; @@ -17472,7 +17472,7 @@ fn pep_751_compile_no_binary() -> Result<()> { #[test] fn pep_751_compile_no_emit_package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("anyio")?; @@ -17520,7 +17520,7 @@ fn pep_751_compile_no_emit_package() -> Result<()> { /// have a `data-requires-python` key on the index page. #[tokio::test] async fn index_has_no_requires_python() -> Result<()> { - let context = TestContext::new_with_versions(&["3.9", "3.12"]); + let context = uv_test::test_context_with_versions!(&["3.9", "3.12"]); let server = MockServer::start().await; // Unlike PyPI, https://download.pytorch.org/whl/cpu/networkx/ does not contain the @@ -17591,7 +17591,7 @@ async fn index_has_no_requires_python() -> Result<()> { /// Disallow resolving to multiple different PyTorch indexes. #[test] fn incompatible_cuda() -> Result<()> { - let context = TestContext::new("3.11"); + let context = uv_test::test_context!("3.11"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str(indoc! {r" torch==2.6.0+cu126 @@ -17625,7 +17625,7 @@ fn incompatible_cuda() -> Result<()> { #[cfg(unix)] #[test] fn compile_broken_active_venv() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio==3.7.0")?; @@ -17668,7 +17668,7 @@ fn compile_broken_active_venv() -> Result<()> { /// #[test] fn pubgrub_panic_double_self_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context .temp_dir .child("pyproject.toml") @@ -17710,7 +17710,7 @@ fn pubgrub_panic_double_self_dependency() -> Result<()> { /// #[test] fn pubgrub_panic_double_self_dependency_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context .temp_dir .child("pyproject.toml") @@ -17760,7 +17760,7 @@ fn pubgrub_panic_double_self_dependency_extra() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn git_path_transitive_dependency() -> Result<()> { - let context = TestContext::new("3.13"); + let context = uv_test::test_context!("3.13"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str( @@ -17790,7 +17790,7 @@ fn git_path_transitive_dependency() -> Result<()> { /// Ensure that `--emit-index-annotation` plays nicely with `--annotation-style=line`. #[test] fn omit_python_patch_universal() -> Result<()> { - let context = TestContext::new("3.11"); + let context = uv_test::test_context!("3.11"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("redis")?; @@ -17833,7 +17833,7 @@ fn omit_python_patch_universal() -> Result<()> { #[test] fn credentials_from_subdirectory() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a local dependency in a subdirectory. let pyproject_toml = context.temp_dir.child("foo").child("pyproject.toml"); @@ -17904,7 +17904,7 @@ fn credentials_from_subdirectory() -> Result<()> { /// See: #[test] fn post_release_less_than() -> Result<()> { - let context = TestContext::new("3.10"); + let context = uv_test::test_context!("3.10"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("hidapi>=0.12.0.post1,<0.12.0.post2")?; @@ -17940,7 +17940,7 @@ fn post_release_less_than() -> Result<()> { /// Windows tag either. #[test] fn compile_with_python_platform_and_built_wheel_for_different_platform() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("./project")?; @@ -18080,7 +18080,7 @@ fn compile_with_python_platform_and_built_wheel_for_different_platform() -> Resu #[cfg(feature = "test-python-managed")] #[test] fn compile_missing_python() -> Result<()> { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_python_download_cache() .with_managed_python_dirs(); @@ -18114,7 +18114,7 @@ fn compile_missing_python() -> Result<()> { #[cfg(feature = "test-python-managed")] #[test] fn compile_missing_python_version() -> Result<()> { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_python_download_cache() .with_managed_python_dirs(); @@ -18147,7 +18147,7 @@ fn compile_missing_python_version() -> Result<()> { #[cfg(feature = "test-python-managed")] #[test] fn compile_missing_python_version_patch_fallback() -> Result<()> { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_python_download_cache() .with_managed_python_dirs() // Filter the patch of the version which will get downloaded @@ -18186,7 +18186,7 @@ fn compile_missing_python_version_patch_fallback() -> Result<()> { #[cfg(feature = "test-python-managed")] #[test] fn compile_missing_python_version_default_fallback() -> Result<()> { - let context = TestContext::new_with_versions(&[]) + let context = uv_test::test_context_with_versions!(&[]) .with_python_download_cache() .with_managed_python_dirs() .with_filtered_latest_python_versions(); @@ -18223,7 +18223,7 @@ fn compile_missing_python_version_default_fallback() -> Result<()> { #[cfg(feature = "test-python-managed")] #[tokio::test] async fn compile_missing_python_download_error_warning() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_managed_python_dirs() .with_filter(( r"(https://github\.com/astral-sh/python-build-standalone/releases/download/).*" diff --git a/crates/uv/tests/it/pip_compile_scenarios.rs b/crates/uv/tests/it/pip_compile_scenarios.rs index 482969858..52fcf00e8 100644 --- a/crates/uv/tests/it/pip_compile_scenarios.rs +++ b/crates/uv/tests/it/pip_compile_scenarios.rs @@ -14,7 +14,7 @@ use predicates::prelude::predicate; use uv_static::EnvVars; -use crate::common::{ +use uv_test::{ TestContext, build_vendor_links_url, get_bin, packse_index_url, python_path_with_versions, uv_snapshot, }; @@ -23,7 +23,7 @@ use crate::common::{ fn command(context: &TestContext, python_versions: &[&str]) -> Command { let python_path = python_path_with_versions(&context.temp_dir, python_versions) .expect("Failed to create Python test path"); - let mut command = Command::new(get_bin()); + let mut command = Command::new(get_bin!()); command .arg("pip") .arg("compile") @@ -54,7 +54,7 @@ fn command(context: &TestContext, python_versions: &[&str]) -> Command { /// ``` #[test] fn compatible_python_incompatible_override() -> Result<()> { - let context = TestContext::new("3.11"); + let context = uv_test::test_context!("3.11"); let python_versions = &[]; // In addition to the standard filters, swap out package names for shorter messages @@ -102,7 +102,7 @@ fn compatible_python_incompatible_override() -> Result<()> { /// ``` #[test] fn incompatible_python_compatible_override_available_no_wheels() -> Result<()> { - let context = TestContext::new("3.9"); + let context = uv_test::test_context!("3.9"); let python_versions = &["3.11"]; // In addition to the standard filters, swap out package names for shorter messages @@ -155,7 +155,7 @@ fn incompatible_python_compatible_override_available_no_wheels() -> Result<()> { /// ``` #[test] fn incompatible_python_compatible_override_no_compatible_wheels() -> Result<()> { - let context = TestContext::new("3.9"); + let context = uv_test::test_context!("3.9"); let python_versions = &[]; // In addition to the standard filters, swap out package names for shorter messages @@ -210,7 +210,7 @@ fn incompatible_python_compatible_override_no_compatible_wheels() -> Result<()> /// ``` #[test] fn incompatible_python_compatible_override_other_wheel() -> Result<()> { - let context = TestContext::new("3.9"); + let context = uv_test::test_context!("3.9"); let python_versions = &[]; // In addition to the standard filters, swap out package names for shorter messages @@ -261,7 +261,7 @@ fn incompatible_python_compatible_override_other_wheel() -> Result<()> { /// ``` #[test] fn incompatible_python_compatible_override_unavailable_no_wheels() -> Result<()> { - let context = TestContext::new("3.9"); + let context = uv_test::test_context!("3.9"); let python_versions = &[]; // In addition to the standard filters, swap out package names for shorter messages @@ -313,7 +313,7 @@ fn incompatible_python_compatible_override_unavailable_no_wheels() -> Result<()> /// ``` #[test] fn incompatible_python_compatible_override() -> Result<()> { - let context = TestContext::new("3.9"); + let context = uv_test::test_context!("3.9"); let python_versions = &[]; // In addition to the standard filters, swap out package names for shorter messages @@ -363,7 +363,7 @@ fn incompatible_python_compatible_override() -> Result<()> { #[cfg(feature = "test-python-patch")] #[test] fn python_patch_override_no_patch() -> Result<()> { - let context = TestContext::new("3.9.20"); + let context = uv_test::test_context!("3.9.20"); let python_versions = &[]; // In addition to the standard filters, swap out package names for shorter messages @@ -411,7 +411,7 @@ fn python_patch_override_no_patch() -> Result<()> { #[cfg(feature = "test-python-patch")] #[test] fn python_patch_override_patch_compatible() -> Result<()> { - let context = TestContext::new("3.9.20"); + let context = uv_test::test_context!("3.9.20"); let python_versions = &[]; // In addition to the standard filters, swap out package names for shorter messages diff --git a/crates/uv/tests/it/pip_debug.rs b/crates/uv/tests/it/pip_debug.rs index b9449fded..6348f317c 100644 --- a/crates/uv/tests/it/pip_debug.rs +++ b/crates/uv/tests/it/pip_debug.rs @@ -1,8 +1,8 @@ -use crate::common::{TestContext, uv_snapshot}; +use uv_test::uv_snapshot; #[test] fn debug_warn() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.pip_debug(), @" success: false diff --git a/crates/uv/tests/it/pip_freeze.rs b/crates/uv/tests/it/pip_freeze.rs index d4f4b9fc0..e27a407a7 100644 --- a/crates/uv/tests/it/pip_freeze.rs +++ b/crates/uv/tests/it/pip_freeze.rs @@ -3,11 +3,11 @@ use assert_cmd::prelude::*; use assert_fs::fixture::ChildPath; use assert_fs::prelude::*; -use crate::common::{TestContext, uv_snapshot}; +use uv_test::uv_snapshot; #[test] fn freeze_many() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("MarkupSafe==2.1.3\ntomli==2.0.1")?; @@ -42,7 +42,7 @@ fn freeze_duplicate() -> Result<()> { use uv_fs::copy_dir_all; // Sync a version of `pip` into a virtual environment. - let context1 = TestContext::new("3.12"); + let context1 = uv_test::test_context!("3.12"); let requirements_txt = context1.temp_dir.child("requirements.txt"); requirements_txt.write_str("pip==21.3.1")?; @@ -54,7 +54,7 @@ fn freeze_duplicate() -> Result<()> { .success(); // Sync a different version of `pip` into a virtual environment. - let context2 = TestContext::new("3.12"); + let context2 = uv_test::test_context!("3.12"); let requirements_txt = context2.temp_dir.child("requirements.txt"); requirements_txt.write_str("pip==22.1.1")?; @@ -92,7 +92,7 @@ fn freeze_duplicate() -> Result<()> { /// List a direct URL package in a virtual environment. #[test] fn freeze_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("anyio\niniconfig @ https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl")?; @@ -124,7 +124,7 @@ fn freeze_url() -> Result<()> { #[test] fn freeze_with_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(&format!( @@ -178,7 +178,7 @@ fn freeze_with_editable() -> Result<()> { /// Show an `.egg-info` package in a virtual environment. #[test] fn freeze_with_egg_info() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let site_packages = ChildPath::new(context.site_packages()); @@ -231,7 +231,7 @@ fn freeze_with_egg_info() -> Result<()> { /// Python version. #[test] fn freeze_with_egg_info_no_py() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let site_packages = ChildPath::new(context.site_packages()); @@ -283,7 +283,7 @@ fn freeze_with_egg_info_no_py() -> Result<()> { /// Show a set of `.egg-info` files in a virtual environment. #[test] fn freeze_with_egg_info_file() -> Result<()> { - let context = TestContext::new("3.11"); + let context = uv_test::test_context!("3.11"); let site_packages = ChildPath::new(context.site_packages()); // Manually create a `.egg-info` file with python version. @@ -319,7 +319,7 @@ fn freeze_with_egg_info_file() -> Result<()> { #[test] fn freeze_with_legacy_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let site_packages = ChildPath::new(context.site_packages()); @@ -357,7 +357,7 @@ Version: 0.22.0 #[test] fn freeze_path() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("MarkupSafe==2.1.3\ntomli==2.0.1")?; @@ -391,7 +391,7 @@ fn freeze_path() -> Result<()> { #[test] fn freeze_multiple_paths() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt1 = context.temp_dir.child("requirements1.txt"); requirements_txt1.write_str("MarkupSafe==2.1.3\ntomli==2.0.1")?; @@ -434,7 +434,7 @@ fn freeze_multiple_paths() -> Result<()> { // We follow pip in just ignoring nonexistent paths #[test] fn freeze_nonexistent_path() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let nonexistent_dir = { let dir = context.temp_dir.child("blahblah"); @@ -456,7 +456,7 @@ fn freeze_nonexistent_path() { #[test] fn freeze_with_quiet_flag() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("MarkupSafe==2.1.3\ntomli==2.0.1")?; @@ -485,7 +485,7 @@ fn freeze_with_quiet_flag() -> Result<()> { #[test] fn freeze_target() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("MarkupSafe==2.1.3\ntomli==2.0.1")?; @@ -531,7 +531,7 @@ fn freeze_target() -> Result<()> { #[test] fn freeze_prefix() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("MarkupSafe==2.1.3\ntomli==2.0.1")?; @@ -577,7 +577,7 @@ fn freeze_prefix() -> Result<()> { #[test] fn freeze_exclude() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let prefix = context.temp_dir.child("prefix"); diff --git a/crates/uv/tests/it/pip_install.rs b/crates/uv/tests/it/pip_install.rs index cbd961c3d..d7f2cbb74 100644 --- a/crates/uv/tests/it/pip_install.rs +++ b/crates/uv/tests/it/pip_install.rs @@ -15,18 +15,18 @@ use wiremock::{ matchers::{basic_auth, method, path}, }; +use uv_fs::Simplified; +use uv_static::EnvVars; #[cfg(feature = "test-git")] -use crate::common::{self, decode_token}; -use crate::common::{ +use uv_test::decode_token; +use uv_test::{ DEFAULT_PYTHON_VERSION, TestContext, build_vendor_links_url, download_to_disk, get_bin, packse_index_url, uv_snapshot, venv_bin_path, }; -use uv_fs::Simplified; -use uv_static::EnvVars; #[test] fn missing_requirements_txt() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); uv_snapshot!(context.filters(), context.pip_install() @@ -47,7 +47,7 @@ fn missing_requirements_txt() { #[test] fn empty_requirements_txt() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.touch()?; @@ -70,7 +70,7 @@ fn empty_requirements_txt() -> Result<()> { #[test] fn missing_pyproject_toml() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.pip_install() .arg("-r") @@ -87,7 +87,7 @@ fn missing_pyproject_toml() { #[test] fn missing_find_links() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_missing_file_error(); + let context = uv_test::test_context!("3.12").with_filtered_missing_file_error(); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("flask")?; @@ -112,7 +112,7 @@ fn missing_find_links() -> Result<()> { #[test] fn invalid_pyproject_toml_syntax() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str("123 - 456")?; @@ -145,7 +145,7 @@ fn invalid_pyproject_toml_syntax() -> Result<()> { #[test] fn invalid_pyproject_toml_project_schema() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str("[project]")?; @@ -171,7 +171,7 @@ fn invalid_pyproject_toml_project_schema() -> Result<()> { #[test] fn invalid_pyproject_toml_option_schema() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r" [tool.uv] @@ -204,7 +204,7 @@ fn invalid_pyproject_toml_option_schema() -> Result<()> { #[test] fn invalid_pyproject_toml_option_unknown_field() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" [tool.uv] @@ -246,7 +246,7 @@ fn invalid_pyproject_toml_option_unknown_field() -> Result<()> { #[test] fn invalid_toml_filename() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let test_toml = context.temp_dir.child("test.toml"); test_toml.touch()?; @@ -267,7 +267,7 @@ fn invalid_toml_filename() -> Result<()> { #[test] fn invalid_uv_toml_option_disallowed_automatic_discovery() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let uv_toml = context.temp_dir.child("uv.toml"); uv_toml.write_str(indoc! {r" managed = true @@ -289,7 +289,7 @@ fn invalid_uv_toml_option_disallowed_automatic_discovery() -> Result<()> { #[test] fn invalid_uv_toml_option_disallowed_command_line() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let uv_toml = context.temp_dir.child("foo.toml"); uv_toml.write_str(indoc! {r" managed = true @@ -313,7 +313,7 @@ fn invalid_uv_toml_option_disallowed_command_line() -> Result<()> { #[test] fn cache_uv_toml_credentials() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let uv_toml = context.temp_dir.child("uv.toml"); uv_toml.write_str(indoc! {r#" [pip] @@ -353,7 +353,7 @@ fn cache_uv_toml_credentials() -> Result<()> { /// fields. See: #[test] fn invalid_pyproject_toml_requirement_indirect() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("path_dep/pyproject.toml"); pyproject_toml.write_str( r#"[project] @@ -437,7 +437,7 @@ dependencies = ["flask==1.0.x"] #[test] fn invalid_python_version() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.pip_install() .arg("flask") @@ -457,7 +457,7 @@ fn invalid_python_version() { #[test] fn missing_pip() { - uv_snapshot!(Command::new(get_bin()).arg("install"), @" + uv_snapshot!(Command::new(get_bin!()).arg("install"), @" success: false exit_code: 2 ----- stdout ----- @@ -475,7 +475,7 @@ fn missing_pip() { #[test] fn no_solution() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.pip_install() .arg("flask>=3.0.2") @@ -495,7 +495,7 @@ fn no_solution() { /// Install a package from the command line into a virtual environment. #[test] fn install_package() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install Flask. uv_snapshot!(context.pip_install() @@ -525,7 +525,7 @@ fn install_package() { /// Install a package from a `requirements.txt` into a virtual environment. #[test] fn install_requirements_txt() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install Flask. let requirements_txt = context.temp_dir.child("requirements.txt"); @@ -584,7 +584,7 @@ fn install_requirements_txt() -> Result<()> { #[test] #[expect(clippy::disallowed_types)] fn install_from_stdin() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install Flask. let requirements_txt = context.temp_dir.child("requirements.txt"); @@ -622,7 +622,7 @@ fn install_from_stdin() -> Result<()> { #[cfg(not(windows))] #[expect(clippy::disallowed_types)] fn install_from_dev_stdin() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install Flask. let requirements_txt = context.temp_dir.child("requirements.txt"); @@ -658,7 +658,7 @@ fn install_from_dev_stdin() -> Result<()> { /// Install a package from a remote `requirements.txt` into a virtual environment. #[tokio::test] async fn install_remote_requirements_txt() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let username = "user"; let password = "password"; @@ -762,7 +762,7 @@ async fn start_requirements_server( /// Warn (but don't fail) when unsupported flags are set in the `requirements.txt`. #[test] fn install_unsupported_flag() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(indoc! {r" @@ -797,7 +797,7 @@ fn install_unsupported_flag() -> Result<()> { /// This is likely to occur in the real world when compiled on one platform then installed on another. #[test] fn install_requirements_txt_conflicting_pins() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); @@ -834,7 +834,7 @@ werkzeug==3.0.1 #[test] fn install_with_dependencies_from_script() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let script = context.temp_dir.child("script.py"); script.write_str(indoc! {r#" # /// script @@ -900,7 +900,7 @@ fn install_with_dependencies_from_script() -> Result<()> { /// Install a `pyproject.toml` file with a `poetry` section. #[test] fn install_pyproject_toml_poetry() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#"[tool.poetry] @@ -949,7 +949,7 @@ build-backend = "poetry.core.masonry.api" /// Respect installed versions when resolving. #[test] fn respect_installed_and_reinstall() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install Flask. let requirements_txt = context.temp_dir.child("requirements.txt"); @@ -1074,7 +1074,7 @@ fn respect_installed_and_reinstall() -> Result<()> { /// Respect installed versions when resolving. #[test] fn reinstall_extras() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install httpx. let requirements_txt = context.temp_dir.child("requirements.txt"); @@ -1134,7 +1134,7 @@ fn reinstall_extras() -> Result<()> { /// Warn, but don't fail, when uninstalling incomplete packages. #[test] fn reinstall_incomplete() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install anyio. let requirements_txt = context.temp_dir.child("requirements.txt"); @@ -1187,7 +1187,7 @@ fn reinstall_incomplete() -> Result<()> { #[test] fn exact_install_removes_extraneous_packages() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); // Install anyio let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("anyio==3.7.0")?; @@ -1310,7 +1310,7 @@ fn exact_install_removes_extraneous_packages() -> Result<()> { /// Like `pip`, we (unfortunately) allow incompatible environments. #[test] fn allow_incompatibilities() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install Flask, which relies on `Werkzeug>=3.0.0`. let requirements_txt = context.temp_dir.child("requirements.txt"); @@ -1371,7 +1371,7 @@ fn allow_incompatibilities() -> Result<()> { #[test] fn install_extras() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Request extras for an editable path uv_snapshot!(context.filters(), context.pip_install() @@ -1448,7 +1448,7 @@ dependencies = ["anyio==3.7.0"] #[test] fn install_editable() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install the editable package. uv_snapshot!(context.filters(), context.pip_install() @@ -1513,7 +1513,7 @@ fn install_editable() { #[test] fn install_editable_and_registry() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install the registry-based version of Black. uv_snapshot!(context.filters(), context.pip_install() @@ -1588,7 +1588,7 @@ fn install_editable_and_registry() { #[test] fn install_editable_no_binary() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install the editable package with no-binary enabled uv_snapshot!(context.filters(), context.pip_install() @@ -1611,7 +1611,7 @@ fn install_editable_no_binary() { #[test] fn install_editable_compatible_constraint() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let constraints_txt = context.temp_dir.child("constraints.txt"); constraints_txt.write_str("black==0.1.0")?; @@ -1639,7 +1639,7 @@ fn install_editable_compatible_constraint() -> Result<()> { #[test] fn install_editable_incompatible_constraint_version() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let constraints_txt = context.temp_dir.child("constraints.txt"); constraints_txt.write_str("black>0.1.0")?; @@ -1665,7 +1665,7 @@ fn install_editable_incompatible_constraint_version() -> Result<()> { #[test] fn install_editable_incompatible_constraint_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let constraints_txt = context.temp_dir.child("constraints.txt"); constraints_txt.write_str("black @ https://files.pythonhosted.org/packages/0f/89/294c9a6b6c75a08da55e9d05321d0707e9418735e3062b12ef0f54c33474/black-24.4.2-py3-none-any.whl")?; @@ -1692,7 +1692,7 @@ fn install_editable_incompatible_constraint_url() -> Result<()> { #[test] fn install_editable_pep_508_requirements_txt() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(&indoc::formatdoc! {r" @@ -1782,7 +1782,7 @@ fn install_editable_pep_508_requirements_txt() -> Result<()> { #[test] fn install_editable_pep_508_cli() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.pip_install() .arg("-e") @@ -1809,7 +1809,7 @@ fn install_editable_pep_508_cli() { #[test] fn install_editable_bare_cli() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let packages_dir = context.workspace_root.join("test/packages"); @@ -1833,7 +1833,7 @@ fn install_editable_bare_cli() { #[test] fn install_editable_bare_requirements_txt() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("-e black_editable")?; @@ -1862,7 +1862,7 @@ fn install_editable_bare_requirements_txt() -> Result<()> { #[test] fn invalid_editable_no_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("-e black==0.1.0")?; @@ -1885,7 +1885,7 @@ fn invalid_editable_no_url() -> Result<()> { #[test] fn invalid_editable_unnamed_https_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("-e https://files.pythonhosted.org/packages/0f/89/294c9a6b6c75a08da55e9d05321d0707e9418735e3062b12ef0f54c33474/black-24.4.2-py3-none-any.whl")?; @@ -1908,7 +1908,7 @@ fn invalid_editable_unnamed_https_url() -> Result<()> { #[test] fn invalid_editable_named_https_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("-e black @ https://files.pythonhosted.org/packages/0f/89/294c9a6b6c75a08da55e9d05321d0707e9418735e3062b12ef0f54c33474/black-24.4.2-py3-none-any.whl")?; @@ -1934,7 +1934,7 @@ fn invalid_editable_named_https_url() -> Result<()> { /// that the `flit` install and the source distribution build don't conflict. #[test] fn reinstall_build_system() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(indoc! {r" @@ -1973,7 +1973,7 @@ fn reinstall_build_system() -> Result<()> { /// Install a package without using the remote index #[test] fn install_no_index() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.pip_install() .arg("Flask") @@ -1997,7 +1997,7 @@ fn install_no_index() { /// Covers a case where the user requests a version which should be included in the error #[test] fn install_no_index_version() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.pip_install() .arg("Flask==3.0.0") @@ -2032,7 +2032,7 @@ fn install_no_index_version() { /// Ref: #[test] fn install_extra_index_url_has_priority() { - let context = TestContext::new("3.12").with_exclude_newer("2024-03-09T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2024-03-09T00:00:00Z"); uv_snapshot!(context.pip_install() .arg("--index-url") @@ -2066,7 +2066,7 @@ fn install_extra_index_url_has_priority() { /// Ensure that the index is fetched only once when duplicate indices are specified #[tokio::test] async fn install_deduplicated_indices() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let redirect_server = MockServer::start().await; @@ -2104,7 +2104,7 @@ async fn install_deduplicated_indices() { #[test] #[cfg(feature = "test-git")] fn install_git_public_https() { - let context = TestContext::new(DEFAULT_PYTHON_VERSION); + let context = uv_test::test_context!(DEFAULT_PYTHON_VERSION); uv_snapshot!( context @@ -2129,7 +2129,7 @@ fn install_git_public_https() { #[test] #[cfg(feature = "test-git")] fn install_implicit_git_public_https() { - let context = TestContext::new(DEFAULT_PYTHON_VERSION); + let context = uv_test::test_context!(DEFAULT_PYTHON_VERSION); uv_snapshot!( context @@ -2154,7 +2154,7 @@ fn install_implicit_git_public_https() { #[test] #[cfg(feature = "test-git")] fn update_ref_git_public_https() { - let context = TestContext::new(DEFAULT_PYTHON_VERSION); + let context = uv_test::test_context!(DEFAULT_PYTHON_VERSION); uv_snapshot!( context @@ -2201,7 +2201,7 @@ fn update_ref_git_public_https() { #[test] #[cfg(feature = "test-git")] fn install_git_public_https_missing_branch_or_tag() { - let context = TestContext::new(DEFAULT_PYTHON_VERSION); + let context = uv_test::test_context!(DEFAULT_PYTHON_VERSION); let mut filters = context.filters(); // Windows does not style the command the same as Unix, so we must omit it from the snapshot @@ -2229,7 +2229,7 @@ fn install_git_public_https_missing_branch_or_tag() { #[tokio::test] #[cfg(feature = "test-git")] async fn install_git_public_rate_limited_by_github_rest_api_403_response() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let server = MockServer::start().await; Mock::given(method("GET")) @@ -2259,7 +2259,7 @@ async fn install_git_public_rate_limited_by_github_rest_api_403_response() { async fn install_git_public_rate_limited_by_github_rest_api_429_response() { use uv_client::DEFAULT_RETRIES; - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let server = MockServer::start().await; Mock::given(method("GET")) @@ -2289,7 +2289,7 @@ async fn install_git_public_rate_limited_by_github_rest_api_429_response() { #[test] #[cfg(feature = "test-git")] fn install_git_public_https_missing_commit() { - let context = TestContext::new(DEFAULT_PYTHON_VERSION); + let context = uv_test::test_context!(DEFAULT_PYTHON_VERSION); let mut filters = context.filters(); // Windows does not style the command the same as Unix, so we must omit it from the snapshot @@ -2328,7 +2328,7 @@ fn install_git_public_https_missing_commit() { #[test] #[cfg(feature = "test-git")] fn install_git_public_https_exact_commit() { - let context = TestContext::new(DEFAULT_PYTHON_VERSION); + let context = uv_test::test_context!(DEFAULT_PYTHON_VERSION); // `uv pip install` a Git dependency with an exact commit. uv_snapshot!(context.filters(), context.pip_install() @@ -2376,10 +2376,10 @@ fn install_git_public_https_exact_commit() { #[test] #[cfg(all(not(windows), feature = "test-git"))] fn install_git_private_https_pat() { - use crate::common::decode_token; + use uv_test::decode_token; - let context = TestContext::new(DEFAULT_PYTHON_VERSION); - let token = decode_token(common::READ_ONLY_GITHUB_TOKEN); + let context = uv_test::test_context!(DEFAULT_PYTHON_VERSION); + let token = decode_token(uv_test::READ_ONLY_GITHUB_TOKEN); let package = format!( "uv-private-pypackage@ git+https://{token}@github.com/astral-test/uv-private-pypackage" ); @@ -2405,8 +2405,8 @@ fn install_git_private_https_pat() { #[test] #[cfg(all(not(windows), feature = "test-git"))] fn install_git_private_https_pat_mixed_with_public() { - let context = TestContext::new(DEFAULT_PYTHON_VERSION); - let token = decode_token(common::READ_ONLY_GITHUB_TOKEN); + let context = uv_test::test_context!(DEFAULT_PYTHON_VERSION); + let token = decode_token(uv_test::READ_ONLY_GITHUB_TOKEN); let package = format!( "uv-private-pypackage @ git+https://{token}@github.com/astral-test/uv-private-pypackage" @@ -2433,9 +2433,9 @@ fn install_git_private_https_pat_mixed_with_public() { #[test] #[cfg(all(not(windows), feature = "test-git"))] fn install_git_private_https_multiple_pat() { - let context = TestContext::new(DEFAULT_PYTHON_VERSION); - let token_1 = decode_token(common::READ_ONLY_GITHUB_TOKEN); - let token_2 = decode_token(common::READ_ONLY_GITHUB_TOKEN_2); + let context = uv_test::test_context!(DEFAULT_PYTHON_VERSION); + let token_1 = decode_token(uv_test::READ_ONLY_GITHUB_TOKEN); + let token_2 = decode_token(uv_test::READ_ONLY_GITHUB_TOKEN_2); let package_1 = format!( "uv-private-pypackage @ git+https://{token_1}@github.com/astral-test/uv-private-pypackage" @@ -2465,8 +2465,8 @@ fn install_git_private_https_multiple_pat() { #[test] #[cfg(feature = "test-git")] fn install_git_private_https_pat_at_ref() { - let context = TestContext::new(DEFAULT_PYTHON_VERSION); - let token = decode_token(common::READ_ONLY_GITHUB_TOKEN); + let context = uv_test::test_context!(DEFAULT_PYTHON_VERSION); + let token = decode_token(uv_test::READ_ONLY_GITHUB_TOKEN); let mut filters = context.filters(); filters.push((r"git\+https://", "")); @@ -2503,8 +2503,8 @@ fn install_git_private_https_pat_at_ref() { #[test] #[cfg(feature = "test-git")] fn install_git_private_https_pat_and_username() { - let context = TestContext::new(DEFAULT_PYTHON_VERSION).with_unset_git_credential_helper(); - let token = decode_token(common::READ_ONLY_GITHUB_TOKEN); + let context = uv_test::test_context!(DEFAULT_PYTHON_VERSION).with_unset_git_credential_helper(); + let token = decode_token(uv_test::READ_ONLY_GITHUB_TOKEN); let user = "astral-test-bot"; uv_snapshot!(context.filters(), context.pip_install().arg(format!("uv-private-pypackage @ git+https://{user}:{token}@github.com/astral-test/uv-private-pypackage")) @@ -2527,7 +2527,7 @@ fn install_git_private_https_pat_and_username() { #[test] #[cfg(all(not(windows), feature = "test-git"))] fn install_git_private_https_pat_not_authorized() { - let context = TestContext::new(DEFAULT_PYTHON_VERSION); + let context = uv_test::test_context!(DEFAULT_PYTHON_VERSION); // A revoked token let token = "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"; @@ -2565,8 +2565,8 @@ fn install_git_private_https_pat_not_authorized() { #[test] #[cfg(not(windows))] fn install_github_artifact_private_https_pat_mixed_with_public() { - let context = TestContext::new(DEFAULT_PYTHON_VERSION); - let token = decode_token(common::READ_ONLY_GITHUB_TOKEN); + let context = uv_test::test_context!(DEFAULT_PYTHON_VERSION); + let token = decode_token(uv_test::READ_ONLY_GITHUB_TOKEN); let private_package = format!( "uv-private-pypackage @ https://{token}@raw.githubusercontent.com/astral-test/uv-private-pypackage/main/dist/uv_private_pypackage-0.1.0-py3-none-any.whl" @@ -2595,9 +2595,9 @@ fn install_github_artifact_private_https_pat_mixed_with_public() { #[test] #[cfg(not(windows))] fn install_github_artifact_private_https_multiple_pat() { - let context = TestContext::new(DEFAULT_PYTHON_VERSION); - let token_1 = decode_token(common::READ_ONLY_GITHUB_TOKEN); - let token_2 = decode_token(common::READ_ONLY_GITHUB_TOKEN_2); + let context = uv_test::test_context!(DEFAULT_PYTHON_VERSION); + let token_1 = decode_token(uv_test::READ_ONLY_GITHUB_TOKEN); + let token_2 = decode_token(uv_test::READ_ONLY_GITHUB_TOKEN_2); let package_1 = format!( "uv-private-pypackage @ https://astral-test-bot:{token_1}@raw.githubusercontent.com/astral-test/uv-private-pypackage/main/dist/uv_private_pypackage-0.1.0-py3-none-any.whl" @@ -2629,7 +2629,7 @@ fn install_github_artifact_private_https_multiple_pat() { #[test] #[cfg(feature = "test-git")] fn install_git_private_https_interactive() { - let context = TestContext::new(DEFAULT_PYTHON_VERSION); + let context = uv_test::test_context!(DEFAULT_PYTHON_VERSION); let package = "uv-private-pypackage@ git+https://github.com/astral-test/uv-private-pypackage"; @@ -2659,7 +2659,7 @@ fn install_git_private_https_interactive() { /// Install a package without using pre-built wheels. #[test] fn reinstall_no_binary() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // The first installation should use a pre-built wheel let mut command = context.pip_install(); @@ -2733,7 +2733,7 @@ fn reinstall_no_binary() { /// Overlapping usage of `--no-binary` and `--only-binary` #[test] fn install_no_binary_overrides_only_binary_all() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // The specific `--no-binary` should override the less specific `--only-binary` let mut command = context.pip_install(); @@ -2767,7 +2767,7 @@ fn install_no_binary_overrides_only_binary_all() { /// Accept comma-separated values for `--no-binary` (pip compatibility) #[test] fn install_no_binary_comma_separated() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Use comma-separated format for `--no-binary` let mut command = context.pip_install(); @@ -2799,7 +2799,7 @@ fn install_no_binary_comma_separated() { /// TODO(zanieb): This is not yet implemented #[test] fn install_no_binary_env() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let mut command = context.pip_install(); command.arg("anyio").env(EnvVars::UV_NO_BINARY, "1"); @@ -2875,7 +2875,7 @@ fn install_no_binary_env() { /// Overlapping usage of `--no-binary` and `--only-binary` #[test] fn install_only_binary_overrides_no_binary_all() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // The specific `--only-binary` should override the less specific `--no-binary` let mut command = context.pip_install(); @@ -2909,7 +2909,7 @@ fn install_only_binary_overrides_no_binary_all() { /// Accept comma-separated values for `--only-binary` (pip compatibility) #[test] fn install_only_binary_comma_separated() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Use comma-separated format for `--only-binary` let mut command = context.pip_install(); @@ -2941,7 +2941,7 @@ fn install_only_binary_comma_separated() { // TODO(zanieb): We should have a better error message here #[test] fn install_only_binary_all_and_no_binary_all() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // With both as `:all:` we can't install let mut command = context.pip_install(); @@ -2975,7 +2975,7 @@ fn install_only_binary_all_and_no_binary_all() { /// Binary dependencies in the cache should be reused when the user provides `--no-build`. #[test] fn install_no_binary_cache() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install a binary distribution. uv_snapshot!( @@ -3035,7 +3035,7 @@ fn install_no_binary_cache() { /// Respect `--only-binary` flags in `requirements.txt` #[test] fn only_binary_requirements_txt() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt @@ -3066,7 +3066,7 @@ fn only_binary_requirements_txt() { /// `--only-binary` does not apply to editable requirements #[test] fn only_binary_editable() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install the editable package. uv_snapshot!(context.filters(), context.pip_install() @@ -3090,7 +3090,7 @@ fn only_binary_editable() { /// `--only-binary` does not apply to editable requirements that depend on each other #[test] fn only_binary_dependent_editables() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let root_path = context .workspace_root .join("test/packages/dependent_locals"); @@ -3120,7 +3120,7 @@ fn only_binary_dependent_editables() { /// `--only-binary` does not apply to editable requirements, with a `setup.py` config #[test] fn only_binary_editable_setup_py() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install the editable package. uv_snapshot!(context.filters(), context.pip_install() @@ -3152,7 +3152,7 @@ fn only_binary_editable_setup_py() { /// don't propagate the `--prerelease` flag to the source distribution build regardless. #[test] fn no_prerelease_hint_source_builds() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2018-10-08"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2018-10-08"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -3186,7 +3186,7 @@ fn no_prerelease_hint_source_builds() -> Result<()> { #[test] fn cache_priority() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install a specific `idna` version. uv_snapshot!( @@ -3247,7 +3247,7 @@ fn cache_priority() { /// This test uses the default link semantics. (On macOS, this is `clone`.) #[test] fn install_executable() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.pip_install() .arg("pylint==3.0.0"), @" @@ -3281,7 +3281,7 @@ fn install_executable() { /// executable permissions are retained. #[test] fn install_executable_copy() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.pip_install() .arg("pylint==3.0.0") @@ -3317,7 +3317,7 @@ fn install_executable_copy() { /// executable permissions are retained. #[test] fn install_executable_hardlink() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.pip_install() .arg("pylint==3.0.0") @@ -3352,7 +3352,7 @@ fn install_executable_hardlink() { /// Install a package from the command line into a virtual environment, ignoring its dependencies. #[test] fn no_deps() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install Flask. uv_snapshot!(context.pip_install() @@ -3383,7 +3383,7 @@ fn no_deps() { /// dependencies. #[test] fn no_deps_editable() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install the editable version of Black. This should remove the registry-based version. uv_snapshot!(context.filters(), context.pip_install() @@ -3409,7 +3409,7 @@ fn no_deps_editable() { /// Avoid downgrading already-installed packages when `--upgrade` is provided. #[test] fn install_no_downgrade() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a local package named `idna`. let idna = context.temp_dir.child("idna"); @@ -3496,7 +3496,7 @@ fn install_no_downgrade() -> Result<()> { /// Upgrade a package. #[test] fn install_upgrade() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install an old version of anyio and httpcore. uv_snapshot!(context.pip_install() @@ -3593,7 +3593,7 @@ fn install_upgrade() { /// Install a package from a `requirements.txt` file, with a `constraints.txt` file. #[test] fn install_constraints_txt() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("anyio==3.7.0")?; @@ -3626,7 +3626,7 @@ fn install_constraints_txt() -> Result<()> { #[test] #[expect(clippy::disallowed_types)] fn install_constraints_txt_from_stdin() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("anyio==3.7.0")?; @@ -3659,7 +3659,7 @@ fn install_constraints_txt_from_stdin() -> Result<()> { /// Check that `tool.uv.constraint-dependencies` in `pyproject.toml` is respected. #[test] fn install_constraints_from_pyproject() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#"[project] @@ -3699,7 +3699,7 @@ fn install_constraints_from_pyproject() -> Result<()> { /// Install a package from a `requirements.txt` file, with an inline constraint. #[test] fn install_constraints_inline() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirementstxt = context.temp_dir.child("requirements.txt"); requirementstxt.write_str("anyio==3.7.0\n-c constraints.txt")?; @@ -3729,7 +3729,7 @@ fn install_constraints_inline() -> Result<()> { /// Install a package from a `constraints.txt` file on a remote http server. #[test] fn install_constraints_remote() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.pip_install() .arg("-c") @@ -3752,7 +3752,7 @@ fn install_constraints_remote() { /// to a remote http server. #[test] fn install_constraints_inline_remote() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirementstxt = context.temp_dir.child("requirements.txt"); requirementstxt.write_str("typing-extensions>=4.0\n-c https://raw.githubusercontent.com/apache/airflow/constraints-2-6/constraints-3.11.txt")?; @@ -3777,7 +3777,7 @@ fn install_constraints_inline_remote() -> Result<()> { /// Constrain a package that's included via an extra. #[test] fn install_constraints_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("flask[dotenv]")?; @@ -3814,7 +3814,7 @@ fn install_constraints_extra() -> Result<()> { #[test] fn install_constraints_respects_offline_mode() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.pip_install() .arg("--offline") @@ -3833,7 +3833,7 @@ fn install_constraints_respects_offline_mode() { #[test] #[cfg(feature = "test-git")] fn install_git_source_respects_offline_mode() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.pip_install() .arg("--offline") @@ -3854,7 +3854,7 @@ fn install_git_source_respects_offline_mode() { /// Build requirements should explain how to opt into prereleases when they are the only solution. #[test] fn build_prerelease_hint() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -3899,7 +3899,7 @@ fn build_prerelease_hint() -> Result<()> { /// skip resolution entirely). #[test] fn install_constraints_with_markers() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("pytest")?; @@ -3956,7 +3956,7 @@ fn install_constraints_with_markers() -> Result<()> { /// See: #[test] fn install_pinned_polars_invalid_metadata() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install Flask. uv_snapshot!(context.pip_install() @@ -3981,7 +3981,7 @@ fn install_pinned_polars_invalid_metadata() { /// requirements aren't resolved at their lowest compatible version. #[test] fn install_sdist_resolution_lowest() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio @ https://files.pythonhosted.org/packages/2d/b8/7333d87d5f03247215d86a86362fd3e324111788c6cdd8d2e6196a6ba833/anyio-4.2.0.tar.gz")?; @@ -4012,7 +4012,7 @@ fn install_sdist_resolution_lowest() -> Result<()> { /// See: #[test] fn direct_url_zip_file_bunk_permissions() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str( "opensafely-pipeline @ https://github.com/opensafely-core/pipeline/archive/refs/tags/v2023.11.06.145820.zip", @@ -4044,7 +4044,7 @@ fn direct_url_zip_file_bunk_permissions() -> Result<()> { #[test] fn launcher() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let project_root = fs_err::canonicalize(std::env::current_dir()?.join("../.."))?; let filters = [ @@ -4090,7 +4090,7 @@ fn launcher() -> Result<()> { #[test] fn launcher_with_symlink() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let project_root = fs_err::canonicalize(std::env::current_dir()?.join("../.."))?; let filters = [ @@ -4157,7 +4157,7 @@ fn launcher_with_symlink() -> Result<()> { #[test] fn config_settings_registry() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install with a `-C` flag. In this case, the flag has no impact on the build, but uv should // respect it anyway. @@ -4239,7 +4239,7 @@ fn config_settings_registry() { #[test] fn config_settings_path() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(&format!( @@ -4308,7 +4308,7 @@ fn reinstall_duplicate() -> Result<()> { use uv_fs::copy_dir_all; // Sync a version of `pip` into a virtual environment. - let context1 = TestContext::new("3.12"); + let context1 = uv_test::test_context!("3.12"); let requirements_txt = context1.temp_dir.child("requirements.txt"); requirements_txt.write_str("pip==21.3.1")?; @@ -4321,7 +4321,7 @@ fn reinstall_duplicate() -> Result<()> { .success(); // Sync a different version of `pip` into a virtual environment. - let context2 = TestContext::new("3.12"); + let context2 = uv_test::test_context!("3.12"); let requirements_txt = context2.temp_dir.child("requirements.txt"); requirements_txt.write_str("pip==22.1.1")?; @@ -4365,7 +4365,7 @@ fn reinstall_duplicate() -> Result<()> { /// Install a package that contains a symlink within the archive. #[test] fn install_symlink() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.pip_install() .arg("pgpdump==1.5") @@ -4400,7 +4400,7 @@ fn install_symlink() { #[test] fn invalidate_editable_on_change() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("-e ./editable")?; @@ -4487,7 +4487,7 @@ requires-python = ">=3.8" #[test] fn editable_dynamic() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("-e ./editable")?; @@ -4548,7 +4548,7 @@ dependencies = {file = ["dependencies.txt"]} #[test] fn invalidate_path_on_change() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("example @ ./editable")?; @@ -4635,7 +4635,7 @@ requires-python = ">=3.8" #[test] fn invalidate_path_on_cache_key() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("example @ ./editable")?; @@ -4820,7 +4820,7 @@ fn invalidate_path_on_cache_key() -> Result<()> { #[test] fn invalidate_path_on_commit() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("example @ ./editable")?; @@ -4919,7 +4919,7 @@ fn invalidate_path_on_commit() -> Result<()> { #[test] fn invalidate_path_on_env_var() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(".")?; @@ -4995,7 +4995,7 @@ fn invalidate_path_on_env_var() -> Result<()> { /// Install from a direct path (wheel) with changed versions in the file name. #[test] fn path_name_version_change() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.pip_install() .arg(context.workspace_root.join("test/links/ok-1.0.0-py3-none-any.whl")), @" @@ -5060,7 +5060,7 @@ fn path_name_version_change() { /// Install from a direct path (wheel) with the same name at a different path. #[test] fn path_changes_with_same_name() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let wheel = context .workspace_root @@ -5113,7 +5113,7 @@ fn path_changes_with_same_name() -> Result<()> { /// Ignore a URL dependency with a non-matching marker. #[test] fn editable_url_with_marker() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let editable_dir = context.temp_dir.child("editable"); editable_dir.create_dir_all()?; @@ -5155,7 +5155,7 @@ requires-python = ">=3.11,<3.13" /// Raise an error when an editable's `Requires-Python` constraint is not met. #[test] fn requires_python_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create an editable package with a `Requires-Python` constraint that is not met. let editable_dir = context.temp_dir.child("editable"); @@ -5192,7 +5192,7 @@ requires-python = ">=3.13" /// Install with `--no-build-isolation`, to disable isolation during PEP 517 builds. #[test] fn no_build_isolation() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio @ https://files.pythonhosted.org/packages/db/4d/3970183622f0330d3c23d9b8a5f52e365e50381fd484d08e3285104333d3/anyio-4.3.0.tar.gz")?; @@ -5265,7 +5265,7 @@ fn no_build_isolation() -> Result<()> { /// Ensure that `UV_NO_BUILD_ISOLATION` env var does the same as the `--no-build-isolation` flag #[test] fn respect_no_build_isolation_env_var() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio @ https://files.pythonhosted.org/packages/db/4d/3970183622f0330d3c23d9b8a5f52e365e50381fd484d08e3285104333d3/anyio-4.3.0.tar.gz")?; @@ -5340,7 +5340,7 @@ fn respect_no_build_isolation_env_var() -> Result<()> { /// Ref: #[test] fn install_utf16le_requirements() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-01T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-01T00:00:00Z"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_binary(&utf8_to_utf16_with_bom_le("tomli<=2.0.1"))?; @@ -5366,7 +5366,7 @@ fn install_utf16le_requirements() -> Result<()> { /// Ref: #[test] fn install_utf16be_requirements() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-01T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-01T00:00:00Z"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_binary(&utf8_to_utf16_with_bom_be("tomli<=2.0.1"))?; @@ -5409,7 +5409,7 @@ fn utf8_to_utf16_with_bom_be(s: &str) -> Vec { #[test] fn dry_run_install() -> std::result::Result<(), Box> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("httpx==0.25.1")?; @@ -5441,7 +5441,7 @@ fn dry_run_install() -> std::result::Result<(), Box> { #[test] fn dry_run_install_url_dependency() -> std::result::Result<(), Box> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("anyio @ https://files.pythonhosted.org/packages/2d/b8/7333d87d5f03247215d86a86362fd3e324111788c6cdd8d2e6196a6ba833/anyio-4.2.0.tar.gz")?; @@ -5469,7 +5469,7 @@ fn dry_run_install_url_dependency() -> std::result::Result<(), Box std::result::Result<(), Box> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("anyio @ https://files.pythonhosted.org/packages/2d/b8/7333d87d5f03247215d86a86362fd3e324111788c6cdd8d2e6196a6ba833/anyio-4.2.0.tar.gz")?; @@ -5520,7 +5520,7 @@ fn dry_run_uninstall_url_dependency() -> std::result::Result<(), Box std::result::Result<(), Box> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("httpx==0.25.1")?; @@ -5569,7 +5569,7 @@ fn dry_run_install_already_installed() -> std::result::Result<(), Box std::result::Result<(), Box> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("httpcore==1.0.2")?; @@ -5620,7 +5620,7 @@ fn dry_run_install_transitive_dependency_already_installed() #[test] fn dry_run_install_then_upgrade() -> std::result::Result<(), Box> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("httpx==0.25.0")?; @@ -5673,7 +5673,7 @@ fn dry_run_install_then_upgrade() -> std::result::Result<(), Box Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create an editable package with a `Requires-Python` constraint that is not met. let editable_dir = context.temp_dir.child("editable"); @@ -5709,7 +5709,7 @@ requires-python = ">=3.13" /// Install a package from an index that requires authentication #[test] fn install_package_basic_auth_from_url() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.pip_install() .arg("anyio") @@ -5736,7 +5736,7 @@ fn install_package_basic_auth_from_url() { /// Install a package from an index that requires authentication #[test] fn install_package_basic_auth_from_netrc_default() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let netrc = context.temp_dir.child(".netrc"); netrc.write_str("default login public password heron")?; @@ -5768,7 +5768,7 @@ fn install_package_basic_auth_from_netrc_default() -> Result<()> { /// Install a package from an index that requires authentication #[test] fn install_package_basic_auth_from_netrc() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let netrc = context.temp_dir.child(".netrc"); netrc.write_str("machine pypi-proxy.fly.dev login public password heron")?; @@ -5801,7 +5801,7 @@ fn install_package_basic_auth_from_netrc() -> Result<()> { /// Define the `--index-url` in the requirements file #[test] fn install_package_basic_auth_from_netrc_index_in_requirements() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let netrc = context.temp_dir.child(".netrc"); netrc.write_str("machine pypi-proxy.fly.dev login public password heron")?; @@ -5840,7 +5840,7 @@ anyio /// Install a package from an index that provides relative links #[test] fn install_index_with_relative_links() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.pip_install() .arg("anyio") @@ -5867,7 +5867,7 @@ fn install_index_with_relative_links() { /// Install a package from an index that requires authentication from the keyring. #[test] fn install_package_basic_auth_from_keyring() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install our keyring plugin context @@ -5914,7 +5914,7 @@ fn install_package_basic_auth_from_keyring() { /// but the keyring has the wrong password #[test] fn install_package_basic_auth_from_keyring_wrong_password() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install our keyring plugin context @@ -5957,7 +5957,7 @@ fn install_package_basic_auth_from_keyring_wrong_password() { /// but the keyring has the wrong username #[test] fn install_package_basic_auth_from_keyring_wrong_username() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install our keyring plugin context @@ -5999,7 +5999,7 @@ fn install_package_basic_auth_from_keyring_wrong_username() { /// Install a package from an index that provides relative links and requires authentication #[test] fn install_index_with_relative_links_authenticated() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.pip_install() .arg("anyio") @@ -6029,7 +6029,7 @@ fn install_index_with_relative_links_authenticated() { fn install_site_packages_mtime_updated() -> Result<()> { use std::os::unix::fs::MetadataExt; - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let site_packages = context.site_packages(); @@ -6073,7 +6073,7 @@ fn install_site_packages_mtime_updated() -> Result<()> { /// files. #[test] fn deptry_gitignore() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let source_dist_dir = context .workspace_root @@ -6107,7 +6107,7 @@ fn deptry_gitignore() { /// Reinstall an installed package with `--no-index` #[test] fn reinstall_no_index() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install anyio uv_snapshot!(context.pip_install() @@ -6164,7 +6164,7 @@ fn reinstall_no_index() { #[test] fn already_installed_remote_dependencies() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install anyio's dependencies. uv_snapshot!(context.pip_install() @@ -6204,7 +6204,7 @@ fn already_installed_remote_dependencies() { /// Install an editable package that depends on a previously installed editable package. #[test] fn already_installed_dependent_editable() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let root_path = context .workspace_root .join("test/packages/dependent_locals"); @@ -6310,7 +6310,7 @@ fn already_installed_dependent_editable() { /// Install a local package that depends on a previously installed local package. #[test] fn already_installed_local_path_dependent() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let root_path = context .workspace_root .join("test/packages/dependent_locals"); @@ -6479,7 +6479,7 @@ fn already_installed_local_path_dependent() { /// A local version of a package shadowing a remote package is installed. #[test] fn already_installed_local_version_of_remote_package() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let root_path = context.workspace_root.join("test/packages"); // Install the local anyio first @@ -6646,7 +6646,7 @@ fn already_installed_multiple_versions() -> Result<()> { context.pip_install().arg("anyio==3.7.0").assert().success(); // Install another version into another environment - let context_duplicate = TestContext::new("3.12"); + let context_duplicate = uv_test::test_context!("3.12"); context_duplicate .pip_install() .arg("anyio==4.0.0") @@ -6664,7 +6664,7 @@ fn already_installed_multiple_versions() -> Result<()> { Ok(()) } - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); prepare(&context)?; @@ -6714,7 +6714,7 @@ fn already_installed_multiple_versions() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn already_installed_remote_url() { - let context = TestContext::new(DEFAULT_PYTHON_VERSION); + let context = uv_test::test_context!(DEFAULT_PYTHON_VERSION); // First, install from the remote URL uv_snapshot!(context.filters(), context.pip_install().arg("uv-public-pypackage @ git+https://github.com/astral-test/uv-public-pypackage"), @" @@ -6837,7 +6837,7 @@ fn already_installed_remote_url() { /// Sync using `--find-links` with a local directory. #[test] fn find_links() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.pip_install() .arg("tqdm") @@ -6859,7 +6859,7 @@ fn find_links() { /// Sync using `--find-links` with a local directory, with wheels disabled. #[test] fn find_links_no_binary() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.pip_install() .arg("tqdm") @@ -6883,7 +6883,7 @@ fn find_links_no_binary() { /// Provide valid hashes for all dependencies with `--require-hashes`. #[test] fn require_hashes() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Write to a requirements file. let requirements_txt = context.temp_dir.child("requirements.txt"); @@ -6925,7 +6925,7 @@ fn require_hashes() -> Result<()> { /// Use `--require-hashes` when there are no hashes for build dependencies. #[test] fn require_hashes_build_dependencies() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Write to a requirements file. let requirements_txt = context.temp_dir.child("requirements.txt"); @@ -6968,7 +6968,7 @@ fn require_hashes_build_dependencies() -> Result<()> { /// Omit hashes for dependencies with `--require-hashes`, which is allowed with `--no-deps`. #[test] fn require_hashes_no_deps() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Write to a requirements file. let requirements_txt = context.temp_dir.child("requirements.txt"); @@ -7001,7 +7001,7 @@ fn require_hashes_no_deps() -> Result<()> { /// Provide the wrong hash with `--require-hashes`. #[test] fn require_hashes_mismatch() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Write to a requirements file. let requirements_txt = context.temp_dir.child("requirements.txt"); @@ -7048,7 +7048,7 @@ fn require_hashes_mismatch() -> Result<()> { /// Omit a transitive dependency in `--require-hashes`. #[test] fn require_hashes_missing_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Write to a requirements file. let requirements_txt = context.temp_dir.child("requirements.txt"); @@ -7076,7 +7076,7 @@ fn require_hashes_missing_dependency() -> Result<()> { /// We disallow `--require-hashes` for editables' dependencies. #[test] fn require_hashes_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(&indoc::formatdoc! {r" @@ -7105,7 +7105,7 @@ fn require_hashes_editable() -> Result<()> { /// If a hash is only included as a constraint, that's good enough for `--require-hashes`. #[test] fn require_hashes_constraint() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Include the hash in the constraint file. let requirements_txt = context.temp_dir.child("requirements.txt"); @@ -7135,7 +7135,7 @@ fn require_hashes_constraint() -> Result<()> { ); // Include the hash in the requirements file, but pin the version in the constraint file. - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str( @@ -7163,7 +7163,7 @@ fn require_hashes_constraint() -> Result<()> { ); // Include an empty intersection. This should fail. - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str( @@ -7191,7 +7191,7 @@ fn require_hashes_constraint() -> Result<()> { ); // Include the right hash in both files. - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str( @@ -7222,7 +7222,7 @@ fn require_hashes_constraint() -> Result<()> { ); // Include the right hash in both files, along with an irrelevant, wrong hash. - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str( @@ -7258,7 +7258,7 @@ fn require_hashes_constraint() -> Result<()> { /// We allow `--require-hashes` for unnamed URL dependencies. #[test] fn require_hashes_unnamed() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt @@ -7299,7 +7299,7 @@ fn require_hashes_unnamed() -> Result<()> { /// a repeat of a registered package. #[test] fn require_hashes_unnamed_repeated() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Re-run, but duplicate `anyio`. let requirements_txt = context.temp_dir.child("requirements.txt"); @@ -7345,7 +7345,7 @@ fn require_hashes_unnamed_repeated() -> Result<()> { /// TODO(charlie): This _should_ be allowed. It's a bug. #[test] fn require_hashes_override() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Include the hash in the override file. let requirements_txt = context.temp_dir.child("requirements.txt"); @@ -7402,7 +7402,7 @@ fn require_hashes_override() -> Result<()> { #[test] #[expect(clippy::disallowed_types)] fn install_with_overrides_from_stdin() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let overrides_txt = context.temp_dir.child("overrides.txt"); overrides_txt.write_str("anyio==4.0.0")?; @@ -7433,7 +7433,7 @@ fn install_with_overrides_from_stdin() -> Result<()> { #[test] #[expect(clippy::disallowed_types)] fn install_with_excludes_from_stdin() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let excludes_txt = context.temp_dir.child("excludes.txt"); excludes_txt.write_str("anyio>4.0.0")?; @@ -7460,7 +7460,7 @@ fn install_with_excludes_from_stdin() -> Result<()> { /// Critically, one package (`requests`) depends on another (`urllib3`). #[test] fn require_hashes_marker() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-01T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-01T00:00:00Z"); // Write to a requirements file. let requirements_txt = context.temp_dir.child("requirements.txt"); @@ -7598,7 +7598,7 @@ fn require_hashes_marker() -> Result<()> { /// Provide valid hashes for all dependencies with `--require-hashes`. #[test] fn verify_hashes() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Write to a requirements file. let requirements_txt = context.temp_dir.child("requirements.txt"); @@ -7640,7 +7640,7 @@ fn verify_hashes() -> Result<()> { /// Omit a pinned version with `--verify-hashes`. #[test] fn verify_hashes_missing_version() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Write to a requirements file. let requirements_txt = context.temp_dir.child("requirements.txt"); @@ -7682,7 +7682,7 @@ fn verify_hashes_missing_version() -> Result<()> { /// Provide the wrong hash with `--verify-hashes`. #[test] fn verify_hashes_mismatch() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(indoc::indoc! {r" @@ -7737,7 +7737,7 @@ fn verify_hashes_mismatch() -> Result<()> { /// Provide the correct hash with `--verify-hashes`. #[test] fn verify_hashes_match() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(indoc::indoc! {r" @@ -7768,7 +7768,7 @@ fn verify_hashes_match() -> Result<()> { /// Omit a transitive dependency in `--verify-hashes`. This is allowed. #[test] fn verify_hashes_omit_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Write to a requirements file. let requirements_txt = context.temp_dir.child("requirements.txt"); @@ -7801,7 +7801,7 @@ fn verify_hashes_omit_dependency() -> Result<()> { /// We allow `--verify-hashes` for editable dependencies. #[test] fn verify_hashes_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(&indoc::formatdoc! {r" @@ -7840,7 +7840,7 @@ fn verify_hashes_editable() -> Result<()> { /// Allow arguments within a `requirements.txt` file to be quoted or unquoted, as in the CLI. #[test] fn double_quoted_arguments() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let constraints_in = context.temp_dir.child("constraints.in"); constraints_in.write_str(indoc::indoc! {r" @@ -7875,7 +7875,7 @@ fn double_quoted_arguments() -> Result<()> { /// Allow arguments within a `requirements.txt` file to be quoted or unquoted, as in the CLI. #[test] fn single_quoted_arguments() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let constraints_in = context.temp_dir.child("constraints.in"); constraints_in.write_str(indoc::indoc! {r" @@ -7910,7 +7910,7 @@ fn single_quoted_arguments() -> Result<()> { /// Allow arguments within a `requirements.txt` file to be quoted or unquoted, as in the CLI. #[test] fn unquoted_arguments() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let constraints_in = context.temp_dir.child("constraints.in"); constraints_in.write_str(indoc::indoc! {r" @@ -7945,7 +7945,7 @@ fn unquoted_arguments() -> Result<()> { /// Allow arguments within a `requirements.txt` file to be quoted or unquoted, as in the CLI. #[test] fn concatenated_quoted_arguments() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let constraints_in = context.temp_dir.child("constraints.in"); constraints_in.write_str(indoc::indoc! {r" @@ -7980,7 +7980,7 @@ fn concatenated_quoted_arguments() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn tool_uv_sources() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Use a subdir to test path normalization. let require_path = "some_dir/pyproject.toml"; let pyproject_toml = context.temp_dir.child(require_path); @@ -8070,7 +8070,7 @@ fn tool_uv_sources() -> Result<()> { #[test] fn tool_uv_sources_is_in_preview() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" [project] @@ -8106,7 +8106,7 @@ fn tool_uv_sources_is_in_preview() -> Result<()> { /// Allow transitive URLs via recursive extras. #[test] fn recursive_extra_transitive_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -8144,7 +8144,7 @@ fn recursive_extra_transitive_url() -> Result<()> { /// If a package is requested as both editable and non-editable, always install it as editable. #[test] fn prefer_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.pip_install() .arg("-e") @@ -8166,7 +8166,7 @@ fn prefer_editable() -> Result<()> { let path = context.site_packages().join("black.pth"); assert!(path.is_file()); - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(&format!( @@ -8201,7 +8201,7 @@ fn prefer_editable() -> Result<()> { /// Resolve against a local directory laid out as a PEP 503-compatible index. #[test] fn local_index_absolute() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let root = context.temp_dir.child("simple-html"); fs_err::create_dir_all(&root)?; @@ -8252,7 +8252,7 @@ fn local_index_absolute() -> Result<()> { /// relative path on the CLI. #[test] fn local_index_relative() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let root = context.temp_dir.child("simple-html"); fs_err::create_dir_all(&root)?; @@ -8303,7 +8303,7 @@ fn local_index_relative() -> Result<()> { /// `requirements.txt` file. #[test] fn local_index_requirements_txt_absolute() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let root = context.temp_dir.child("simple-html"); fs_err::create_dir_all(&root)?; @@ -8359,7 +8359,7 @@ fn local_index_requirements_txt_absolute() -> Result<()> { /// relative path in a `requirements.txt` file. #[test] fn local_index_requirements_txt_relative() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let root = context.temp_dir.child("simple-html"); fs_err::create_dir_all(&root)?; @@ -8417,7 +8417,7 @@ fn local_index_requirements_txt_relative() -> Result<()> { /// the default index. #[test] fn local_index_fallback() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let root = context.temp_dir.child("simple-html"); fs_err::create_dir_all(&root)?; @@ -8461,7 +8461,7 @@ fn local_index_fallback() -> Result<()> { #[test] fn accept_existing_prerelease() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("Flask==2.0.0rc1")?; @@ -8505,7 +8505,7 @@ fn accept_existing_prerelease() -> Result<()> { /// Allow `pip install` of an unmanaged project. #[test] fn unmanaged() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#"[project] @@ -8541,7 +8541,7 @@ fn unmanaged() -> Result<()> { #[test] fn install_relocatable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Remake the venv as relocatable context @@ -8605,7 +8605,7 @@ fn install_relocatable() -> Result<()> { /// Install requesting Python 3.12 when the virtual environment uses 3.11 #[test] fn install_incompatible_python_version() { - let context = TestContext::new_with_versions(&["3.11", "3.12"]); + let context = uv_test::test_context_with_versions!(&["3.11", "3.12"]); // Initialize the virtual environment with 3.11 context.reset_venv(); @@ -8630,7 +8630,7 @@ fn install_incompatible_python_version() { fn install_incompatible_python_version_interpreter_broken_in_path() -> Result<()> { use std::os::unix::fs::PermissionsExt; - let context = TestContext::new_with_versions(&["3.11", "3.12"]); + let context = uv_test::test_context_with_versions!(&["3.11", "3.12"]); // Initialize the virtual environment with 3.11 context.reset_venv(); @@ -8705,7 +8705,7 @@ fn install_incompatible_python_version_interpreter_broken_in_path() -> Result<() /// Emit dedicated error message when installing Conda `environment.yml` #[test] fn install_unsupported_environment_yml() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let environment_yml = context.temp_dir.child("environment.yml"); environment_yml.write_str(indoc! {r" @@ -8731,7 +8731,7 @@ fn install_unsupported_environment_yml() -> Result<()> { /// Include a `build_constraints.txt` file with an incompatible constraint. #[test] fn incompatible_build_constraint() -> Result<()> { - let context = TestContext::new(DEFAULT_PYTHON_VERSION); + let context = uv_test::test_context!(DEFAULT_PYTHON_VERSION); let constraints_txt = context.temp_dir.child("build_constraints.txt"); constraints_txt.write_str("setuptools==1")?; @@ -8759,7 +8759,7 @@ fn incompatible_build_constraint() -> Result<()> { #[test] #[expect(clippy::disallowed_types)] fn incompatible_build_constraint_from_stdin() -> Result<()> { - let context = TestContext::new(DEFAULT_PYTHON_VERSION); + let context = uv_test::test_context!(DEFAULT_PYTHON_VERSION); let constraints_txt = context.temp_dir.child("build_constraints.txt"); constraints_txt.write_str("setuptools==1")?; @@ -8787,7 +8787,7 @@ fn incompatible_build_constraint_from_stdin() -> Result<()> { /// Include a `build_constraints.txt` file with a compatible constraint. #[test] fn compatible_build_constraint() -> Result<()> { - let context = TestContext::new("3.9"); + let context = uv_test::test_context!("3.9"); let constraints_txt = context.temp_dir.child("build_constraints.txt"); constraints_txt.write_str("setuptools>=40")?; @@ -8814,7 +8814,7 @@ fn compatible_build_constraint() -> Result<()> { /// Include `build-constraint-dependencies` in pyproject.toml with an incompatible constraint. #[test] fn incompatible_build_constraint_in_pyproject_toml() -> Result<()> { - let context = TestContext::new(DEFAULT_PYTHON_VERSION); + let context = uv_test::test_context!(DEFAULT_PYTHON_VERSION); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -8846,7 +8846,7 @@ build-constraint-dependencies = [ #[cfg(feature = "test-python-eol")] #[test] fn compatible_build_constraint_in_pyproject_toml() -> Result<()> { - let context = TestContext::new("3.8"); + let context = uv_test::test_context!("3.8"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -8877,7 +8877,7 @@ build-constraint-dependencies = [ /// Merge `build_constraints.txt` with `build-constraint-dependencies` in pyproject.toml with an incompatible constraint. #[test] fn incompatible_build_constraint_merged_with_pyproject_toml() -> Result<()> { - let context = TestContext::new(DEFAULT_PYTHON_VERSION); + let context = uv_test::test_context!(DEFAULT_PYTHON_VERSION); // Incompatible setuptools version in pyproject.toml, compatible in build_constraints.txt. let constraints_txt = context.temp_dir.child("build_constraints.txt"); @@ -8941,7 +8941,7 @@ build-constraint-dependencies = [ /// Merge `build_constraints.txt` with `build-constraint-dependencies` in pyproject.toml with a compatible constraint. #[test] fn compatible_build_constraint_merged_with_pyproject_toml() -> Result<()> { - let context = TestContext::new("3.9"); + let context = uv_test::test_context!("3.9"); let constraints_txt = context.temp_dir.child("build_constraints.txt"); constraints_txt.write_str("setuptools>=40")?; @@ -8974,7 +8974,7 @@ build-constraint-dependencies = [ #[test] fn install_build_isolation_package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a package. let package = context.temp_dir.child("project"); @@ -9064,7 +9064,7 @@ fn install_build_isolation_package() -> Result<()> { /// Install a package with an unsupported extension. #[test] fn invalid_extension() { - let context = TestContext::new(DEFAULT_PYTHON_VERSION); + let context = uv_test::test_context!(DEFAULT_PYTHON_VERSION); uv_snapshot!(context.filters(), context.pip_install() .arg("ruff @ https://files.pythonhosted.org/packages/f7/69/96766da2cdb5605e6a31ef2734aff0be17901cefb385b885c2ab88896d76/ruff-0.5.6.tar.baz") @@ -9084,7 +9084,7 @@ fn invalid_extension() { /// Install a package without unsupported extension. #[test] fn no_extension() { - let context = TestContext::new(DEFAULT_PYTHON_VERSION); + let context = uv_test::test_context!(DEFAULT_PYTHON_VERSION); uv_snapshot!(context.filters(), context.pip_install() .arg("ruff @ https://files.pythonhosted.org/packages/f7/69/96766da2cdb5605e6a31ef2734aff0be17901cefb385b885c2ab88896d76/ruff-0.5.6") @@ -9104,7 +9104,7 @@ fn no_extension() { /// Regression test for: #[test] fn switch_python_version() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("iniconfig ; python_version == '3.12'")?; @@ -9153,7 +9153,7 @@ fn switch_python_version() -> Result<()> { #[test] #[cfg(feature = "test-slow")] fn stale_egg_info() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a project with dynamic metadata (version). let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -9225,7 +9225,7 @@ fn stale_egg_info() -> Result<()> { /// See: #[test] fn avoid_cached_wheel() { - let context = TestContext::new_with_versions(&["3.10", "3.11"]); + let context = uv_test::test_context_with_versions!(&["3.10", "3.11"]); // Create a Python 3.10 environment. context @@ -9288,7 +9288,7 @@ fn avoid_cached_wheel() { /// uninstall the second "version", we can't find the `egg-info` directory. #[test] fn missing_top_level() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.pip_install() .arg("suds-community==0.8.5"), @" @@ -9323,7 +9323,7 @@ fn missing_top_level() { /// Show a dedicated error when the user attempts to install `sklearn`. #[test] fn sklearn() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.pip_install().arg("sklearn"), @" success: false @@ -9360,7 +9360,7 @@ fn sklearn() { #[test] fn resolve_derivation_chain() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -9419,7 +9419,7 @@ fn resolve_derivation_chain() -> Result<()> { /// Ensure that `UV_NO_INSTALLER_METADATA` env var is respected. #[test] fn respect_no_installer_metadata_env_var() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install urllib3. uv_snapshot!(context.pip_install() @@ -9451,7 +9451,7 @@ fn respect_no_installer_metadata_env_var() { /// Check that we error if a source dist lies about its built wheel version. #[test] fn test_dynamic_version_sdist_wrong_version() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Write a source dist that has a version in its name, a dynamic version in pyproject.toml, // but reports the wrong version when built. @@ -9510,7 +9510,7 @@ fn test_dynamic_version_sdist_wrong_version() -> Result<()> { /// should choose the wheel with the highest build tag. #[test] fn build_tag() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.pip_install() .arg("build-tag") @@ -9544,7 +9544,7 @@ fn build_tag() { #[test] fn missing_git_prefix() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.touch()?; @@ -9568,7 +9568,7 @@ fn missing_git_prefix() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn missing_subdirectory_git() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.touch()?; @@ -9589,7 +9589,7 @@ fn missing_subdirectory_git() -> Result<()> { #[test] fn missing_subdirectory_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.touch()?; @@ -9612,7 +9612,7 @@ fn missing_subdirectory_url() -> Result<()> { // (Could be replaced with a checked-in hand-crafted corrupt wheel?) #[test] fn bad_crc32() -> Result<()> { - let context = TestContext::new("3.11"); + let context = uv_test::test_context!("3.11"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.touch()?; @@ -9636,7 +9636,7 @@ fn bad_crc32() -> Result<()> { #[test] fn static_metadata_pyproject_toml() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context.temp_dir.child("pyproject.toml").write_str( r#" @@ -9675,7 +9675,7 @@ fn static_metadata_pyproject_toml() -> Result<()> { #[test] fn static_metadata_source_tree() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context.temp_dir.child("pyproject.toml").write_str( r#" @@ -9716,7 +9716,7 @@ fn static_metadata_source_tree() -> Result<()> { /// Regression test for: #[test] fn static_metadata_already_installed() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context.temp_dir.child("pyproject.toml").write_str( r#" @@ -9772,7 +9772,7 @@ fn static_metadata_already_installed() -> Result<()> { /// `circular-one` was a runtime dependency. #[test] fn cyclic_build_dependency() { - let context = TestContext::new("3.13").with_exclude_newer("2025-01-02T00:00:00Z"); + let context = uv_test::test_context!("3.13").with_exclude_newer("2025-01-02T00:00:00Z"); // Installing with `--no-binary circular-one` should fail, since we'll end up in a recursive // build. @@ -9819,7 +9819,7 @@ fn cyclic_build_dependency() { #[test] #[cfg(feature = "test-git")] fn direct_url_json_git_default() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str( "uv-public-pypackage @ git+https://github.com/astral-test/uv-public-pypackage", @@ -9857,7 +9857,7 @@ fn direct_url_json_git_default() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn direct_url_json_git_tag() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str( "uv-public-pypackage @ git+https://github.com/astral-test/uv-public-pypackage@0.0.1", @@ -9894,7 +9894,7 @@ fn direct_url_json_git_tag() -> Result<()> { #[test] fn direct_url_json_direct_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str( "source-distribution @ https://files.pythonhosted.org/packages/1f/e5/5b016c945d745f8b108e759d428341488a6aee8f51f07c6c4e33498bb91f/source_distribution-0.0.3.tar.gz", @@ -9933,7 +9933,7 @@ fn direct_url_json_direct_url() -> Result<()> { fn dependency_group() -> Result<()> { // testing basic `uv pip install --group` functionality fn new_context() -> Result { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -10079,7 +10079,7 @@ fn dependency_group() -> Result<()> { #[test] fn recursive_dependency_group() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Test a self-referencing group. let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -10150,7 +10150,7 @@ fn virtual_dependency_group() -> Result<()> { // testing basic `uv pip install --group` functionality // when the pyproject.toml is virtual fn new_context() -> Result { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -10186,7 +10186,7 @@ fn virtual_dependency_group() -> Result<()> { fn many_pyproject_group() -> Result<()> { // `uv pip install --group` tests with multiple projects fn new_context() -> Result { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -10276,7 +10276,7 @@ fn many_pyproject_group() -> Result<()> { fn other_sources_group() -> Result<()> { // `uv pip install --group` tests just slamming random other sources like -e and . fn new_context() -> Result { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -10344,7 +10344,7 @@ fn suspicious_group() -> Result<()> { // uv pip compile --group tests, where the invocations are suspicious // and we might want to add warnings fn new_context() -> Result { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -10461,7 +10461,7 @@ fn suspicious_group() -> Result<()> { fn invalid_group() -> Result<()> { // uv pip compile --group tests, where the invocations should fail fn new_context() -> Result { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -10557,7 +10557,7 @@ fn invalid_group() -> Result<()> { fn project_and_group() -> Result<()> { // Checking that --project is handled properly with --group fn new_context() -> Result { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -10675,7 +10675,7 @@ fn project_and_group() -> Result<()> { fn directory_and_group() -> Result<()> { // Checking that --directory is handled properly with --group fn new_context() -> Result { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -10785,7 +10785,7 @@ fn directory_and_group() -> Result<()> { /// we ignore them. #[test] fn no_sources_workspace_discovery() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context.temp_dir.child("pyproject.toml").write_str(indoc! { r#" [project] @@ -10952,7 +10952,7 @@ fn no_sources_workspace_discovery() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn pip_install_no_sources_package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context.temp_dir.child("pyproject.toml").write_str(indoc! { r#" [project] @@ -11001,7 +11001,7 @@ fn pip_install_no_sources_package() -> Result<()> { #[test] fn unsupported_git_scheme() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.pip_install() .arg("git+fantasy://foo"), @" success: false @@ -11020,7 +11020,7 @@ fn unsupported_git_scheme() { /// Modify a project to use a `src` layout. #[test] fn change_layout_src() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("-e .")?; @@ -11114,7 +11114,7 @@ fn change_layout_src() -> Result<()> { /// Modify a custom directory in the cache keys. #[test] fn change_layout_custom_directory() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("-e .")?; @@ -11233,7 +11233,7 @@ fn change_layout_custom_directory() -> Result<()> { #[test] fn pep_751_install_registry_wheel() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -11286,7 +11286,7 @@ fn pep_751_install_registry_wheel() -> Result<()> { #[test] fn pep_751_install_registry_sdist() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-29T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-29T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -11339,7 +11339,7 @@ fn pep_751_install_registry_sdist() -> Result<()> { #[test] fn pep_751_install_directory() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a local dependency in a subdirectory. let pyproject_toml = context.temp_dir.child("foo").child("pyproject.toml"); @@ -11421,7 +11421,7 @@ fn pep_751_install_directory() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn pep_751_install_git() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -11474,7 +11474,7 @@ fn pep_751_install_git() -> Result<()> { #[test] fn pep_751_install_url_wheel() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -11529,7 +11529,7 @@ fn pep_751_install_url_wheel() -> Result<()> { #[test] fn pep_751_install_url_sdist() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -11584,7 +11584,7 @@ fn pep_751_install_url_sdist() -> Result<()> { #[test] fn pep_751_install_path_wheel() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Download the source. let archive = context.temp_dir.child("iniconfig-2.0.0-py3-none-any.whl"); @@ -11667,7 +11667,7 @@ fn pep_751_install_path_wheel() -> Result<()> { #[test] fn pep_751_install_path_sdist() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Download the source. let archive = context.temp_dir.child("iniconfig-2.0.0.tar.gz"); @@ -11730,7 +11730,7 @@ fn pep_751_install_path_sdist() -> Result<()> { #[test] fn pep_751_hash_mismatch() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Download the source. let archive = context.temp_dir.child("iniconfig-2.0.0-py3-none-any.whl"); @@ -11778,7 +11778,7 @@ fn pep_751_hash_mismatch() -> Result<()> { #[test] fn pep_751_mix() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -11858,7 +11858,7 @@ fn pep_751_mix() -> Result<()> { #[test] fn pep_751_multiple_sources() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pylock_toml = context.temp_dir.child("pylock.toml"); pylock_toml.write_str(r#" @@ -11895,7 +11895,7 @@ fn pep_751_multiple_sources() -> Result<()> { #[test] fn pep_751_groups() -> Result<()> { - let context = TestContext::new("3.13"); + let context = uv_test::test_context!("3.13"); let pylock_toml = context.temp_dir.child("pylock.toml"); pylock_toml.write_str( @@ -12094,7 +12094,7 @@ requires_python = "==3.13.*" #[test] fn pep_751_requires_python() -> Result<()> { - let context = TestContext::new_with_versions(&["3.12", "3.13"]); + let context = uv_test::test_context_with_versions!(&["3.12", "3.13"]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -12140,7 +12140,7 @@ fn pep_751_requires_python() -> Result<()> { /// Test that uv doesn't hang if an index returns a distribution for the wrong package. #[tokio::test] async fn bogus_redirect() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let redirect_server = MockServer::start().await; @@ -12173,7 +12173,7 @@ async fn bogus_redirect() -> Result<()> { #[test] fn reserved_script_name() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -12248,7 +12248,7 @@ fn reserved_script_name() -> Result<()> { #[test] fn pep_751_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pylock_toml = context.temp_dir.child("pylock.toml"); pylock_toml.write_str(r#" @@ -12305,7 +12305,7 @@ fn pep_751_dependency() -> Result<()> { /// which are not caught by clap. #[test] fn conflicting_flags_clap_bug() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.command() .arg("pip") @@ -12326,7 +12326,7 @@ fn conflicting_flags_clap_bug() { /// Test that `--offline` and `--refresh` conflict. #[test] fn offline_refresh_conflict() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.pip_install() .arg("tqdm") @@ -12346,7 +12346,7 @@ fn offline_refresh_conflict() { #[test] #[cfg(unix)] fn strip_shebang_arguments() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let project_dir = context.temp_dir.child("shebang_test"); project_dir.create_dir_all()?; @@ -12452,7 +12452,7 @@ fn strip_shebang_arguments() -> Result<()> { #[test] fn install_python_preference() { let context = - TestContext::new_with_versions(&["3.12", "3.11"]).with_versions_as_managed(&["3.12"]); + uv_test::test_context_with_versions!(&["3.12", "3.11"]).with_versions_as_managed(&["3.12"]); // Create a managed interpreter environment uv_snapshot!(context.filters(), context.venv(), @" @@ -12506,7 +12506,7 @@ fn install_python_preference() { #[test] fn config_settings_package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(&format!( @@ -12617,7 +12617,7 @@ fn config_settings_package() -> Result<()> { #[test] fn reject_invalid_archive_member_names() { - let context = TestContext::new("3.12").with_exclude_newer("2025-10-07T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-10-07T00:00:00Z"); uv_snapshot!(context.filters(), context.pip_install() .arg("cbwheeldiff2==0.0.1"), @" @@ -12636,7 +12636,7 @@ fn reject_invalid_archive_member_names() { #[test] fn reject_invalid_streaming_zip() { - let context = TestContext::new("3.12").with_exclude_newer("2025-07-10T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-07-10T00:00:00Z"); uv_snapshot!(context.filters(), context.pip_install() .arg("cbwheelstreamtest==0.0.1"), @" @@ -12655,7 +12655,7 @@ fn reject_invalid_streaming_zip() { #[test] fn reject_invalid_double_zip() { - let context = TestContext::new("3.12").with_exclude_newer("2025-07-10T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-07-10T00:00:00Z"); uv_snapshot!(context.filters(), context.pip_install() .arg("cbwheelziptest==0.0.2"), @" @@ -12674,7 +12674,7 @@ fn reject_invalid_double_zip() { #[test] fn reject_invalid_central_directory_offset() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.pip_install() .arg("attrs @ https://pub-c6f28d316acd406eae43501e51ad30fa.r2.dev/zip1/attrs-25.3.0-py3-none-any.whl"), @" @@ -12694,7 +12694,7 @@ fn reject_invalid_central_directory_offset() { #[test] fn reject_invalid_crc32_mismatch() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.pip_install() .arg("attrs @ https://pub-c6f28d316acd406eae43501e51ad30fa.r2.dev/zip2/attrs-25.3.0-py3-none-any.whl"), @" @@ -12713,7 +12713,7 @@ fn reject_invalid_crc32_mismatch() { #[test] fn reject_invalid_crc32_non_data_descriptor() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.pip_install() .arg("attrs @ https://pub-c6f28d316acd406eae43501e51ad30fa.r2.dev/zip3/attrs-25.3.0-py3-none-any.whl"), @" @@ -12732,7 +12732,7 @@ fn reject_invalid_crc32_non_data_descriptor() { #[test] fn reject_invalid_duplicate_extra_field() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.pip_install() .arg("attrs @ https://pub-c6f28d316acd406eae43501e51ad30fa.r2.dev/zip4/attrs-25.3.0-py3-none-any.whl"), @" @@ -12750,7 +12750,7 @@ fn reject_invalid_duplicate_extra_field() { #[test] fn reject_invalid_short_usize() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.pip_install() .arg("attrs @ https://pub-c6f28d316acd406eae43501e51ad30fa.r2.dev/zip5/attrs-25.3.0-py3-none-any.whl"), @" @@ -12769,7 +12769,7 @@ fn reject_invalid_short_usize() { #[test] fn reject_invalid_chained_extra_field() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.pip_install() .arg("attrs @ https://pub-c6f28d316acd406eae43501e51ad30fa.r2.dev/zip6/attrs-25.3.0-py3-none-any.whl"), @" @@ -12787,7 +12787,7 @@ fn reject_invalid_chained_extra_field() { #[test] fn reject_invalid_short_usize_zip64() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.pip_install() .arg("attrs @ https://pub-c6f28d316acd406eae43501e51ad30fa.r2.dev/zip7/attrs-25.3.0-py3-none-any.whl"), @" @@ -12806,7 +12806,7 @@ fn reject_invalid_short_usize_zip64() { /// Regression test for: #[test] fn already_installed_url_dependency_no_sources() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); context .temp_dir @@ -12887,7 +12887,7 @@ fn already_installed_url_dependency_no_sources() -> Result<()> { /// Test that build dependencies respect locked versions from the resolution. #[test] fn pip_install_build_dependencies_respect_locked_versions() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); // Write a test package that arbitrarily requires `anyio` at build time let child = context.temp_dir.child("child"); @@ -13077,7 +13077,7 @@ fn pip_install_build_dependencies_respect_locked_versions() -> Result<()> { /// packages. #[test] fn overlapping_packages_warning() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let built_by_uv = context.workspace_root.join("test/packages/built-by-uv"); @@ -13227,7 +13227,7 @@ fn overlapping_packages_warning() -> Result<()> { /// Don't warn for improperly built namespace packages with overlapping empty `__init__.py`. #[test] fn overlapping_empty_init_py() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let gpu_a = context.temp_dir.child("gpu-a"); gpu_a.child("pyproject.toml").write_str( @@ -13312,7 +13312,7 @@ fn overlapping_empty_init_py() -> Result<()> { /// Warn for conflicting files even nested in namespace packages. #[test] fn overlapping_nested_files() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let gpu_a = context.temp_dir.child("gpu-a"); gpu_a.child("pyproject.toml").write_str( @@ -13408,7 +13408,7 @@ fn overlapping_nested_files() -> Result<()> { /// in a module directory. #[test] fn overlapping_file_without_enclosing_directory() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let gpu_a = context.temp_dir.child("gpu-a"); gpu_a.child("pyproject.toml").write_str( @@ -13481,7 +13481,7 @@ fn overlapping_file_without_enclosing_directory() -> Result<()> { /// See: #[test] fn transitive_dependency_config_settings_invalidation() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a local package named `idna`. context @@ -13547,7 +13547,7 @@ fn transitive_dependency_config_settings_invalidation() -> Result<()> { #[test] fn switch_platform() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.pip_install() .arg("cffi") @@ -13612,7 +13612,7 @@ fn switch_platform() { /// See: #[test] fn pip_install_no_sources_editable_to_registry_switch() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a simple local package. let local_pkg = context.temp_dir.child("local_pkg"); @@ -13677,7 +13677,7 @@ fn pip_install_no_sources_editable_to_registry_switch() -> Result<()> { #[cfg(all(feature = "test-python-managed", not(windows)))] #[test] fn install_with_system_interpreter() { - let context = TestContext::new_with_versions(&[]) + let context = uv_test::test_context_with_versions!(&[]) .with_python_download_cache() .with_managed_python_dirs() .with_filtered_python_keys(); @@ -13708,7 +13708,7 @@ fn install_with_system_interpreter() { #[test] fn install_missing_python_no_target() { // Create a context that only has Python 3.11 available. - let context = TestContext::new("3.11") + let context = uv_test::test_context!("3.11") .with_python_download_cache() .with_managed_python_dirs(); @@ -13731,7 +13731,7 @@ fn install_missing_python_no_target() { #[test] fn install_missing_python_with_target() { // Create a context with no installed python interpreters. - let context = TestContext::new_with_versions(&[]) + let context = uv_test::test_context_with_versions!(&[]) .with_python_download_cache() .with_managed_python_dirs() .with_filtered_latest_python_versions(); @@ -13761,7 +13761,7 @@ fn install_missing_python_with_target() { #[test] fn install_missing_python_version_with_target() { // Create a context that only has Python 3.11 available. - let context = TestContext::new("3.11") + let context = uv_test::test_context!("3.11") .with_python_download_cache() .with_managed_python_dirs(); @@ -13794,7 +13794,7 @@ fn install_missing_python_version_with_target() { /// runs on the host, not the target, we accept wheel platforms for the host. #[test] fn build_backend_wrong_wheel_platform() -> Result<()> { - let context = TestContext::new_with_versions(&["3.12", "3.13"]) + let context = uv_test::test_context_with_versions!(&["3.12", "3.13"]) .with_filter((r" on [^ ]+ [^ ]+\.", " on [ARCH] [OS].")) .with_filter((r" on [^ ]+ [^ ]+$", " on [ARCH] [OS]")); @@ -13990,7 +13990,7 @@ fn build_backend_wrong_wheel_platform() -> Result<()> { /// See . #[test] fn record_uses_forward_slashes() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a package with scripts via uv_build data directory. let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -14052,7 +14052,7 @@ fn record_uses_forward_slashes() -> Result<()> { /// Free-threaded Python has a different ABI, so wheels must be built specifically for it. #[test] fn abi_compatibility_on_freethreaded_python() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_managed_python_dirs() .with_python_download_cache() diff --git a/crates/uv/tests/it/pip_install_scenarios.rs b/crates/uv/tests/it/pip_install_scenarios.rs index 9f95901be..4b9c0c5d0 100644 --- a/crates/uv/tests/it/pip_install_scenarios.rs +++ b/crates/uv/tests/it/pip_install_scenarios.rs @@ -9,7 +9,7 @@ use std::process::Command; use uv_static::EnvVars; -use crate::common::{TestContext, build_vendor_links_url, packse_index_url, uv_snapshot}; +use uv_test::{TestContext, build_vendor_links_url, packse_index_url, uv_snapshot}; /// Create a `pip install` command with options shared across all scenarios. fn command(context: &TestContext) -> Command { @@ -37,7 +37,7 @@ fn command(context: &TestContext) -> Command { /// ``` #[test] fn requires_exact_version_does_not_exist() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -73,7 +73,7 @@ fn requires_exact_version_does_not_exist() { /// ``` #[test] fn requires_greater_version_does_not_exist() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -110,7 +110,7 @@ fn requires_greater_version_does_not_exist() { /// ``` #[test] fn requires_less_version_does_not_exist() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -143,7 +143,7 @@ fn requires_less_version_does_not_exist() { /// ``` #[test] fn requires_package_does_not_exist() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -180,7 +180,7 @@ fn requires_package_does_not_exist() { /// ``` #[test] fn transitive_requires_package_does_not_exist() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -262,7 +262,7 @@ fn transitive_requires_package_does_not_exist() { /// ``` #[test] fn dependency_excludes_non_contiguous_range_of_compatible_versions() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -365,7 +365,7 @@ fn dependency_excludes_non_contiguous_range_of_compatible_versions() { /// ``` #[test] fn dependency_excludes_range_of_compatible_versions() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -442,7 +442,7 @@ fn dependency_excludes_range_of_compatible_versions() { /// ``` #[test] fn excluded_only_compatible_version() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -495,7 +495,7 @@ fn excluded_only_compatible_version() { /// ``` #[test] fn excluded_only_version() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -558,7 +558,7 @@ fn excluded_only_version() { /// ``` #[test] fn all_extras_required() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -609,7 +609,7 @@ fn all_extras_required() { /// ``` #[test] fn extra_does_not_exist_backtrack() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -659,7 +659,7 @@ fn extra_does_not_exist_backtrack() { /// ``` #[test] fn extra_incompatible_with_extra_not_requested() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -710,7 +710,7 @@ fn extra_incompatible_with_extra_not_requested() { /// ``` #[test] fn extra_incompatible_with_extra() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -757,7 +757,7 @@ fn extra_incompatible_with_extra() { /// ``` #[test] fn extra_incompatible_with_root() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -802,7 +802,7 @@ fn extra_incompatible_with_root() { /// ``` #[test] fn extra_required() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -841,7 +841,7 @@ fn extra_required() { /// ``` #[test] fn missing_extra() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -892,7 +892,7 @@ fn missing_extra() { /// ``` #[test] fn multiple_extras_required() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -936,7 +936,7 @@ fn multiple_extras_required() { /// ``` #[test] fn direct_incompatible_versions() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -977,7 +977,7 @@ fn direct_incompatible_versions() { /// ``` #[test] fn transitive_incompatible_versions() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1020,7 +1020,7 @@ fn transitive_incompatible_versions() { /// ``` #[test] fn transitive_incompatible_with_root_version() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1069,7 +1069,7 @@ fn transitive_incompatible_with_root_version() { /// ``` #[test] fn transitive_incompatible_with_transitive() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1110,7 +1110,7 @@ fn transitive_incompatible_with_transitive() { /// ``` #[test] fn local_greater_than_or_equal() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1148,7 +1148,7 @@ fn local_greater_than_or_equal() { /// ``` #[test] fn local_greater_than() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1185,7 +1185,7 @@ fn local_greater_than() { /// ``` #[test] fn local_less_than_or_equal() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1223,7 +1223,7 @@ fn local_less_than_or_equal() { /// ``` #[test] fn local_less_than() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1262,7 +1262,7 @@ fn local_less_than() { /// ``` #[test] fn local_not_latest() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1301,7 +1301,7 @@ fn local_not_latest() { /// ``` #[test] fn local_not_used_with_sdist() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1341,7 +1341,7 @@ fn local_not_used_with_sdist() { /// ``` #[test] fn local_simple() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1391,7 +1391,7 @@ fn local_simple() { /// ``` #[test] fn local_transitive_backtrack() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1439,7 +1439,7 @@ fn local_transitive_backtrack() { /// ``` #[test] fn local_transitive_conflicting() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1485,7 +1485,7 @@ fn local_transitive_conflicting() { /// ``` #[test] fn local_transitive_confounding() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1533,7 +1533,7 @@ fn local_transitive_confounding() { /// ``` #[test] fn local_transitive_greater_than_or_equal() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1581,7 +1581,7 @@ fn local_transitive_greater_than_or_equal() { /// ``` #[test] fn local_transitive_greater_than() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1627,7 +1627,7 @@ fn local_transitive_greater_than() { /// ``` #[test] fn local_transitive_less_than_or_equal() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1675,7 +1675,7 @@ fn local_transitive_less_than_or_equal() { /// ``` #[test] fn local_transitive_less_than() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1721,7 +1721,7 @@ fn local_transitive_less_than() { /// ``` #[test] fn local_transitive() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1764,7 +1764,7 @@ fn local_transitive() { /// ``` #[test] fn local_used_without_sdist() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1803,7 +1803,7 @@ fn local_used_without_sdist() { /// ``` #[test] fn post_equal_available() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1842,7 +1842,7 @@ fn post_equal_available() { /// ``` #[test] fn post_equal_not_available() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1879,7 +1879,7 @@ fn post_equal_not_available() { /// ``` #[test] fn post_greater_than_or_equal_post() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1917,7 +1917,7 @@ fn post_greater_than_or_equal_post() { /// ``` #[test] fn post_greater_than_or_equal() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1957,7 +1957,7 @@ fn post_greater_than_or_equal() { /// ``` #[test] fn post_greater_than_post_not_available() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -1993,7 +1993,7 @@ fn post_greater_than_post_not_available() { /// ``` #[test] fn post_greater_than_post() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2031,7 +2031,7 @@ fn post_greater_than_post() { /// ``` #[test] fn post_greater_than() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2066,7 +2066,7 @@ fn post_greater_than() { /// ``` #[test] fn post_less_than_or_equal() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2101,7 +2101,7 @@ fn post_less_than_or_equal() { /// ``` #[test] fn post_less_than() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2137,7 +2137,7 @@ fn post_less_than() { /// ``` #[test] fn post_local_greater_than_post() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2173,7 +2173,7 @@ fn post_local_greater_than_post() { /// ``` #[test] fn post_local_greater_than() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2208,7 +2208,7 @@ fn post_local_greater_than() { /// ``` #[test] fn post_simple() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2247,7 +2247,7 @@ fn post_simple() { /// ``` #[test] fn package_multiple_prereleases_kinds() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2289,7 +2289,7 @@ fn package_multiple_prereleases_kinds() { /// ``` #[test] fn package_multiple_prereleases_numbers() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2329,7 +2329,7 @@ fn package_multiple_prereleases_numbers() { /// ``` #[test] fn package_only_prereleases_boundary() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2368,7 +2368,7 @@ fn package_only_prereleases_boundary() { /// ``` #[test] fn package_only_prereleases_in_range() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2406,7 +2406,7 @@ fn package_only_prereleases_in_range() { /// ``` #[test] fn package_only_prereleases() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2450,7 +2450,7 @@ fn package_only_prereleases() { /// ``` #[test] fn package_prerelease_specified_mixed_available() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2492,7 +2492,7 @@ fn package_prerelease_specified_mixed_available() { /// ``` #[test] fn package_prerelease_specified_only_final_available() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2540,7 +2540,7 @@ fn package_prerelease_specified_only_final_available() { /// ``` #[test] fn package_prerelease_specified_only_prerelease_available() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2586,7 +2586,7 @@ fn package_prerelease_specified_only_prerelease_available() { /// ``` #[test] fn package_prereleases_boundary() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2627,7 +2627,7 @@ fn package_prereleases_boundary() { /// ``` #[test] fn package_prereleases_global_boundary() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2672,7 +2672,7 @@ fn package_prereleases_global_boundary() { /// ``` #[test] fn package_prereleases_specifier_boundary() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2711,7 +2711,7 @@ fn package_prereleases_specifier_boundary() { /// ``` #[test] fn requires_package_only_prereleases_in_range_global_opt_in() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2756,7 +2756,7 @@ fn requires_package_only_prereleases_in_range_global_opt_in() { /// ``` #[test] fn requires_package_prerelease_and_final_any() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2802,7 +2802,7 @@ fn requires_package_prerelease_and_final_any() { /// ``` #[test] fn transitive_package_only_prereleases_in_range_opt_in() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2857,7 +2857,7 @@ fn transitive_package_only_prereleases_in_range_opt_in() { /// ``` #[test] fn transitive_package_only_prereleases_in_range() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2900,7 +2900,7 @@ fn transitive_package_only_prereleases_in_range() { /// ``` #[test] fn transitive_package_only_prereleases() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -2976,7 +2976,7 @@ fn transitive_package_only_prereleases() { /// ``` #[test] fn transitive_prerelease_and_stable_dependency_many_versions_holes() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -3071,7 +3071,7 @@ fn transitive_prerelease_and_stable_dependency_many_versions_holes() { /// ``` #[test] fn transitive_prerelease_and_stable_dependency_many_versions() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -3131,7 +3131,7 @@ fn transitive_prerelease_and_stable_dependency_many_versions() { /// ``` #[test] fn transitive_prerelease_and_stable_dependency_opt_in() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -3198,7 +3198,7 @@ fn transitive_prerelease_and_stable_dependency_opt_in() { /// ``` #[test] fn transitive_prerelease_and_stable_dependency() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -3248,7 +3248,7 @@ fn transitive_prerelease_and_stable_dependency() { /// ``` #[test] fn python_greater_than_current_backtrack() { - let context = TestContext::new("3.9"); + let context = uv_test::test_context!("3.9"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -3293,7 +3293,7 @@ fn python_greater_than_current_backtrack() { /// ``` #[test] fn python_greater_than_current_excluded() { - let context = TestContext::new("3.9"); + let context = uv_test::test_context!("3.9"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -3363,7 +3363,7 @@ fn python_greater_than_current_excluded() { /// ``` #[test] fn python_greater_than_current_many() { - let context = TestContext::new("3.9"); + let context = uv_test::test_context!("3.9"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -3400,7 +3400,7 @@ fn python_greater_than_current_many() { #[cfg(feature = "test-python-patch")] #[test] fn python_greater_than_current_patch() { - let context = TestContext::new("3.13.0"); + let context = uv_test::test_context!("3.13.0"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -3437,7 +3437,7 @@ fn python_greater_than_current_patch() { /// ``` #[test] fn python_greater_than_current() { - let context = TestContext::new("3.9"); + let context = uv_test::test_context!("3.9"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -3474,7 +3474,7 @@ fn python_greater_than_current() { /// ``` #[test] fn python_less_than_current() { - let context = TestContext::new("3.9"); + let context = uv_test::test_context!("3.9"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -3512,7 +3512,7 @@ fn python_less_than_current() { /// ``` #[test] fn python_version_does_not_exist() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -3548,7 +3548,7 @@ fn python_version_does_not_exist() { /// ``` #[test] fn no_binary() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -3587,7 +3587,7 @@ fn no_binary() { /// ``` #[test] fn no_build() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -3626,7 +3626,7 @@ fn no_build() { /// ``` #[test] fn no_sdist_no_wheels_with_matching_abi() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -3665,7 +3665,7 @@ fn no_sdist_no_wheels_with_matching_abi() { /// ``` #[test] fn no_sdist_no_wheels_with_matching_platform() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -3704,7 +3704,7 @@ fn no_sdist_no_wheels_with_matching_platform() { /// ``` #[test] fn no_sdist_no_wheels_with_matching_python() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -3743,7 +3743,7 @@ fn no_sdist_no_wheels_with_matching_python() { /// ``` #[test] fn no_wheels_no_build() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -3783,7 +3783,7 @@ fn no_wheels_no_build() { /// ``` #[test] fn no_wheels_with_matching_platform() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -3818,7 +3818,7 @@ fn no_wheels_with_matching_platform() { /// ``` #[test] fn no_wheels() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -3853,7 +3853,7 @@ fn no_wheels() { /// ``` #[test] fn only_wheels_no_binary() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -3893,7 +3893,7 @@ fn only_wheels_no_binary() { /// ``` #[test] fn only_wheels() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -3928,7 +3928,7 @@ fn only_wheels() { /// ``` #[test] fn specific_tag_and_default() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -3964,7 +3964,7 @@ fn specific_tag_and_default() { /// ``` #[test] fn package_only_yanked_in_range() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -4004,7 +4004,7 @@ fn package_only_yanked_in_range() { /// ``` #[test] fn package_only_yanked() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -4045,7 +4045,7 @@ fn package_only_yanked() { /// ``` #[test] fn package_yanked_specified_mixed_available() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -4084,7 +4084,7 @@ fn package_yanked_specified_mixed_available() { /// ``` #[test] fn requires_package_yanked_and_unyanked_any() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -4129,7 +4129,7 @@ fn requires_package_yanked_and_unyanked_any() { /// ``` #[test] fn transitive_package_only_yanked_in_range_opt_in() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -4179,7 +4179,7 @@ fn transitive_package_only_yanked_in_range_opt_in() { /// ``` #[test] fn transitive_package_only_yanked_in_range() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -4224,7 +4224,7 @@ fn transitive_package_only_yanked_in_range() { /// ``` #[test] fn transitive_package_only_yanked() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -4275,7 +4275,7 @@ fn transitive_package_only_yanked() { /// ``` #[test] fn transitive_yanked_and_unyanked_dependency_opt_in() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); @@ -4343,7 +4343,7 @@ fn transitive_yanked_and_unyanked_dependency_opt_in() { /// ``` #[test] fn transitive_yanked_and_unyanked_dependency() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); diff --git a/crates/uv/tests/it/pip_list.rs b/crates/uv/tests/it/pip_list.rs index 694452876..826adc084 100644 --- a/crates/uv/tests/it/pip_list.rs +++ b/crates/uv/tests/it/pip_list.rs @@ -5,11 +5,11 @@ use assert_fs::fixture::FileWriteStr; use assert_fs::fixture::PathChild; use assert_fs::prelude::*; -use crate::common::{TestContext, uv_snapshot}; +use uv_test::uv_snapshot; #[test] fn list_empty_columns() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.pip_list() .arg("--format") @@ -25,7 +25,7 @@ fn list_empty_columns() { #[test] fn list_empty_freeze() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.pip_list() .arg("--format") @@ -41,7 +41,7 @@ fn list_empty_freeze() { #[test] fn list_empty_json() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.pip_list() .arg("--format") @@ -59,7 +59,7 @@ fn list_empty_json() { #[test] #[cfg(feature = "test-pypi")] fn list_single_no_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("MarkupSafe==2.1.3")?; @@ -100,7 +100,7 @@ fn list_single_no_editable() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn list_outdated_columns() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("anyio==3.0.0")?; @@ -141,7 +141,7 @@ fn list_outdated_columns() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn list_outdated_json() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("anyio==3.0.0")?; @@ -179,7 +179,7 @@ fn list_outdated_json() -> Result<()> { #[test] fn list_outdated_freeze() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.pip_list().arg("--outdated").arg("--format").arg("freeze"), @" success: false @@ -195,7 +195,7 @@ fn list_outdated_freeze() { #[test] #[cfg(feature = "test-git")] fn list_outdated_git() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(indoc::indoc! {r" @@ -238,7 +238,7 @@ fn list_outdated_git() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn list_outdated_index() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("anyio==3.0.0")?; @@ -282,7 +282,7 @@ fn list_outdated_index() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn list_editable() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install the editable package. uv_snapshot!(context.filters(), context.pip_install() @@ -328,7 +328,7 @@ fn list_editable() { #[test] #[cfg(feature = "test-pypi")] fn list_editable_only() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install the editable package. uv_snapshot!(context.filters(), context.pip_install() @@ -403,7 +403,7 @@ fn list_editable_only() { #[test] #[cfg(feature = "test-pypi")] fn list_exclude() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install the editable package. uv_snapshot!(context.filters(), context.pip_install() @@ -486,7 +486,7 @@ fn list_exclude() { #[cfg(feature = "test-pypi")] #[cfg(not(windows))] fn list_format_json() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install the editable package. uv_snapshot!(context.filters(), context.pip_install() @@ -552,7 +552,7 @@ fn list_format_json() { #[test] #[cfg(feature = "test-pypi")] fn list_format_freeze() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install the editable package. uv_snapshot!(context.filters(), context @@ -623,7 +623,7 @@ fn list_format_freeze() { #[test] fn list_legacy_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let site_packages = ChildPath::new(context.site_packages()); @@ -675,7 +675,7 @@ Version: 0.22.0 #[test] fn list_legacy_editable_invalid_version() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let site_packages = ChildPath::new(context.site_packages()); @@ -718,7 +718,7 @@ Version: 0.1-bulbasaur #[test] #[cfg(feature = "test-pypi")] fn list_ignores_quiet_flag_format_freeze() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install the editable package. uv_snapshot!(context.filters(), context @@ -793,7 +793,7 @@ fn list_ignores_quiet_flag_format_freeze() { #[test] #[cfg(feature = "test-pypi")] fn list_target() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("MarkupSafe==2.1.3\ntomli==2.0.1")?; @@ -842,7 +842,7 @@ fn list_target() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn list_prefix() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("MarkupSafe==2.1.3\ntomli==2.0.1")?; diff --git a/crates/uv/tests/it/pip_show.rs b/crates/uv/tests/it/pip_show.rs index 5ab7ab1d5..daac9d189 100644 --- a/crates/uv/tests/it/pip_show.rs +++ b/crates/uv/tests/it/pip_show.rs @@ -8,11 +8,11 @@ use indoc::indoc; use uv_static::EnvVars; -use crate::common::{TestContext, uv_snapshot}; +use uv_test::uv_snapshot; #[test] fn show_empty() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.pip_show(), @" success: false @@ -28,7 +28,7 @@ fn show_empty() { #[test] #[cfg(feature = "test-pypi")] fn show_requires_multiple() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("requests==2.31.0")?; @@ -78,7 +78,7 @@ fn show_requires_multiple() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn show_python_version_marker() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("click==8.1.7")?; @@ -128,7 +128,7 @@ fn show_python_version_marker() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn show_found_single_package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("MarkupSafe==2.1.3")?; @@ -173,7 +173,7 @@ fn show_found_single_package() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn show_found_multiple_packages() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(indoc! {r" @@ -230,7 +230,7 @@ fn show_found_multiple_packages() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn show_found_one_out_of_three() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(indoc! {r" @@ -283,7 +283,7 @@ fn show_found_one_out_of_three() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn show_found_one_out_of_two_quiet() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(indoc! {r" @@ -331,7 +331,7 @@ fn show_found_one_out_of_two_quiet() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn show_empty_quiet() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(indoc! {r" @@ -378,7 +378,7 @@ fn show_empty_quiet() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn show_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install the editable package. context @@ -415,7 +415,7 @@ fn show_editable() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn show_required_by_multiple() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(indoc! {r" @@ -471,7 +471,7 @@ fn show_required_by_multiple() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn show_files() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context .pip_install() @@ -538,7 +538,7 @@ fn show_files() { #[test] #[cfg(feature = "test-pypi")] fn show_target() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("MarkupSafe==2.1.3")?; @@ -590,7 +590,7 @@ fn show_target() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn show_prefix() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("MarkupSafe==2.1.3")?; diff --git a/crates/uv/tests/it/pip_sync.rs b/crates/uv/tests/it/pip_sync.rs index 6fe798493..20959f383 100644 --- a/crates/uv/tests/it/pip_sync.rs +++ b/crates/uv/tests/it/pip_sync.rs @@ -9,13 +9,13 @@ use indoc::indoc; use predicates::Predicate; use url::Url; -use crate::common::{TestContext, download_to_disk, site_packages_path, uv_snapshot}; use uv_fs::{Simplified, copy_dir_all}; use uv_static::EnvVars; +use uv_test::{download_to_disk, site_packages_path, uv_snapshot}; #[test] fn missing_requirements_txt() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); @@ -35,7 +35,7 @@ fn missing_requirements_txt() { #[test] fn missing_venv() -> Result<()> { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_virtualenv_bin() .with_filtered_python_names(); @@ -72,7 +72,7 @@ fn missing_venv() -> Result<()> { #[test] fn missing_system() -> Result<()> { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); let requirements = context.temp_dir.child("requirements.txt"); requirements.write_str("anyio")?; @@ -92,7 +92,7 @@ fn missing_system() -> Result<()> { /// this using `clone` semantics.) #[test] fn install() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("MarkupSafe==2.1.3")?; @@ -139,7 +139,7 @@ fn install() -> Result<()> { /// Install a package into a virtual environment using copy semantics. #[test] fn install_copy() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("MarkupSafe==2.1.3")?; @@ -178,7 +178,7 @@ fn install_copy() -> Result<()> { /// Install a package into a virtual environment using hardlink semantics. #[test] fn install_hardlink() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("MarkupSafe==2.1.3")?; @@ -218,7 +218,7 @@ fn install_hardlink() -> Result<()> { #[test] #[cfg(unix)] // Windows does not allow symlinks by default fn install_symlink() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("MarkupSafe==2.1.3")?; @@ -257,7 +257,7 @@ fn install_symlink() -> Result<()> { /// Reject attempts to use symlink semantics with `--no-cache`. #[test] fn install_symlink_no_cache() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("MarkupSafe==2.1.3")?; @@ -285,7 +285,7 @@ fn install_symlink_no_cache() -> Result<()> { /// Install multiple packages into a virtual environment. #[test] fn install_many() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("MarkupSafe==2.1.3\ntomli==2.0.1")?; @@ -316,7 +316,7 @@ fn install_many() -> Result<()> { /// Attempt to install an already-installed package into a virtual environment. #[test] fn noop() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("MarkupSafe==2.1.3")?; @@ -351,7 +351,7 @@ fn noop() -> Result<()> { /// Attempt to sync an empty set of requirements. #[test] fn pip_sync_empty() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.touch()?; @@ -415,7 +415,7 @@ fn pip_sync_empty() -> Result<()> { #[test] fn link() -> Result<()> { // Sync `anyio` into the first virtual environment. - let context1 = TestContext::new("3.12"); + let context1 = uv_test::test_context!("3.12"); let requirements_txt = context1.temp_dir.child("requirements.txt"); requirements_txt.write_str("iniconfig==2.0.0")?; @@ -428,7 +428,7 @@ fn link() -> Result<()> { .success(); // Create a separate virtual environment, but reuse the same cache. - let context2 = TestContext::new("3.12"); + let context2 = uv_test::test_context!("3.12"); let mut cmd = context1.pip_sync(); cmd.env(EnvVars::VIRTUAL_ENV, context2.venv.as_os_str()) .current_dir(&context2.temp_dir); @@ -462,7 +462,7 @@ fn link() -> Result<()> { /// different requirements file. #[test] fn add_remove() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("iniconfig==2.0.0")?; @@ -504,7 +504,7 @@ fn add_remove() -> Result<()> { /// virtual environment. #[test] fn install_sequential() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("iniconfig==2.0.0")?; @@ -545,7 +545,7 @@ fn install_sequential() -> Result<()> { /// virtual environment. #[test] fn upgrade() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("tomli==2.0.0")?; @@ -585,7 +585,7 @@ fn upgrade() -> Result<()> { /// Install a package into a virtual environment from a URL. #[test] fn install_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("werkzeug @ https://files.pythonhosted.org/packages/ff/1d/960bb4017c68674a1cb099534840f18d3def3ce44aed12b5ed8b78e0153e/Werkzeug-2.0.0-py3-none-any.whl")?; @@ -614,7 +614,7 @@ fn install_url() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn install_git_commit() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("uv-public-pypackage @ git+https://github.com/astral-test/uv-public-pypackage@b270df1a2fb5d012294e9aaf05e7e0bab1e6a389")?; @@ -645,7 +645,7 @@ fn install_git_commit() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn install_git_tag() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str( @@ -678,7 +678,7 @@ fn install_git_tag() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn install_git_subdirectories() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("example-pkg-a @ git+https://github.com/pypa/sample-namespace-packages.git@df7530eeb8fa0cb7dbb8ecb28363e8e36bfa2f45#subdirectory=pkg_resources/pkg_a\nexample-pkg-b @ git+https://github.com/pypa/sample-namespace-packages.git@df7530eeb8fa0cb7dbb8ecb28363e8e36bfa2f45#subdirectory=pkg_resources/pkg_b")?; @@ -709,7 +709,7 @@ fn install_git_subdirectories() -> Result<()> { /// Install a source distribution into a virtual environment. #[test] fn install_sdist() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-29T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-29T00:00:00Z"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("source-distribution==0.0.1")?; @@ -739,7 +739,7 @@ fn install_sdist() -> Result<()> { /// Install a source distribution into a virtual environment. #[test] fn install_sdist_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("source-distribution @ https://files.pythonhosted.org/packages/10/1f/57aa4cce1b1abf6b433106676e15f9fa2c92ed2bd4cf77c3b50a9e9ac773/source_distribution-0.0.1.tar.gz")?; @@ -769,7 +769,7 @@ fn install_sdist_url() -> Result<()> { /// Install a package with source archive format `.tar.bz2`. #[test] fn install_sdist_archive_type_bz2() -> Result<()> { - let context = TestContext::new("3.9"); + let context = uv_test::test_context!("3.9"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(&format!( @@ -802,7 +802,7 @@ fn install_sdist_archive_type_bz2() -> Result<()> { /// should be a no-op. #[test] fn install_url_then_install_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("werkzeug @ https://files.pythonhosted.org/packages/ff/1d/960bb4017c68674a1cb099534840f18d3def3ce44aed12b5ed8b78e0153e/Werkzeug-2.0.0-py3-none-any.whl")?; @@ -836,7 +836,7 @@ fn install_url_then_install_url() -> Result<()> { /// URL-based version, but doesn't right now. #[test] fn install_url_then_install_version() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("werkzeug @ https://files.pythonhosted.org/packages/ff/1d/960bb4017c68674a1cb099534840f18d3def3ce44aed12b5ed8b78e0153e/Werkzeug-2.0.0-py3-none-any.whl")?; @@ -873,7 +873,7 @@ fn install_url_then_install_version() -> Result<()> { /// should remove the registry-based version. #[test] fn install_version_then_install_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("werkzeug==2.0.0")?; @@ -915,7 +915,7 @@ fn install_version_then_install_url() -> Result<()> { #[cfg(feature = "test-python-eol")] #[test] fn install_numpy_py38() -> Result<()> { - let context = TestContext::new("3.8"); + let context = uv_test::test_context!("3.8"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("numpy")?; @@ -943,7 +943,7 @@ fn install_numpy_py38() -> Result<()> { /// Attempt to install a package without using a remote index. #[test] fn install_no_index() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("iniconfig==2.0.0")?; @@ -973,7 +973,7 @@ fn install_no_index() -> Result<()> { /// after a previous successful installation. #[test] fn install_no_index_cached() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("iniconfig==2.0.0")?; @@ -1020,7 +1020,7 @@ fn install_no_index_cached() -> Result<()> { #[test] fn warn_on_yanked() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // This version is yanked. let requirements_in = context.temp_dir.child("requirements.txt"); @@ -1047,7 +1047,7 @@ fn warn_on_yanked() -> Result<()> { #[test] fn warn_on_yanked_dry_run() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // This version is yanked. let requirements_in = context.temp_dir.child("requirements.txt"); @@ -1076,7 +1076,7 @@ fn warn_on_yanked_dry_run() -> Result<()> { /// Resolve a local wheel. #[test] fn install_local_wheel() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Download a wheel. let archive = context.temp_dir.child("tomli-2.0.1-py3-none-any.whl"); @@ -1216,7 +1216,7 @@ fn install_local_wheel() -> Result<()> { /// Install a wheel whose actual version doesn't match the version encoded in the filename. #[test] fn mismatched_version() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Download a wheel. let archive = context.temp_dir.child("tomli-3.7.2-py3-none-any.whl"); @@ -1267,7 +1267,7 @@ fn mismatched_version() -> Result<()> { /// Install a wheel whose actual name doesn't match the name encoded in the filename. #[test] fn mismatched_name() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Download a wheel. let archive = context.temp_dir.child("foo-2.0.1-py3-none-any.whl"); @@ -1304,7 +1304,7 @@ fn mismatched_name() -> Result<()> { /// Install a local source distribution. #[test] fn install_local_source_distribution() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Download a source distribution. let archive = context.temp_dir.child("wheel-0.42.0.tar.gz"); @@ -1353,7 +1353,7 @@ fn install_local_source_distribution() -> Result<()> { /// The example is based `DTLSSocket==0.1.16` #[test] fn install_build_system_no_backend() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("build-system-no-backend @ https://files.pythonhosted.org/packages/ec/25/1e531108ca027dc3a3b37d351f4b86d811df4884c6a81cd99e73b8b589f5/build-system-no-backend-0.1.0.tar.gz")?; @@ -1383,7 +1383,7 @@ fn install_build_system_no_backend() -> Result<()> { /// Check that we show the right messages on cached, direct URL source distribution installs. #[test] fn install_url_source_dist_cached() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("source_distribution @ https://files.pythonhosted.org/packages/10/1f/57aa4cce1b1abf6b433106676e15f9fa2c92ed2bd4cf77c3b50a9e9ac773/source_distribution-0.0.1.tar.gz")?; @@ -1474,7 +1474,7 @@ fn install_url_source_dist_cached() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn install_git_source_dist_cached() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("uv-public-pypackage @ git+https://github.com/astral-test/uv-public-pypackage@b270df1a2fb5d012294e9aaf05e7e0bab1e6a389")?; @@ -1567,7 +1567,7 @@ fn install_git_source_dist_cached() -> Result<()> { /// Check that we show the right messages on cached, registry source distribution installs. #[test] fn install_registry_source_dist_cached() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-29T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-29T00:00:00Z"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("source_distribution==0.0.1")?; @@ -1656,7 +1656,7 @@ fn install_registry_source_dist_cached() -> Result<()> { /// Check that we show the right messages on cached, local source distribution installs. #[test] fn install_path_source_dist_cached() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Download a source distribution. let archive = context.temp_dir.child("source_distribution-0.0.1.tar.gz"); @@ -1756,7 +1756,7 @@ fn install_path_source_dist_cached() -> Result<()> { /// Check that we show the right messages on cached, local source distribution installs. #[test] fn install_path_built_dist_cached() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Download a wheel. let archive = context.temp_dir.child("tomli-2.0.1-py3-none-any.whl"); @@ -1848,7 +1848,7 @@ fn install_path_built_dist_cached() -> Result<()> { /// Check that we show the right messages on cached, direct URL built distribution installs. #[test] fn install_url_built_dist_cached() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("tqdm @ https://files.pythonhosted.org/packages/00/e5/f12a80907d0884e6dff9c16d0c0114d81b8cd07dc3ae54c5e962cc83037e/tqdm-4.66.1-py3-none-any.whl")?; @@ -1940,7 +1940,7 @@ fn install_url_built_dist_cached() -> Result<()> { /// Verify that fail with an appropriate error when a package is repeated. #[test] fn duplicate_package_overlap() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("MarkupSafe==2.1.3\nMarkupSafe==2.1.2")?; @@ -1964,7 +1964,7 @@ fn duplicate_package_overlap() -> Result<()> { /// Verify that allow duplicate packages when they are disjoint. #[test] fn duplicate_package_disjoint() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("MarkupSafe==2.1.3\nMarkupSafe==2.1.2 ; python_version < '3.6'")?; @@ -1990,7 +1990,7 @@ fn duplicate_package_disjoint() -> Result<()> { /// Verify that we can force reinstall of packages. #[test] fn reinstall() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("MarkupSafe==2.1.3\ntomli==2.0.1")?; @@ -2042,7 +2042,7 @@ fn reinstall() -> Result<()> { /// Verify that we can force reinstall of selective packages. #[test] fn reinstall_package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("MarkupSafe==2.1.3\ntomli==2.0.1")?; @@ -2095,7 +2095,7 @@ fn reinstall_package() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn reinstall_git() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("uv-public-pypackage @ git+https://github.com/astral-test/uv-public-pypackage@b270df1a2fb5d012294e9aaf05e7e0bab1e6a389")?; @@ -2148,7 +2148,7 @@ fn reinstall_git() -> Result<()> { /// Verify that we can force refresh of cached data. #[test] fn refresh() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("MarkupSafe==2.1.3\ntomli==2.0.1")?; @@ -2203,7 +2203,7 @@ fn refresh() -> Result<()> { /// Verify that we can force refresh of selective packages. #[test] fn refresh_package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("MarkupSafe==2.1.3\ntomli==2.0.1")?; @@ -2258,7 +2258,7 @@ fn refresh_package() -> Result<()> { #[test] fn sync_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let poetry_editable = context.temp_dir.child("poetry_editable"); // Copy into the temporary directory so we can mutate it. @@ -2423,7 +2423,7 @@ fn sync_editable() -> Result<()> { #[test] fn sync_editable_and_registry() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Copy the black test editable into the "current" directory copy_dir_all( @@ -2536,7 +2536,7 @@ fn sync_editable_and_registry() -> Result<()> { #[test] fn sync_editable_and_local() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Copy the black test editable into the "current" directory copy_dir_all( @@ -2613,7 +2613,7 @@ fn sync_editable_and_local() -> Result<()> { #[test] fn incompatible_wheel() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let wheel = context.temp_dir.child("foo-1.2.3-py3-none-any.whl"); wheel.touch()?; @@ -2643,7 +2643,7 @@ fn incompatible_wheel() -> Result<()> { /// Install a project without a `pyproject.toml`, using the PEP 517 build backend. #[test] fn sync_legacy_sdist_pep_517() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("flake8 @ https://files.pythonhosted.org/packages/66/53/3ad4a3b74d609b3b9008a10075c40e7c8909eae60af53623c3888f7a529a/flake8-6.0.0.tar.gz")?; @@ -2668,7 +2668,7 @@ fn sync_legacy_sdist_pep_517() -> Result<()> { /// Sync using `--find-links` with a local directory. #[test] fn find_links() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(indoc! {r" @@ -2703,7 +2703,7 @@ fn find_links() -> Result<()> { /// Sync using `--find-links` with `--no-index`, which should accept the local wheel. #[test] fn find_links_no_index_match() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(indoc! {r" @@ -2733,7 +2733,7 @@ fn find_links_no_index_match() -> Result<()> { /// Sync using `--find-links` with `--offline`, which should accept the local wheel. #[test] fn find_links_offline_match() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(indoc! {r" @@ -2763,7 +2763,7 @@ fn find_links_offline_match() -> Result<()> { /// Sync using `--find-links` with `--offline`, which should fail to find `numpy`. #[test] fn find_links_offline_no_match() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(indoc! {r" @@ -2794,7 +2794,7 @@ fn find_links_offline_no_match() -> Result<()> { /// Sync using `--find-links` with a local directory. Ensure that cached wheels are reused. #[test] fn find_links_wheel_cache() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(indoc! {r" @@ -2844,7 +2844,7 @@ fn find_links_wheel_cache() -> Result<()> { /// reused. #[test] fn find_links_source_cache() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(indoc! {r" @@ -2893,7 +2893,7 @@ fn find_links_source_cache() -> Result<()> { /// Install without network access via the `--offline` flag. #[test] fn offline() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("black==23.10.1")?; @@ -2952,7 +2952,7 @@ fn offline() -> Result<()> { /// Include a `constraints.txt` file with a compatible constraint. #[test] fn compatible_constraint() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("anyio==3.7.0")?; @@ -2981,7 +2981,7 @@ fn compatible_constraint() -> Result<()> { /// Include a `constraints.txt` file with an incompatible constraint. #[test] fn incompatible_constraint() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("anyio==3.7.0")?; @@ -3008,7 +3008,7 @@ fn incompatible_constraint() -> Result<()> { /// Include a `constraints.txt` file with an irrelevant constraint. #[test] fn irrelevant_constraint() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("anyio==3.7.0")?; @@ -3037,7 +3037,7 @@ fn irrelevant_constraint() -> Result<()> { /// Sync with a repeated `anyio` requirement. #[test] fn repeat_requirement_identical() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio\nanyio")?; @@ -3060,7 +3060,7 @@ fn repeat_requirement_identical() -> Result<()> { /// Sync with a repeated `anyio` requirement, with compatible versions. #[test] fn repeat_requirement_compatible() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio\nanyio==4.0.0")?; @@ -3083,7 +3083,7 @@ fn repeat_requirement_compatible() -> Result<()> { /// Sync with a repeated, but conflicting `anyio` requirement. #[test] fn repeat_requirement_incompatible() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio<4.0.0\nanyio==4.0.0")?; @@ -3106,7 +3106,7 @@ fn repeat_requirement_incompatible() -> Result<()> { /// See also . #[test] fn tar_dont_preserve_mtime() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("tomli @ https://files.pythonhosted.org/packages/c0/3f/d7af728f075fb08564c5949a9c95e44352e23dee646869fa104a3b2060a3/tomli-2.0.1.tar.gz")?; @@ -3129,7 +3129,7 @@ fn tar_dont_preserve_mtime() -> Result<()> { /// Avoid creating a file with 000 permissions #[test] fn set_read_permissions() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("databricks==0.2")?; @@ -3154,7 +3154,7 @@ fn set_read_permissions() -> Result<()> { /// #[test] fn pip_entrypoints() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); for pip_requirement in [ // Test compatibility with launchers in 24.0 @@ -3192,7 +3192,7 @@ fn pip_entrypoints() -> Result<()> { #[test] fn invalidate_on_change() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create an editable package. let editable_dir = context.temp_dir.child("editable"); @@ -3274,7 +3274,7 @@ requires-python = ">=3.8" /// Install with bytecode compilation. #[test] fn compile() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("MarkupSafe==2.1.3")?; @@ -3313,7 +3313,7 @@ fn compile() -> Result<()> { /// Re-install with bytecode compilation. #[test] fn recompile() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("MarkupSafe==2.1.3")?; @@ -3364,7 +3364,7 @@ fn recompile() -> Result<()> { /// Raise an error when an editable's `Requires-Python` constraint is not met. #[test] fn requires_python_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create an editable package with a `Requires-Python` constraint that is not met. let editable_dir = context.temp_dir.child("editable"); @@ -3404,7 +3404,7 @@ requires-python = ">=3.13" /// Raise an error when a direct URL dependency's `Requires-Python` constraint is not met. #[test] fn requires_python_direct_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create an editable package with a `Requires-Python` constraint that is not met. let editable_dir = context.temp_dir.child("editable"); @@ -3444,7 +3444,7 @@ requires-python = ">=3.13" /// Use an unknown hash algorithm with `--require-hashes`. #[test] fn require_hashes_unknown_algorithm() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str( @@ -3469,7 +3469,7 @@ fn require_hashes_unknown_algorithm() -> Result<()> { /// Omit the hash with `--require-hashes`. #[test] fn require_hashes_missing_hash() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("anyio==4.0.0")?; @@ -3508,7 +3508,7 @@ fn require_hashes_missing_hash() -> Result<()> { /// Omit the version with `--require-hashes`. #[test] fn require_hashes_missing_version() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str( @@ -3549,7 +3549,7 @@ fn require_hashes_missing_version() -> Result<()> { /// Use a non-`==` operator with `--require-hashes`. #[test] fn require_hashes_invalid_operator() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str( @@ -3590,7 +3590,7 @@ fn require_hashes_invalid_operator() -> Result<()> { /// Include the hash for _just_ the wheel with `--no-binary`. #[test] fn require_hashes_wheel_no_binary() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt @@ -3624,7 +3624,7 @@ fn require_hashes_wheel_no_binary() -> Result<()> { /// Include the hash for _just_ the wheel with `--only-binary`. #[test] fn require_hashes_wheel_only_binary() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt @@ -3653,7 +3653,7 @@ fn require_hashes_wheel_only_binary() -> Result<()> { /// Include the hash for _just_ the source distribution with `--no-binary`. #[test] fn require_hashes_source_no_binary() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-29T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-29T00:00:00Z"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt @@ -3682,7 +3682,7 @@ fn require_hashes_source_no_binary() -> Result<()> { /// Include the hash for _just_ the source distribution, with `--binary-only`. #[test] fn require_hashes_source_only_binary() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt @@ -3716,7 +3716,7 @@ fn require_hashes_source_only_binary() -> Result<()> { /// Include the correct hash algorithm, but the wrong digest. #[test] fn require_hashes_wrong_digest() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt @@ -3748,7 +3748,7 @@ fn require_hashes_wrong_digest() -> Result<()> { /// Include the correct hash, but the wrong algorithm. #[test] fn require_hashes_wrong_algorithm() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt @@ -3780,7 +3780,7 @@ fn require_hashes_wrong_algorithm() -> Result<()> { /// Include the hash for a source distribution specified as a direct URL dependency. #[test] fn require_hashes_source_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt @@ -3850,7 +3850,7 @@ fn require_hashes_source_url() -> Result<()> { /// Include the _wrong_ hash for a source distribution specified as a direct URL dependency. #[test] fn require_hashes_source_url_mismatch() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt @@ -3881,7 +3881,7 @@ fn require_hashes_source_url_mismatch() -> Result<()> { /// Include the hash for a built distribution specified as a direct URL dependency. #[test] fn require_hashes_wheel_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt @@ -3974,7 +3974,7 @@ fn require_hashes_wheel_url() -> Result<()> { /// Include the _wrong_ hash for a built distribution specified as a direct URL dependency. #[test] fn require_hashes_wheel_url_mismatch() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt @@ -4007,7 +4007,7 @@ fn require_hashes_wheel_url_mismatch() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn require_hashes_git() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt @@ -4032,7 +4032,7 @@ fn require_hashes_git() -> Result<()> { /// Reject local directory dependencies when `--require-hashes` is provided. #[test] fn require_hashes_source_tree() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(&format!( @@ -4062,7 +4062,7 @@ fn require_hashes_source_tree() -> Result<()> { /// Include the hash for _just_ the wheel with `--only-binary`. #[test] fn require_hashes_re_download() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("anyio==4.0.0")?; @@ -4136,7 +4136,7 @@ fn require_hashes_re_download() -> Result<()> { /// Include the hash for a built distribution specified as a local path dependency. #[test] fn require_hashes_wheel_path() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(&format!( @@ -4168,7 +4168,7 @@ fn require_hashes_wheel_path() -> Result<()> { /// Include the _wrong_ hash for a built distribution specified as a local path dependency. #[test] fn require_hashes_wheel_path_mismatch() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(&format!( @@ -4205,7 +4205,7 @@ fn require_hashes_wheel_path_mismatch() -> Result<()> { /// Include the hash for a source distribution specified as a local path dependency. #[test] fn require_hashes_source_path() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(&format!( @@ -4237,7 +4237,7 @@ fn require_hashes_source_path() -> Result<()> { /// Include the _wrong_ hash for a source distribution specified as a local path dependency. #[test] fn require_hashes_source_path_mismatch() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(&format!( @@ -4273,7 +4273,7 @@ fn require_hashes_source_path_mismatch() -> Result<()> { /// We allow `--require-hashes` for direct URL dependencies. #[test] fn require_hashes_unnamed() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt @@ -4302,7 +4302,7 @@ fn require_hashes_unnamed() -> Result<()> { /// We disallow `--require-hashes` for editables. #[test] fn require_hashes_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(&indoc::formatdoc! {r" @@ -4330,7 +4330,7 @@ fn require_hashes_editable() -> Result<()> { /// If a dependency is repeated, the hash should be required for both instances. #[test] fn require_hashes_repeated_dependency() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt @@ -4371,7 +4371,7 @@ fn require_hashes_repeated_dependency() -> Result<()> { /// If a dependency is repeated, use the last hash provided. pip seems to use the _first_ hash. #[test] fn require_hashes_repeated_hash() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Use the same hash in both cases. let requirements_txt = context.temp_dir.child("requirements.txt"); @@ -4481,7 +4481,7 @@ fn require_hashes_repeated_hash() -> Result<()> { /// If a dependency is repeated, the hash should be required for both instances. #[test] fn require_hashes_at_least_one() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Request `anyio` with a `sha256` hash. let requirements_txt = context.temp_dir.child("requirements.txt"); @@ -4554,7 +4554,7 @@ fn require_hashes_at_least_one() -> Result<()> { /// Using `--find-links`, but the registry doesn't provide us with a hash. #[test] fn require_hashes_find_links_no_hash() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // First, use the correct hash. let requirements_txt = context.temp_dir.child("requirements.txt"); @@ -4667,7 +4667,7 @@ fn require_hashes_find_links_no_hash() -> Result<()> { /// Using `--find-links`, and the registry serves us a correct hash. #[test] fn require_hashes_find_links_valid_hash() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt @@ -4696,7 +4696,7 @@ fn require_hashes_find_links_valid_hash() -> Result<()> { /// Using `--find-links`, and the registry serves us an incorrect hash. #[test] fn require_hashes_find_links_invalid_hash() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // First, request some other hash. let requirements_txt = context.temp_dir.child("requirements.txt"); @@ -4840,7 +4840,7 @@ fn require_hashes_find_links_invalid_hash() -> Result<()> { /// Using `--index-url`, but the registry doesn't provide us with a hash. #[test] fn require_hashes_registry_no_hash() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt @@ -4870,7 +4870,7 @@ fn require_hashes_registry_no_hash() -> Result<()> { /// Using `--index-url`, and the registry serves us a correct hash. #[test] fn require_hashes_registry_valid_hash() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt @@ -4898,7 +4898,7 @@ fn require_hashes_registry_valid_hash() -> Result<()> { /// Using `--index-url`, and the registry serves us an incorrect hash. #[test] fn require_hashes_registry_invalid_hash() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // First, request some other hash. let requirements_txt = context.temp_dir.child("requirements.txt"); @@ -5047,7 +5047,7 @@ fn require_hashes_registry_invalid_hash() -> Result<()> { /// Include the hash in the URL directly. #[test] fn require_hashes_url() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-29T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-29T00:00:00Z"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt @@ -5074,7 +5074,7 @@ fn require_hashes_url() -> Result<()> { /// Include an irrelevant fragment in the URL. #[test] fn require_hashes_url_other_fragment() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-29T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-29T00:00:00Z"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt @@ -5098,7 +5098,7 @@ fn require_hashes_url_other_fragment() -> Result<()> { /// Include an invalid hash in the URL directly. #[test] fn require_hashes_url_invalid() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-29T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-29T00:00:00Z"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt @@ -5130,7 +5130,7 @@ fn require_hashes_url_invalid() -> Result<()> { /// Ignore the (valid) hash on the fragment if (invalid) hashes are provided directly. #[test] fn require_hashes_url_ignore() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-29T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-29T00:00:00Z"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt @@ -5162,7 +5162,7 @@ fn require_hashes_url_ignore() -> Result<()> { /// Include the hash in the URL directly. #[test] fn require_hashes_url_unnamed() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-29T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-29T00:00:00Z"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt @@ -5189,7 +5189,7 @@ fn require_hashes_url_unnamed() -> Result<()> { /// Sync to a `--target` directory with a built distribution. #[test] fn target_built_distribution() -> Result<()> { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_python_names() .with_filtered_virtualenv_bin() .with_filtered_exe_suffix(); @@ -5289,7 +5289,7 @@ fn target_built_distribution() -> Result<()> { /// Sync to a `--target` directory with a package that requires building from source. #[test] fn target_source_distribution() -> Result<()> { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_python_names() .with_filtered_virtualenv_bin() .with_filtered_exe_suffix(); @@ -5342,7 +5342,7 @@ fn target_source_distribution() -> Result<()> { /// `--no-build-isolation`. #[test] fn target_no_build_isolation() -> Result<()> { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_python_names() .with_filtered_virtualenv_bin() .with_filtered_exe_suffix(); @@ -5412,7 +5412,7 @@ fn target_no_build_isolation() -> Result<()> { /// Sync to a `--target` directory without a virtual environment. #[test] fn target_system() -> Result<()> { - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); // Install `iniconfig` to the target directory. let requirements_in = context.temp_dir.child("requirements.in"); @@ -5443,7 +5443,7 @@ fn target_system() -> Result<()> { /// Sync to a `--prefix` directory. #[test] fn prefix() -> Result<()> { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_python_names() .with_filtered_virtualenv_bin() .with_filtered_exe_suffix(); @@ -5514,7 +5514,7 @@ fn prefix() -> Result<()> { /// Ensure that we install packages with markers on them. #[test] fn preserve_markers() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("anyio ; python_version > '3.7'")?; @@ -5539,7 +5539,7 @@ fn preserve_markers() -> Result<()> { /// Include a `build_constraints.txt` file with an incompatible constraint. #[test] fn incompatible_build_constraint() -> Result<()> { - let context = TestContext::new("3.9"); + let context = uv_test::test_context!("3.9"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("requests==1.2")?; @@ -5569,7 +5569,7 @@ fn incompatible_build_constraint() -> Result<()> { /// Include a `build_constraints.txt` file with a compatible constraint. #[test] fn compatible_build_constraint() -> Result<()> { - let context = TestContext::new("3.9"); + let context = uv_test::test_context!("3.9"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("requests==1.2")?; @@ -5597,7 +5597,7 @@ fn compatible_build_constraint() -> Result<()> { #[test] fn sync_seed() -> Result<()> { - let context = TestContext::new("3.9"); + let context = uv_test::test_context!("3.9"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("requests==1.2")?; @@ -5671,7 +5671,7 @@ fn sync_seed() -> Result<()> { /// Sanitize zip files during extraction. #[test] fn sanitize() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install a zip file that includes a path that extends outside the parent. let requirements_txt = context.temp_dir.child("requirements.txt"); @@ -5702,7 +5702,7 @@ fn sanitize() -> Result<()> { /// Allow semicolons attached to markers, as long as they're preceded by a space. #[test] fn semicolon_trailing_space() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements = context.temp_dir.child("requirements.txt"); requirements.write_str("iniconfig @ https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl; python_version > '3.10'")?; @@ -5727,7 +5727,7 @@ fn semicolon_trailing_space() -> Result<()> { /// Treat a semicolon that's not whitespace-separated as a part of the URL. #[test] fn semicolon_no_space() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements = context.temp_dir.child("requirements.txt"); requirements.write_str("iniconfig @ https://files.pythonhosted.org/packages/ef/a6/62565a6e1cf69e10f5727360368e451d4b7f58beeac6173dc9db836a5b46/iniconfig-2.0.0-py3-none-any.whl;python_version > '3.10'")?; @@ -5751,7 +5751,7 @@ fn semicolon_no_space() -> Result<()> { #[test] fn pep_751() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5844,7 +5844,7 @@ fn pep_751() -> Result<()> { /// See: #[test] fn pep_751_wheel_only() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5918,7 +5918,7 @@ fn pep_751_wheel_only() -> Result<()> { /// Respect `--no-binary` et al when installing from a `pylock.toml`. #[test] fn pep_751_build_options() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-29T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-29T00:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -6047,7 +6047,7 @@ fn pep_751_build_options() -> Result<()> { #[test] fn pep_751_direct_url_tags() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -6104,7 +6104,7 @@ fn pep_751_direct_url_tags() -> Result<()> { #[test] fn incompatible_python_version_direct_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("numpy @ https://files.pythonhosted.org/packages/ae/11/7c546fcf42145f29b71e4d6f429e96d8d68e5a7ba1830b2e68d7418f0bbd/numpy-2.3.2-cp313-cp313-win32.whl")?; @@ -6131,7 +6131,7 @@ fn incompatible_python_version_direct_url() -> Result<()> { #[test] fn incompatible_platform_direct_url() -> Result<()> { - let context = TestContext::new("3.13"); + let context = uv_test::test_context!("3.13"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("numpy @ https://files.pythonhosted.org/packages/ae/11/7c546fcf42145f29b71e4d6f429e96d8d68e5a7ba1830b2e68d7418f0bbd/numpy-2.3.2-cp313-cp313-win32.whl")?; @@ -6161,7 +6161,7 @@ fn incompatible_platform_direct_url() -> Result<()> { #[test] fn sync_missing_python_no_target() -> Result<()> { // Create a context that only has Python 3.11 available. - let context = TestContext::new("3.11") + let context = uv_test::test_context!("3.11") .with_python_download_cache() .with_managed_python_dirs(); @@ -6187,7 +6187,7 @@ fn sync_missing_python_no_target() -> Result<()> { #[test] fn sync_with_target_installs_missing_python() -> Result<()> { // Create a context that only has Python 3.11 available. - let context = TestContext::new("3.11") + let context = uv_test::test_context!("3.11") .with_python_download_cache() .with_managed_python_dirs(); diff --git a/crates/uv/tests/it/pip_tree.rs b/crates/uv/tests/it/pip_tree.rs index 2f33a0955..8e9e22a36 100644 --- a/crates/uv/tests/it/pip_tree.rs +++ b/crates/uv/tests/it/pip_tree.rs @@ -7,11 +7,11 @@ use assert_fs::fixture::PathChild; use assert_fs::fixture::PathCreateDir; use indoc::indoc; -use crate::common::{TestContext, uv_snapshot}; +use uv_test::uv_snapshot; #[test] fn no_package() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.pip_tree(), @" success: true @@ -27,7 +27,7 @@ fn no_package() { #[test] #[cfg(feature = "test-pypi")] fn prune_last_in_the_subgroup() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("requests==2.31.0").unwrap(); @@ -71,7 +71,7 @@ fn prune_last_in_the_subgroup() { #[test] #[cfg(feature = "test-pypi")] fn single_package() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("requests==2.31.0").unwrap(); @@ -117,7 +117,7 @@ fn single_package() { #[test] #[cfg(feature = "test-pypi")] fn nested_dependencies() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("flask").unwrap(); @@ -167,7 +167,7 @@ fn nested_dependencies() { #[test] #[cfg(feature = "test-pypi")] fn reverse() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("flask").unwrap(); @@ -219,7 +219,7 @@ fn reverse() { #[test] #[cfg(feature = "test-pypi")] fn invert() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("flask").unwrap(); @@ -271,7 +271,7 @@ fn invert() { #[test] #[cfg(feature = "test-pypi")] fn depth() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("flask").unwrap(); @@ -350,7 +350,7 @@ fn depth() { #[test] #[cfg(feature = "test-pypi")] fn prune() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("flask").unwrap(); @@ -434,7 +434,7 @@ fn prune() { #[test] #[cfg(feature = "test-pypi")] fn removed_dependency() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("requests==2.31.0").unwrap(); @@ -490,7 +490,7 @@ fn removed_dependency() { #[test] #[cfg(feature = "test-pypi")] fn multiple_packages() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt @@ -545,7 +545,7 @@ fn multiple_packages() { #[test] #[cfg(feature = "test-pypi")] fn cycle() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt @@ -613,7 +613,7 @@ fn cycle() { #[test] #[cfg(feature = "test-pypi")] fn multiple_packages_shared_descendant() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt @@ -667,7 +667,7 @@ fn multiple_packages_shared_descendant() { #[test] #[cfg(feature = "test-pypi")] fn no_dedupe_and_invert() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt @@ -720,7 +720,7 @@ fn no_dedupe_and_invert() { #[test] #[cfg(feature = "test-pypi")] fn no_dedupe() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt @@ -774,7 +774,7 @@ fn no_dedupe() { #[test] #[cfg(feature = "test-git")] fn with_editable() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install the editable package. uv_snapshot!(context.filters(), context @@ -815,7 +815,7 @@ fn with_editable() { #[test] #[cfg(feature = "test-pypi")] fn package_flag() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("flask").unwrap(); @@ -883,7 +883,7 @@ fn package_flag() { #[test] #[cfg(feature = "test-pypi")] fn show_version_specifiers_simple() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("requests==2.31.0").unwrap(); @@ -927,7 +927,7 @@ fn show_version_specifiers_simple() { #[test] #[cfg(feature = "test-pypi")] fn show_version_specifiers_with_invert() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("flask").unwrap(); @@ -983,7 +983,7 @@ fn show_version_specifiers_with_invert() { #[test] #[cfg(feature = "test-pypi")] fn show_version_specifiers_with_package() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("flask").unwrap(); @@ -1031,7 +1031,7 @@ fn show_version_specifiers_with_package() { #[test] #[cfg(feature = "test-pypi")] fn print_output_even_with_quite_flag() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("requests==2.31.0").unwrap(); @@ -1071,7 +1071,7 @@ fn print_output_even_with_quite_flag() { #[test] #[cfg(feature = "test-pypi")] fn outdated() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("flask==2.0.0").unwrap(); @@ -1138,7 +1138,7 @@ fn no_duplicate_dependencies_with_markers() { build-backend = "uv_build" "#}; - let context = TestContext::new_with_versions(&["3.12", "3.13"]).with_filtered_counts(); + let context = uv_test::test_context_with_versions!(&["3.12", "3.13"]).with_filtered_counts(); let project = context.temp_dir.child("debug"); diff --git a/crates/uv/tests/it/pip_uninstall.rs b/crates/uv/tests/it/pip_uninstall.rs index 4c7dd449e..aa4574b8a 100644 --- a/crates/uv/tests/it/pip_uninstall.rs +++ b/crates/uv/tests/it/pip_uninstall.rs @@ -3,11 +3,11 @@ use assert_cmd::prelude::*; use assert_fs::fixture::ChildPath; use assert_fs::prelude::*; -use crate::common::{TestContext, uv_snapshot}; +use uv_test::uv_snapshot; #[test] fn no_arguments() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.pip_uninstall(), @" success: false @@ -27,7 +27,7 @@ fn no_arguments() { #[test] fn invalid_requirement() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.pip_uninstall() .arg("flask==1.0.x"), @" @@ -45,7 +45,7 @@ fn invalid_requirement() { #[test] fn missing_requirements_txt() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.pip_uninstall() .arg("-r") @@ -62,7 +62,7 @@ fn missing_requirements_txt() { #[test] fn invalid_requirements_txt_requirement() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("flask==1.0.x")?; @@ -87,7 +87,7 @@ fn invalid_requirements_txt_requirement() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn uninstall() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("MarkupSafe==2.1.3")?; @@ -120,7 +120,7 @@ fn uninstall() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn missing_record() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str("MarkupSafe==2.1.3")?; @@ -154,7 +154,7 @@ fn missing_record() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn uninstall_editable_by_name() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str(&format!( @@ -195,7 +195,7 @@ fn uninstall_editable_by_name() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn uninstall_by_path() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str( @@ -236,7 +236,7 @@ fn uninstall_by_path() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn uninstall_duplicate_by_path() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_txt = context.temp_dir.child("requirements.txt"); requirements_txt.write_str( @@ -282,7 +282,7 @@ fn uninstall_duplicate() -> Result<()> { use uv_fs::copy_dir_all; // Sync a version of `pip` into a virtual environment. - let context1 = TestContext::new("3.12"); + let context1 = uv_test::test_context!("3.12"); let requirements_txt = context1.temp_dir.child("requirements.txt"); requirements_txt.write_str("pip==21.3.1")?; @@ -294,7 +294,7 @@ fn uninstall_duplicate() -> Result<()> { .success(); // Sync a different version of `pip` into a virtual environment. - let context2 = TestContext::new("3.12"); + let context2 = uv_test::test_context!("3.12"); let requirements_txt = context2.temp_dir.child("requirements.txt"); requirements_txt.write_str("pip==22.1.1")?; @@ -331,7 +331,7 @@ fn uninstall_duplicate() -> Result<()> { /// Uninstall a `.egg-info` package in a virtual environment. #[test] fn uninstall_egg_info() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let site_packages = ChildPath::new(context.site_packages()); @@ -393,7 +393,7 @@ fn normcase(s: &str) -> String { /// Uninstall a legacy editable package in a virtual environment. #[test] fn uninstall_legacy_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let site_packages = ChildPath::new(context.site_packages()); @@ -449,7 +449,7 @@ Version: 0.22.0 #[test] fn dry_run_uninstall_egg_info() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let site_packages = ChildPath::new(context.site_packages()); diff --git a/crates/uv/tests/it/publish.rs b/crates/uv/tests/it/publish.rs index 32bdcade4..d41ff213b 100644 --- a/crates/uv/tests/it/publish.rs +++ b/crates/uv/tests/it/publish.rs @@ -1,4 +1,3 @@ -use crate::common::{TestContext, uv_snapshot, venv_bin_path}; use assert_cmd::assert::OutputAssertExt; use assert_fs::fixture::{FileTouch, FileWriteStr, PathChild}; use fs_err::OpenOptions; @@ -9,6 +8,7 @@ use std::env::current_dir; use std::io::Write; use std::path::{Path, PathBuf}; use uv_static::EnvVars; +use uv_test::{uv_snapshot, venv_bin_path}; use wiremock::matchers::{basic_auth, method, path}; use wiremock::{Mock, MockServer, ResponseTemplate}; @@ -23,7 +23,7 @@ fn dummy_wheel() -> PathBuf { #[test] fn username_password_no_longer_supported() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.publish() .arg("-u") @@ -48,7 +48,7 @@ fn username_password_no_longer_supported() { #[test] fn invalid_token() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.publish() .arg("-u") @@ -74,7 +74,7 @@ fn invalid_token() { /// Emulate a missing `permission` `id-token: write` situation. #[test] fn mixed_credentials() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.publish() .arg("--username") @@ -102,7 +102,7 @@ fn mixed_credentials() { /// Emulate a missing `permission` `id-token: write` situation. #[test] fn missing_trusted_publishing_permission() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.publish() .arg("--publish-url") @@ -130,7 +130,7 @@ fn missing_trusted_publishing_permission() { /// trusted publishing configuration? #[test] fn no_credentials() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.publish() .arg("--publish-url") @@ -160,7 +160,7 @@ fn no_credentials() { /// Hint people that it's not `--skip-existing` but `--check-url`. #[test] fn skip_existing_redirect() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.publish() .arg("--skip-existing") @@ -178,7 +178,7 @@ fn skip_existing_redirect() { #[test] fn dubious_filenames() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context.temp_dir.child("not-a-wheel.whl").touch().unwrap(); context.temp_dir.child("data.tar.gz").touch().unwrap(); @@ -213,7 +213,7 @@ fn dubious_filenames() { /// Check that we (don't) use the keyring and warn for missing keyring behaviors correctly. #[test] fn check_keyring_behaviours() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Install our keyring plugin context @@ -337,7 +337,7 @@ fn check_keyring_behaviours() { #[test] fn invalid_index() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = indoc! {r#" [project] @@ -407,7 +407,7 @@ fn invalid_index() { /// #[tokio::test] async fn read_index_credential_env_vars_for_check_url() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let server = MockServer::start().await; @@ -510,7 +510,7 @@ async fn read_index_credential_env_vars_for_check_url() { /// Native GitLab CI trusted publishing using `PYPI_ID_TOKEN` #[tokio::test] async fn gitlab_trusted_publishing_pypi_id_token() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let server = MockServer::start().await; @@ -562,7 +562,7 @@ async fn gitlab_trusted_publishing_pypi_id_token() { /// Native GitLab CI trusted publishing using `TESTPYPI_ID_TOKEN` #[tokio::test] async fn gitlab_trusted_publishing_testpypi_id_token() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let server = MockServer::start().await; @@ -616,7 +616,7 @@ async fn gitlab_trusted_publishing_testpypi_id_token() { /// PyPI returns `application/json` errors with a `code` field. #[tokio::test] async fn upload_error_pypi_json() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let server = MockServer::start().await; Mock::given(method("POST")) @@ -652,7 +652,7 @@ async fn upload_error_pypi_json() { /// pyx returns `application/problem+json` errors with RFC 9457 Problem Details. #[tokio::test] async fn upload_error_problem_details() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let server = MockServer::start().await; Mock::given(method("POST")) @@ -689,7 +689,7 @@ async fn upload_error_problem_details() { /// stopping at the first failure. #[test] fn dry_run_reports_all_errors() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create two fake wheel files that will fail metadata reading. let wheel_a = context.temp_dir.child("a-1.0.0-py3-none-any.whl"); diff --git a/crates/uv/tests/it/python_dir.rs b/crates/uv/tests/it/python_dir.rs index a7bb59cec..6ad65d9e9 100644 --- a/crates/uv/tests/it/python_dir.rs +++ b/crates/uv/tests/it/python_dir.rs @@ -2,11 +2,11 @@ use assert_fs::fixture::PathChild; use uv_static::EnvVars; -use crate::common::{TestContext, uv_snapshot}; +use uv_test::uv_snapshot; #[test] fn python_dir() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let python_dir = context.temp_dir.child("python"); uv_snapshot!(context.filters(), context.python_dir() diff --git a/crates/uv/tests/it/python_find.rs b/crates/uv/tests/it/python_find.rs index 27c972ee7..c02124ac4 100644 --- a/crates/uv/tests/it/python_find.rs +++ b/crates/uv/tests/it/python_find.rs @@ -6,12 +6,12 @@ use indoc::indoc; use uv_platform::{Arch, Os}; use uv_static::EnvVars; -use crate::common::{TestContext, uv_snapshot, venv_bin_path}; +use uv_test::{TestContext, uv_snapshot, venv_bin_path}; #[test] fn python_find() { let mut context: TestContext = - TestContext::new_with_versions(&["3.11", "3.12"]).with_filtered_python_sources(); + uv_test::test_context_with_versions!(&["3.11", "3.12"]).with_filtered_python_sources(); // No interpreters on the path uv_snapshot!(context.filters(), context.python_find().env(EnvVars::UV_TEST_PYTHON_PATH, ""), @" @@ -152,7 +152,7 @@ fn python_find() { #[test] fn python_find_pin() { - let context: TestContext = TestContext::new_with_versions(&["3.11", "3.12"]); + let context: TestContext = uv_test::test_context_with_versions!(&["3.11", "3.12"]); // Pin to a version uv_snapshot!(context.filters(), context.python_pin().arg("3.12"), @" @@ -229,7 +229,7 @@ fn python_find_pin() { #[test] fn python_find_pin_arbitrary_name() { - let context: TestContext = TestContext::new_with_versions(&["3.11", "3.12"]); + let context: TestContext = uv_test::test_context_with_versions!(&["3.11", "3.12"]); // Try to pin to an arbitrary name uv_snapshot!(context.filters(), context.python_pin().arg("foo"), @" @@ -305,7 +305,7 @@ fn python_find_pin_arbitrary_name() { #[test] fn python_find_project() { - let context: TestContext = TestContext::new_with_versions(&["3.10", "3.11", "3.12"]); + let context: TestContext = uv_test::test_context_with_versions!(&["3.10", "3.11", "3.12"]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml @@ -417,7 +417,7 @@ fn python_find_project() { #[test] fn virtual_empty() { // testing how `uv python find` reacts to a pyproject with no `[project]` and nothing useful to it - let context = TestContext::new_with_versions(&["3.10", "3.11", "3.12"]); + let context = uv_test::test_context_with_versions!(&["3.10", "3.11", "3.12"]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml @@ -504,7 +504,7 @@ fn virtual_dependency_group() { // testing basic `uv python find` functionality // when the pyproject.toml is fully virtual (no `[project]`, but `[dependency-groups]` defined, // which really shouldn't matter) - let context = TestContext::new_with_versions(&["3.10", "3.11", "3.12"]); + let context = uv_test::test_context_with_versions!(&["3.10", "3.11", "3.12"]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml @@ -590,7 +590,7 @@ fn virtual_dependency_group() { #[test] fn python_find_venv() { - let context: TestContext = TestContext::new_with_versions(&["3.11", "3.12"]) + let context: TestContext = uv_test::test_context_with_versions!(&["3.11", "3.12"]) // Enable additional filters for Windows compatibility .with_filtered_exe_suffix() .with_filtered_python_names() @@ -776,7 +776,7 @@ fn python_find_venv() { #[cfg(unix)] #[test] fn python_find_unsupported_version() { - let context: TestContext = TestContext::new_with_versions(&["3.12"]); + let context: TestContext = uv_test::test_context_with_versions!(&["3.12"]); // Request a low version uv_snapshot!(context.filters(), context.python_find().arg("3.6"), @" @@ -851,7 +851,7 @@ fn python_find_unsupported_version() { #[test] fn python_find_venv_invalid() { - let context: TestContext = TestContext::new("3.12") + let context: TestContext = uv_test::test_context!("3.12") .with_filtered_python_names() .with_filtered_virtualenv_bin() .with_filtered_exe_suffix(); @@ -904,7 +904,7 @@ fn python_find_venv_invalid() { #[test] fn python_find_managed() { - let context: TestContext = TestContext::new_with_versions(&["3.11", "3.12"]) + let context: TestContext = uv_test::test_context_with_versions!(&["3.11", "3.12"]) .with_filtered_python_sources() .with_versions_as_managed(&["3.12"]); @@ -928,7 +928,7 @@ fn python_find_managed() { error: No interpreter found for Python 3.11 in virtual environments or managed installations "); - let context: TestContext = TestContext::new_with_versions(&["3.11", "3.12"]) + let context: TestContext = uv_test::test_context_with_versions!(&["3.11", "3.12"]) .with_filtered_python_sources() .with_versions_as_managed(&["3.11"]); @@ -983,7 +983,7 @@ fn python_find_managed() { #[cfg(unix)] #[cfg(feature = "test-python-managed")] fn python_required_python_major_minor() { - let context: TestContext = TestContext::new_with_versions(&["3.11", "3.12"]); + let context: TestContext = uv_test::test_context_with_versions!(&["3.11", "3.12"]); // Find the Python 3.11 executable. let path = &context.python_versions.first().unwrap().1; @@ -1026,7 +1026,7 @@ fn python_required_python_major_minor() { #[test] fn python_find_script() { - let context = TestContext::new("3.13") + let context = uv_test::test_context!("3.13") .with_filtered_virtualenv_bin() .with_filtered_python_names() .with_filtered_exe_suffix(); @@ -1063,7 +1063,7 @@ fn python_find_script() { #[test] fn python_find_script_no_environment() { - let context = TestContext::new("3.13") + let context = uv_test::test_context!("3.13") .with_filtered_virtualenv_bin() .with_filtered_python_names() .with_filtered_exe_suffix(); @@ -1090,7 +1090,7 @@ fn python_find_script_no_environment() { #[test] fn python_find_script_python_not_found() { - let context = TestContext::new_with_versions(&[]).with_filtered_python_sources(); + let context = uv_test::test_context_with_versions!(&[]).with_filtered_python_sources(); let script = context.temp_dir.child("foo.py"); @@ -1116,7 +1116,7 @@ fn python_find_script_python_not_found() { #[test] fn python_find_script_no_such_version() { - let context = TestContext::new("3.13") + let context = uv_test::test_context!("3.13") .with_filtered_virtualenv_bin() .with_filtered_python_names() .with_filtered_exe_suffix() @@ -1164,7 +1164,7 @@ fn python_find_script_no_such_version() { #[test] fn python_find_show_version() { let context: TestContext = - TestContext::new_with_versions(&["3.11", "3.12"]).with_filtered_python_sources(); + uv_test::test_context_with_versions!(&["3.11", "3.12"]).with_filtered_python_sources(); // No interpreters found uv_snapshot!(context.filters(), context.python_find().env(EnvVars::UV_TEST_PYTHON_PATH, "").arg("--show-version"), @" @@ -1209,7 +1209,8 @@ fn python_find_show_version() { #[test] fn python_find_path() { - let context: TestContext = TestContext::new_with_versions(&[]).with_filtered_not_executable(); + let context: TestContext = + uv_test::test_context_with_versions!(&[]).with_filtered_not_executable(); context.temp_dir.child("foo").create_dir_all().unwrap(); context.temp_dir.child("bar").touch().unwrap(); @@ -1250,7 +1251,7 @@ fn python_find_path() { #[test] #[cfg(feature = "test-python-managed")] fn python_find_freethreaded_313() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_python_sources() .with_managed_python_dirs() @@ -1290,7 +1291,7 @@ fn python_find_freethreaded_313() { #[test] #[cfg(feature = "test-python-managed")] fn python_find_freethreaded_314() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_python_sources() .with_managed_python_dirs() @@ -1368,7 +1369,7 @@ fn python_find_freethreaded_314() { #[test] #[cfg(feature = "test-python-managed")] fn python_find_prerelease_version_specifiers() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_python_sources() .with_managed_python_dirs() @@ -1468,7 +1469,7 @@ fn python_find_prerelease_version_specifiers() { #[test] #[cfg(feature = "test-python-managed")] fn python_find_prerelease_with_patch_request() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_python_sources() .with_managed_python_dirs() diff --git a/crates/uv/tests/it/python_install.rs b/crates/uv/tests/it/python_install.rs index f8d68ca92..5f11faf90 100644 --- a/crates/uv/tests/it/python_install.rs +++ b/crates/uv/tests/it/python_install.rs @@ -3,7 +3,6 @@ use std::path::PathBuf; use std::{env, path::Path, process::Command}; -use crate::common::{TestContext, uv_snapshot}; use anyhow::Context; use assert_cmd::assert::OutputAssertExt; use assert_fs::{ @@ -13,6 +12,7 @@ use assert_fs::{ use indoc::indoc; use predicates::prelude::predicate; use tracing::debug; +use uv_test::{TestContext, uv_snapshot}; use uv_fs::Simplified; use uv_python::managed::platform_key_from_env; @@ -21,7 +21,7 @@ use walkdir::WalkDir; #[test] fn python_install() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_filtered_latest_python_versions() @@ -147,7 +147,7 @@ fn python_install() { #[test] fn python_reinstall() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_filtered_latest_python_versions() @@ -203,7 +203,7 @@ fn python_reinstall() { #[test] fn python_reinstall_patch() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_managed_python_dirs() @@ -237,7 +237,7 @@ fn python_reinstall_patch() { #[test] fn python_install_automatic() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_filtered_python_sources() @@ -349,7 +349,7 @@ fn python_install_automatic() { /// #[test] fn regression_cpython() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_filtered_python_sources() @@ -382,7 +382,7 @@ fn regression_cpython() { #[test] fn python_install_force() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_filtered_latest_python_versions() @@ -446,7 +446,7 @@ fn python_install_force() { #[test] fn python_install_minor() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_filtered_latest_python_versions() @@ -506,7 +506,7 @@ fn python_install_minor() { #[test] fn python_install_multiple_patch() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_managed_python_dirs(); @@ -586,7 +586,7 @@ fn python_install_multiple_patch() { #[test] fn python_install_preview() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_filtered_latest_python_versions() @@ -863,7 +863,7 @@ fn python_install_preview() { #[test] fn python_install_preview_no_bin() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_filtered_latest_python_versions() @@ -911,7 +911,7 @@ fn python_install_preview_no_bin() { #[test] fn python_install_preview_upgrade() { - let context = TestContext::new_with_versions(&[]) + let context = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_managed_python_dirs() @@ -1070,7 +1070,7 @@ fn python_install_preview_upgrade() { #[test] fn python_install_freethreaded() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_latest_python_versions() .with_managed_python_dirs() @@ -1227,7 +1227,7 @@ fn python_install_freethreaded() { #[test] fn python_upgrade_not_allowed() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_managed_python_dirs(); @@ -1257,7 +1257,7 @@ fn python_upgrade_not_allowed() { #[cfg(unix)] #[test] fn python_install_debug() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_filtered_latest_python_versions() @@ -1386,7 +1386,7 @@ fn python_install_debug() { #[cfg(unix)] #[test] fn python_install_debug_freethreaded() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_filtered_latest_python_versions() @@ -1536,7 +1536,7 @@ fn python_install_debug_freethreaded() { #[test] fn python_install_invalid_request() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_managed_python_dirs() @@ -1575,7 +1575,7 @@ fn python_install_invalid_request() { #[test] fn python_install_default() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_filtered_latest_python_versions() @@ -1815,7 +1815,7 @@ fn python_install_default() { #[test] fn python_install_default_preview() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_filtered_latest_python_versions() @@ -2203,7 +2203,7 @@ fn read_link(path: &Path) -> String { #[test] fn python_install_unknown() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_managed_python_dirs() .with_python_download_cache(); @@ -2236,7 +2236,7 @@ fn python_install_broken_link() { use assert_fs::prelude::PathCreateDir; use fs_err::os::unix::fs::symlink; - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_managed_python_dirs() @@ -2275,7 +2275,7 @@ fn python_install_broken_link() { /// python.exe and python3.exe links for pre-release versions. #[test] fn python_install_default_prerelease() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_managed_python_dirs() @@ -2311,7 +2311,7 @@ fn python_install_default_prerelease() { #[test] fn python_install_default_from_env() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_filtered_latest_python_versions() @@ -2404,7 +2404,7 @@ fn python_install_patch_dylib() { use assert_cmd::assert::OutputAssertExt; use uv_python::managed::platform_key_from_env; - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_managed_python_dirs() .with_python_download_cache(); @@ -2447,7 +2447,7 @@ fn python_install_patch_dylib() { #[test] fn python_install_prerelease() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_latest_python_versions() .with_managed_python_dirs() @@ -2481,7 +2481,7 @@ fn python_install_prerelease() { #[test] fn python_find_prerelease() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_latest_python_versions() .with_managed_python_dirs() @@ -2556,7 +2556,7 @@ fn python_install_cached() { return; } - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_managed_python_dirs() @@ -2651,7 +2651,7 @@ fn python_install_no_cache() { return; } - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_managed_python_dirs() @@ -2757,7 +2757,7 @@ fn python_install_no_cache() { #[cfg(all(target_os = "macos", target_arch = "aarch64"))] #[test] fn python_install_emulated_macos() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_exe_suffix() .with_managed_python_dirs() .with_python_download_cache() @@ -2844,7 +2844,7 @@ fn python_install_emulated_macos() { #[cfg(all(target_os = "windows", target_arch = "x86_64"))] #[test] fn python_install_emulated_windows_x86_on_x64() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_exe_suffix() .with_managed_python_dirs() .with_python_download_cache() @@ -2916,7 +2916,7 @@ fn python_install_emulated_windows_x86_on_x64() { // A virtual environment should track the latest patch version installed. #[test] fn install_transparent_patch_upgrade_uv_venv() { - let context = TestContext::new_with_versions(&["3.13"]) + let context = uv_test::test_context_with_versions!(&["3.13"]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_managed_python_dirs() @@ -3010,7 +3010,7 @@ fn install_transparent_patch_upgrade_uv_venv() { // minor version should point to the highest. #[test] fn install_multiple_patches() { - let context = TestContext::new_with_versions(&[]) + let context = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_managed_python_dirs() @@ -3101,7 +3101,7 @@ fn install_multiple_patches() { // next highest. #[test] fn uninstall_highest_patch() { - let context = TestContext::new_with_versions(&[]) + let context = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_managed_python_dirs() @@ -3175,7 +3175,7 @@ fn uninstall_highest_patch() { // installed. #[test] fn install_no_transparent_upgrade_with_venv_patch_specification() { - let context = TestContext::new_with_versions(&["3.13"]) + let context = uv_test::test_context_with_versions!(&["3.13"]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_managed_python_dirs() @@ -3245,7 +3245,7 @@ fn install_no_transparent_upgrade_with_venv_patch_specification() { // the latest patch version installed. #[test] fn install_transparent_patch_upgrade_venv_module() { - let context = TestContext::new_with_versions(&[]) + let context = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_managed_python_dirs() @@ -3323,7 +3323,7 @@ fn install_transparent_patch_upgrade_venv_module() { // `uv run` should not downgrade virtual environments. #[test] fn install_lower_patch_automatically() { - let context = TestContext::new_with_versions(&[]) + let context = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_managed_python_dirs() @@ -3393,7 +3393,7 @@ fn install_lower_patch_automatically() { #[test] fn uninstall_last_patch() { - let context = TestContext::new_with_versions(&[]) + let context = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_managed_python_dirs() @@ -3480,7 +3480,7 @@ fn uninstall_last_patch() { fn python_install_pyodide() { use assert_cmd::assert::OutputAssertExt; - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_exe_suffix() .with_managed_python_dirs() .with_python_download_cache() @@ -3651,7 +3651,7 @@ fn python_install_pyodide() { fn python_install_build_version() { use uv_python::managed::platform_key_from_env; - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_managed_python_dirs() .with_python_download_cache() @@ -3734,7 +3734,7 @@ fn python_install_build_version() { fn python_install_build_version_pypy() { use uv_python::managed::platform_key_from_env; - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_python_sources() .with_managed_python_dirs() @@ -3803,7 +3803,7 @@ fn python_install_build_version_pypy() { #[test] fn python_install_upgrade() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_python_download_cache() .with_filtered_python_keys() .with_filtered_exe_suffix() @@ -3930,7 +3930,7 @@ fn python_install_upgrade() { #[test] fn python_install_upgrade_version_file() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_python_download_cache() .with_filtered_python_keys() .with_filtered_exe_suffix() @@ -3979,7 +3979,7 @@ fn python_install_upgrade_version_file() { #[test] fn python_install_armv7() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_managed_python_dirs() .with_python_download_cache() @@ -4025,7 +4025,7 @@ fn python_install_compile_bytecode() -> anyhow::Result<()> { Ok(count) } - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_filtered_compiled_file_count() @@ -4099,7 +4099,7 @@ fn python_install_compile_bytecode() -> anyhow::Result<()> { #[test] fn python_install_compile_bytecode_existing() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_filtered_compiled_file_count() @@ -4132,7 +4132,7 @@ fn python_install_compile_bytecode_existing() { #[test] fn python_install_compile_bytecode_upgrade() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_filtered_compiled_file_count() @@ -4166,7 +4166,7 @@ fn python_install_compile_bytecode_upgrade() { #[test] fn python_install_upgrade_build_version() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_python_download_cache() .with_filtered_python_keys() .with_filtered_exe_suffix() @@ -4225,7 +4225,7 @@ fn python_install_upgrade_build_version() { #[test] fn python_install_compile_bytecode_multiple() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_filtered_compiled_file_count() @@ -4251,7 +4251,7 @@ fn python_install_compile_bytecode_multiple() { #[cfg(unix)] // Pyodide cannot be used on Windows #[test] fn python_install_compile_bytecode_pyodide() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_filtered_compiled_file_count() @@ -4279,7 +4279,7 @@ fn python_install_compile_bytecode_pyodide() { #[test] fn python_install_compile_bytecode_graalpy() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_filtered_compiled_file_count() @@ -4302,7 +4302,7 @@ fn python_install_compile_bytecode_graalpy() { #[test] fn python_install_compile_bytecode_pypy() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_exe_suffix() .with_filtered_compiled_file_count() diff --git a/crates/uv/tests/it/python_list.rs b/crates/uv/tests/it/python_list.rs index 5c4b6216b..c0331db48 100644 --- a/crates/uv/tests/it/python_list.rs +++ b/crates/uv/tests/it/python_list.rs @@ -1,8 +1,8 @@ use uv_platform::{Arch, Os}; use uv_static::EnvVars; -use crate::common::{TestContext, uv_snapshot}; use anyhow::Result; +use uv_test::{TestContext, uv_snapshot}; use wiremock::{ Mock, MockServer, ResponseTemplate, matchers::{method, path}, @@ -10,7 +10,7 @@ use wiremock::{ #[test] fn python_list() { - let mut context: TestContext = TestContext::new_with_versions(&["3.11", "3.12"]) + let mut context: TestContext = uv_test::test_context_with_versions!(&["3.11", "3.12"]) .with_filtered_python_symlinks() .with_filtered_python_keys() .with_collapsed_whitespace(); @@ -133,7 +133,7 @@ fn python_list() { #[test] fn python_list_pin() { - let context: TestContext = TestContext::new_with_versions(&["3.11", "3.12"]) + let context: TestContext = uv_test::test_context_with_versions!(&["3.11", "3.12"]) .with_filtered_python_symlinks() .with_filtered_python_keys() .with_collapsed_whitespace(); @@ -173,7 +173,7 @@ fn python_list_pin() { #[test] fn python_list_venv() { - let context: TestContext = TestContext::new_with_versions(&["3.11", "3.12"]) + let context: TestContext = uv_test::test_context_with_versions!(&["3.11", "3.12"]) .with_filtered_python_symlinks() .with_filtered_python_keys() .with_filtered_exe_suffix() @@ -216,7 +216,7 @@ fn python_list_venv() { #[cfg(unix)] #[test] fn python_list_unsupported_version() { - let context: TestContext = TestContext::new_with_versions(&["3.12"]) + let context: TestContext = uv_test::test_context_with_versions!(&["3.12"]) .with_filtered_python_symlinks() .with_filtered_python_keys(); @@ -291,7 +291,7 @@ fn python_list_unsupported_version() { #[test] fn python_list_duplicate_path_entries() { - let context: TestContext = TestContext::new_with_versions(&["3.11", "3.12"]) + let context: TestContext = uv_test::test_context_with_versions!(&["3.11", "3.12"]) .with_filtered_python_symlinks() .with_filtered_python_keys() .with_collapsed_whitespace(); @@ -360,7 +360,8 @@ fn python_list_duplicate_path_entries() { #[test] fn python_list_downloads() { - let context: TestContext = TestContext::new_with_versions(&[]).with_filtered_python_keys(); + let context: TestContext = + uv_test::test_context_with_versions!(&[]).with_filtered_python_keys(); // We do not test showing all interpreters — as it differs per platform // Instead, we choose a Python version where our available distributions are stable @@ -415,7 +416,7 @@ fn python_list_downloads() { fn python_list_downloads_installed() { use assert_cmd::assert::OutputAssertExt; - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_filtered_python_install_bin() .with_filtered_python_names() @@ -487,7 +488,7 @@ fn python_list_downloads_installed() { #[tokio::test] async fn python_list_remote_python_downloads_json_url() -> Result<()> { - let context: TestContext = TestContext::new_with_versions(&[]); + let context: TestContext = uv_test::test_context_with_versions!(&[]); let server = MockServer::start().await; let remote_json = r#" @@ -592,7 +593,7 @@ async fn python_list_remote_python_downloads_json_url() -> Result<()> { #[test] fn python_list_with_mirrors() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_filtered_python_keys() .with_collapsed_whitespace() // Add filters to normalize file paths in URLs diff --git a/crates/uv/tests/it/python_module.rs b/crates/uv/tests/it/python_module.rs index 713a803ba..3fa974072 100644 --- a/crates/uv/tests/it/python_module.rs +++ b/crates/uv/tests/it/python_module.rs @@ -5,7 +5,7 @@ use indoc::{formatdoc, indoc}; use uv_fs::Simplified; use uv_static::EnvVars; -use crate::common::{TestContext, site_packages_path, uv_snapshot}; +use uv_test::{site_packages_path, uv_snapshot}; /// Filter the user scheme, which differs between Windows and Unix. fn user_scheme_bin_filter() -> (String, String) { @@ -32,7 +32,7 @@ print(uv.find_uv_bin()) #[test] fn find_uv_bin_venv() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_python_names() .with_filtered_virtualenv_bin() .with_filtered_exe_suffix() @@ -72,7 +72,7 @@ fn find_uv_bin_venv() { #[test] fn find_uv_bin_target() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_python_names() .with_filtered_virtualenv_bin() .with_filtered_exe_suffix() @@ -116,7 +116,7 @@ fn find_uv_bin_target() { #[test] fn find_uv_bin_prefix() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_python_names() .with_filtered_virtualenv_bin() .with_filtered_exe_suffix() @@ -165,7 +165,7 @@ fn find_uv_bin_prefix() { #[test] fn find_uv_bin_base_prefix() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_python_names() .with_filtered_virtualenv_bin() .with_filtered_exe_suffix() @@ -216,7 +216,7 @@ fn find_uv_bin_base_prefix() { #[test] fn find_uv_bin_in_ephemeral_environment() -> anyhow::Result<()> { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_python_names() .with_filtered_virtualenv_bin() .with_filtered_exe_suffix() @@ -263,7 +263,7 @@ fn find_uv_bin_in_ephemeral_environment() -> anyhow::Result<()> { #[test] fn find_uv_bin_in_parent_of_ephemeral_environment() -> anyhow::Result<()> { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_python_names() .with_filtered_virtualenv_bin() .with_filtered_exe_suffix() @@ -320,7 +320,7 @@ fn find_uv_bin_in_parent_of_ephemeral_environment() -> anyhow::Result<()> { #[test] fn find_uv_bin_user_bin() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_python_names() .with_filtered_virtualenv_bin() .with_filtered_exe_suffix() @@ -396,7 +396,7 @@ fn find_uv_bin_user_bin() { #[test] fn find_uv_bin_error_message() { - let mut context = TestContext::new("3.12") + let mut context = uv_test::test_context!("3.12") .with_filtered_python_names() .with_filtered_virtualenv_bin() .with_filtered_exe_suffix() @@ -475,7 +475,7 @@ fn find_uv_bin_error_message() { #[cfg(feature = "test-python-eol")] #[test] fn find_uv_bin_py38() { - let context = TestContext::new("3.8") + let context = uv_test::test_context!("3.8") .with_filtered_python_names() .with_filtered_virtualenv_bin() .with_filtered_exe_suffix() @@ -515,7 +515,7 @@ fn find_uv_bin_py38() { #[test] fn find_uv_bin_py39() { - let context = TestContext::new("3.9") + let context = uv_test::test_context!("3.9") .with_filtered_python_names() .with_filtered_virtualenv_bin() .with_filtered_exe_suffix() @@ -555,7 +555,7 @@ fn find_uv_bin_py39() { #[test] fn find_uv_bin_py310() { - let context = TestContext::new("3.10") + let context = uv_test::test_context!("3.10") .with_filtered_python_names() .with_filtered_virtualenv_bin() .with_filtered_exe_suffix() @@ -595,7 +595,7 @@ fn find_uv_bin_py310() { #[test] fn find_uv_bin_py311() { - let context = TestContext::new("3.11") + let context = uv_test::test_context!("3.11") .with_filtered_python_names() .with_filtered_virtualenv_bin() .with_filtered_exe_suffix() @@ -635,7 +635,7 @@ fn find_uv_bin_py311() { #[test] fn find_uv_bin_py312() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_python_names() .with_filtered_virtualenv_bin() .with_filtered_exe_suffix() @@ -675,7 +675,7 @@ fn find_uv_bin_py312() { #[test] fn find_uv_bin_py313() { - let context = TestContext::new("3.13") + let context = uv_test::test_context!("3.13") .with_filtered_python_names() .with_filtered_virtualenv_bin() .with_filtered_exe_suffix() @@ -715,7 +715,7 @@ fn find_uv_bin_py313() { #[test] fn find_uv_bin_py314() { - let context = TestContext::new("3.14") + let context = uv_test::test_context!("3.14") .with_filtered_python_names() .with_filtered_virtualenv_bin() .with_filtered_exe_suffix() diff --git a/crates/uv/tests/it/python_pin.rs b/crates/uv/tests/it/python_pin.rs index aa06662f8..9c3aabf05 100644 --- a/crates/uv/tests/it/python_pin.rs +++ b/crates/uv/tests/it/python_pin.rs @@ -1,6 +1,5 @@ use std::path::PathBuf; -use crate::common::{TestContext, uv_snapshot}; use anyhow::Result; use assert_cmd::assert::OutputAssertExt; use assert_fs::fixture::{FileWriteStr, PathChild, PathCreateDir}; @@ -8,10 +7,11 @@ use insta::assert_snapshot; use uv_platform::{Arch, Os}; use uv_python::{PYTHON_VERSION_FILENAME, PYTHON_VERSIONS_FILENAME}; use uv_static::EnvVars; +use uv_test::{TestContext, uv_snapshot}; #[test] fn python_pin() { - let context: TestContext = TestContext::new_with_versions(&["3.11", "3.12"]); + let context: TestContext = uv_test::test_context_with_versions!(&["3.11", "3.12"]); // Without arguments, we attempt to read the current pin (which does not exist yet) uv_snapshot!(context.filters(), context.python_pin(), @" @@ -185,7 +185,7 @@ fn python_pin() { // If there is no project-level `.python-version` file, respect the global pin. #[test] fn python_pin_global_if_no_local() -> Result<()> { - let context: TestContext = TestContext::new_with_versions(&["3.11", "3.12"]); + let context: TestContext = uv_test::test_context_with_versions!(&["3.11", "3.12"]); let uv = context.user_config_dir.child("uv"); uv.create_dir_all()?; @@ -226,7 +226,7 @@ fn python_pin_global_if_no_local() -> Result<()> { // the global pin. #[test] fn python_pin_global_use_local_if_available() -> Result<()> { - let context: TestContext = TestContext::new_with_versions(&["3.11", "3.12"]); + let context: TestContext = uv_test::test_context_with_versions!(&["3.11", "3.12"]); let uv = context.user_config_dir.child("uv"); uv.create_dir_all()?; @@ -306,7 +306,7 @@ fn python_pin_global_use_local_if_available() -> Result<()> { #[test] fn python_pin_global_creates_parent_dirs() { - let context: TestContext = TestContext::new_with_versions(&["3.12"]); + let context: TestContext = uv_test::test_context_with_versions!(&["3.12"]); let uv_global_config_dir = context.user_config_dir.child("uv"); assert!( @@ -334,7 +334,7 @@ fn python_pin_global_creates_parent_dirs() { #[cfg(unix)] #[test] fn python_pin_no_python() { - let context: TestContext = TestContext::new_with_versions(&[]); + let context: TestContext = uv_test::test_context_with_versions!(&[]); uv_snapshot!(context.filters(), context.python_pin().arg("3.12"), @" success: true @@ -350,7 +350,7 @@ fn python_pin_no_python() { #[test] fn python_pin_compatible_with_requires_python() -> Result<()> { let context: TestContext = - TestContext::new_with_versions(&["3.10", "3.11"]).with_filtered_python_sources(); + uv_test::test_context_with_versions!(&["3.10", "3.11"]).with_filtered_python_sources(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#" @@ -518,7 +518,7 @@ fn python_pin_compatible_with_requires_python() -> Result<()> { #[test] fn warning_pinned_python_version_not_installed() -> Result<()> { - let context: TestContext = TestContext::new_with_versions(&["3.10", "3.11"]); + let context: TestContext = uv_test::test_context_with_versions!(&["3.10", "3.11"]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#" @@ -560,7 +560,8 @@ fn warning_pinned_python_version_not_installed() -> Result<()> { /// We do need a Python interpreter for `--resolved` pins #[test] fn python_pin_resolve_no_python() { - let context: TestContext = TestContext::new_with_versions(&[]).with_filtered_python_sources(); + let context: TestContext = + uv_test::test_context_with_versions!(&[]).with_filtered_python_sources(); uv_snapshot!(context.filters(), context.python_pin().arg("--resolved").arg("3.12"), @" success: false exit_code: 2 @@ -575,7 +576,7 @@ fn python_pin_resolve_no_python() { #[test] fn python_pin_resolve() { - let context: TestContext = TestContext::new_with_versions(&["3.12", "3.13"]); + let context: TestContext = uv_test::test_context_with_versions!(&["3.12", "3.13"]); // We pin the first interpreter on the path uv_snapshot!(context.filters(), context.python_pin().arg("--resolved").arg("any"), @" @@ -744,7 +745,7 @@ fn python_pin_resolve() { #[test] fn python_pin_with_comments() -> Result<()> { - let context = TestContext::new_with_versions(&[]); + let context = uv_test::test_context_with_versions!(&[]); let content = indoc::indoc! {r" 3.12 @@ -784,7 +785,8 @@ fn python_pin_with_comments() -> Result<()> { #[test] #[cfg(feature = "test-python-managed")] fn python_pin_install() { - let context: TestContext = TestContext::new_with_versions(&[]).with_filtered_python_sources(); + let context: TestContext = + uv_test::test_context_with_versions!(&[]).with_filtered_python_sources(); // Should not install 3.12 when downloads are not automatic uv_snapshot!(context.filters(), context.python_pin().arg("3.12"), @" @@ -809,7 +811,7 @@ fn python_pin_install() { #[test] fn python_pin_rm() { - let context: TestContext = TestContext::new_with_versions(&["3.12"]); + let context: TestContext = uv_test::test_context_with_versions!(&["3.12"]); uv_snapshot!(context.filters(), context.python_pin().arg("--rm"), @" success: false diff --git a/crates/uv/tests/it/python_upgrade.rs b/crates/uv/tests/it/python_upgrade.rs index 2ca8419e4..8215b0853 100644 --- a/crates/uv/tests/it/python_upgrade.rs +++ b/crates/uv/tests/it/python_upgrade.rs @@ -1,14 +1,14 @@ -use crate::common::{TestContext, uv_snapshot}; use anyhow::Result; use assert_cmd::assert::OutputAssertExt; use assert_fs::fixture::FileTouch; use assert_fs::prelude::PathChild; use uv_python::managed::platform_key_from_env; use uv_static::EnvVars; +use uv_test::{TestContext, uv_snapshot}; #[test] fn python_upgrade() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_python_download_cache() .with_filtered_python_keys() .with_filtered_exe_suffix() @@ -93,7 +93,7 @@ fn python_upgrade() { #[test] fn python_upgrade_without_version() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_python_download_cache() .with_filtered_python_keys() .with_filtered_exe_suffix() @@ -162,7 +162,7 @@ fn python_upgrade_without_version() { #[test] fn python_upgrade_transparent_from_venv() { - let context: TestContext = TestContext::new_with_versions(&["3.13"]) + let context: TestContext = uv_test::test_context_with_versions!(&["3.13"]) .with_python_download_cache() .with_filtered_python_keys() .with_filtered_exe_suffix() @@ -265,7 +265,7 @@ fn python_upgrade_transparent_from_venv() { // upgrading. #[test] fn python_upgrade_transparent_from_venv_preview() { - let context: TestContext = TestContext::new_with_versions(&["3.13"]) + let context: TestContext = uv_test::test_context_with_versions!(&["3.13"]) .with_python_download_cache() .with_filtered_python_keys() .with_filtered_exe_suffix() @@ -329,7 +329,7 @@ fn python_upgrade_transparent_from_venv_preview() { #[test] fn python_upgrade_ignored_with_python_pin() { - let context: TestContext = TestContext::new_with_versions(&["3.13"]) + let context: TestContext = uv_test::test_context_with_versions!(&["3.13"]) .with_python_download_cache() .with_filtered_python_keys() .with_filtered_exe_suffix() @@ -395,7 +395,7 @@ fn python_upgrade_ignored_with_python_pin() { // prevent transparent upgrades. #[test] fn python_no_transparent_upgrade_with_venv_patch_specification() { - let context: TestContext = TestContext::new_with_versions(&["3.13"]) + let context: TestContext = uv_test::test_context_with_versions!(&["3.13"]) .with_python_download_cache() .with_filtered_python_keys() .with_filtered_exe_suffix() @@ -461,7 +461,7 @@ fn python_no_transparent_upgrade_with_venv_patch_specification() { // virtual environments. #[test] fn python_transparent_upgrade_venv_venv() { - let context: TestContext = TestContext::new_with_versions(&["3.13"]) + let context: TestContext = uv_test::test_context_with_versions!(&["3.13"]) .with_python_download_cache() .with_filtered_python_keys() .with_filtered_exe_suffix() @@ -555,7 +555,7 @@ fn python_transparent_upgrade_venv_venv() { // the `venv` module. #[test] fn python_upgrade_transparent_from_venv_module() { - let context = TestContext::new_with_versions(&["3.13"]) + let context = uv_test::test_context_with_versions!(&["3.13"]) .with_python_download_cache() .with_filtered_python_keys() .with_filtered_exe_suffix() @@ -623,7 +623,7 @@ fn python_upgrade_transparent_from_venv_module() { // the `venv` module within an existing virtual environment. #[test] fn python_upgrade_transparent_from_venv_module_in_venv() { - let context = TestContext::new_with_versions(&["3.13"]) + let context = uv_test::test_context_with_versions!(&["3.13"]) .with_python_download_cache() .with_filtered_python_keys() .with_filtered_exe_suffix() @@ -711,7 +711,7 @@ fn python_upgrade_transparent_from_venv_module_in_venv() { // interpreter. #[test] fn python_upgrade_force_install() -> Result<()> { - let context = TestContext::new_with_versions(&["3.13"]) + let context = uv_test::test_context_with_versions!(&["3.13"]) .with_python_download_cache() .with_filtered_python_keys() .with_filtered_exe_suffix() @@ -751,7 +751,7 @@ fn python_upgrade_force_install() -> Result<()> { #[test] fn python_upgrade_implementation() { - let context = TestContext::new_with_versions(&[]) + let context = uv_test::test_context_with_versions!(&[]) .with_python_download_cache() .with_filtered_python_keys() .with_filtered_exe_suffix() @@ -774,7 +774,7 @@ fn python_upgrade_implementation() { #[test] fn python_upgrade_build_version() { - let context: TestContext = TestContext::new_with_versions(&[]) + let context: TestContext = uv_test::test_context_with_versions!(&[]) .with_python_download_cache() .with_filtered_python_keys() .with_filtered_exe_suffix() diff --git a/crates/uv/tests/it/run.rs b/crates/uv/tests/it/run.rs index f6f29e75a..8e8526f88 100644 --- a/crates/uv/tests/it/run.rs +++ b/crates/uv/tests/it/run.rs @@ -11,11 +11,11 @@ use uv_fs::copy_dir_all; use uv_python::PYTHON_VERSION_FILENAME; use uv_static::EnvVars; -use crate::common::{TestContext, uv_snapshot}; +use uv_test::{TestContext, uv_snapshot}; #[test] fn run_with_python_version() -> Result<()> { - let context = TestContext::new_with_versions(&["3.12", "3.11", "3.9"]); + let context = uv_test::test_context_with_versions!(&["3.12", "3.11", "3.9"]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -141,7 +141,7 @@ fn run_with_python_version() -> Result<()> { #[test] fn run_args() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let mut filters = context.filters(); filters.push((r"Usage: (uv|\.exe) run \[OPTIONS\] (?s).*", "[UV RUN HELP]")); @@ -199,7 +199,7 @@ fn run_args() -> Result<()> { /// This should list the available scripts. #[test] fn run_no_args() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -267,7 +267,7 @@ fn run_no_args() -> Result<()> { /// dependencies. #[test] fn run_pep723_script() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -475,7 +475,7 @@ fn run_pep723_script() -> Result<()> { #[test] fn run_pep723_script_requires_python() -> Result<()> { - let context = TestContext::new_with_versions(&["3.9", "3.11"]); + let context = uv_test::test_context_with_versions!(&["3.9", "3.11"]); // If we have a `.python-version` that's incompatible with the script, we should error. let python_version = context.temp_dir.child(PYTHON_VERSION_FILENAME); @@ -536,7 +536,7 @@ fn run_pep723_script_requires_python() -> Result<()> { /// Run a `.pyw` script. The script should be executed with `pythonw.exe`. #[test] fn run_pythonw_script() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -580,7 +580,7 @@ fn run_pythonw_script() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn run_pep723_script_metadata() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // If the script contains a PEP 723 tag, we should install its requirements. let test_script = context.temp_dir.child("main.py"); @@ -648,7 +648,7 @@ fn run_pep723_script_metadata() -> Result<()> { /// Run a PEP 723-compatible script with a `[[tool.uv.index]]`. #[test] fn run_pep723_script_index() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let test_script = context.temp_dir.child("main.py"); test_script.write_str(indoc! { r#" @@ -689,7 +689,7 @@ fn run_pep723_script_index() -> Result<()> { /// Run a PEP 723-compatible script with `tool.uv` constraints. #[test] fn run_pep723_script_constraints() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let test_script = context.temp_dir.child("main.py"); test_script.write_str(indoc! { r#" @@ -727,7 +727,7 @@ fn run_pep723_script_constraints() -> Result<()> { /// Run a PEP 723-compatible script with `tool.uv` overrides. #[test] fn run_pep723_script_overrides() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let test_script = context.temp_dir.child("main.py"); test_script.write_str(indoc! { r#" @@ -765,7 +765,7 @@ fn run_pep723_script_overrides() -> Result<()> { /// Run a PEP 723-compatible script with `tool.uv` build constraints. #[test] fn run_pep723_script_build_constraints() -> Result<()> { - let context = TestContext::new("3.9"); + let context = uv_test::test_context!("3.9"); let test_script = context.temp_dir.child("main.py"); @@ -838,7 +838,7 @@ fn run_pep723_script_build_constraints() -> Result<()> { /// Run a PEP 723-compatible script with a lockfile. #[test] fn run_pep723_script_lock() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let test_script = context.temp_dir.child("main.py"); test_script.write_str(indoc! { r#" @@ -1046,7 +1046,7 @@ fn run_pep723_script_lock() -> Result<()> { /// With `managed = false`, we should avoid installing the project itself. #[test] fn run_managed_false() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -1079,7 +1079,7 @@ fn run_managed_false() -> Result<()> { #[test] fn run_exact() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -1148,7 +1148,7 @@ fn run_exact() -> Result<()> { #[test] fn run_with() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -1276,7 +1276,7 @@ fn run_with() -> Result<()> { /// search paths are available in these ephemeral environments. #[test] fn run_with_pyvenv_cfg_file() -> Result<()> { - let context = TestContext::new("3.12").with_pyvenv_cfg_filters(); + let context = uv_test::test_context!("3.12").with_pyvenv_cfg_filters(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -1328,7 +1328,7 @@ fn run_with_pyvenv_cfg_file() -> Result<()> { #[test] fn run_with_overlay_interpreter() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -1577,7 +1577,7 @@ fn run_with_overlay_interpreter() -> Result<()> { #[test] fn run_with_build_constraints() -> Result<()> { - let context = TestContext::new("3.9"); + let context = uv_test::test_context!("3.9"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -1652,7 +1652,7 @@ fn run_with_build_constraints() -> Result<()> { /// Sync all members in a workspace. #[test] fn run_in_workspace() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1814,7 +1814,7 @@ fn run_in_workspace() -> Result<()> { #[test] fn run_with_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let anyio_local = context.temp_dir.child("src").child("anyio_local"); copy_dir_all( @@ -1962,7 +1962,7 @@ fn run_with_editable() -> Result<()> { #[test] fn run_group() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2155,7 +2155,7 @@ fn run_group() -> Result<()> { #[test] fn run_locked() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2319,7 +2319,7 @@ fn run_locked() -> Result<()> { #[test] fn run_frozen() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2384,7 +2384,7 @@ fn run_frozen() -> Result<()> { #[test] fn run_no_sync() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2443,7 +2443,7 @@ fn run_no_sync() -> Result<()> { /// See: #[test] fn run_no_sync_env_var() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2499,7 +2499,7 @@ fn run_no_sync_env_var() -> Result<()> { #[test] fn run_empty_requirements_txt() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -2559,7 +2559,7 @@ fn run_empty_requirements_txt() -> Result<()> { #[test] fn run_requirements_txt() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -2709,7 +2709,7 @@ fn run_requirements_txt() -> Result<()> { /// Ignore and warn when (e.g.) the `--index-url` argument is a provided `requirements.txt`. #[test] fn run_requirements_txt_arguments() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -2763,7 +2763,7 @@ fn run_requirements_txt_arguments() -> Result<()> { /// Ensure that we can import from the root project when layering `--with` requirements. #[test] fn run_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -2816,7 +2816,7 @@ fn run_editable() -> Result<()> { #[test] fn run_from_directory() -> Result<()> { // Default to 3.11 so that the `.python-version` is meaningful. - let context = TestContext::new_with_versions(&["3.10", "3.11", "3.12"]) + let context = uv_test::test_context_with_versions!(&["3.10", "3.11", "3.12"]) .with_filtered_missing_file_error(); let project_dir = context.temp_dir.child("project"); @@ -2995,7 +2995,7 @@ fn run_from_directory() -> Result<()> { /// By default, omit resolver and installer output. #[test] fn run_without_output() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -3043,7 +3043,7 @@ fn run_without_output() -> Result<()> { /// Ensure that we can import from the root project when layering `--with` requirements. #[test] fn run_isolated_python_version() -> Result<()> { - let context = TestContext::new_with_versions(&["3.9", "3.12"]); + let context = uv_test::test_context_with_versions!(&["3.9", "3.12"]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -3137,7 +3137,7 @@ fn run_isolated_python_version() -> Result<()> { /// Ignore the existing project when executing with `--no-project`. #[test] fn run_no_project() -> Result<()> { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_python_names() .with_filtered_virtualenv_bin() .with_filtered_exe_suffix(); @@ -3227,7 +3227,7 @@ fn run_no_project() -> Result<()> { #[test] fn run_stdin() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let test_script = context.temp_dir.child("main.py"); test_script.write_str(indoc! { r#" @@ -3251,7 +3251,7 @@ fn run_stdin() -> Result<()> { #[test] fn run_package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let main_script = context.temp_dir.child("__main__.py"); main_script.write_str(indoc! { r#" @@ -3273,7 +3273,7 @@ fn run_package() -> Result<()> { #[test] fn run_zipapp() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a zipapp. let child = context.temp_dir.child("app"); @@ -3312,7 +3312,7 @@ fn run_zipapp() -> Result<()> { #[test] fn run_stdin_args() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.run().arg("python").arg("-c").arg("import sys; print(sys.argv)").arg("foo").arg("bar"), @" success: true @@ -3327,7 +3327,7 @@ fn run_stdin_args() { /// Run a module equivalent to `python -m foo`. #[test] fn run_module() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.run().arg("-m").arg("__hello__"), @" success: true @@ -3363,7 +3363,7 @@ fn run_module() { #[test] fn run_module_stdin() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.run().arg("-m").arg("-"), @" success: false @@ -3378,7 +3378,7 @@ fn run_module_stdin() { /// Test for how run reacts to a pyproject.toml without a `[project]` #[test] fn virtual_empty() -> Result<()> { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_python_names() .with_filtered_virtualenv_bin() .with_filtered_exe_suffix(); @@ -3421,7 +3421,7 @@ fn virtual_empty() -> Result<()> { #[test] fn run_isolated_incompatible_python() -> Result<()> { - let context = TestContext::new_with_versions(&["3.9", "3.11"]); + let context = uv_test::test_context_with_versions!(&["3.9", "3.11"]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -3477,7 +3477,7 @@ fn run_isolated_incompatible_python() -> Result<()> { #[test] fn run_isolated_does_not_modify_lock() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -3580,7 +3580,7 @@ fn run_isolated_does_not_modify_lock() -> Result<()> { #[test] fn run_isolated_with_frozen() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -3648,7 +3648,7 @@ fn run_isolated_with_frozen() -> Result<()> { #[test] fn run_compiled_python_file() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Write a non-PEP 723 script. let test_non_script = context.temp_dir.child("main.py"); @@ -3749,7 +3749,7 @@ fn run_compiled_python_file() -> Result<()> { #[test] fn run_exit_code() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let test_script = context.temp_dir.child("script.py"); test_script.write_str(indoc! { r#" @@ -3768,7 +3768,7 @@ fn run_exit_code() -> Result<()> { #[test] fn run_invalid_project_table() -> Result<()> { - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -3807,7 +3807,7 @@ fn run_invalid_project_table() -> Result<()> { #[test] #[cfg(target_family = "unix")] fn run_script_without_build_system() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -3848,7 +3848,7 @@ fn run_script_without_build_system() -> Result<()> { #[test] fn run_script_module_conflict() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -3934,7 +3934,7 @@ fn run_script_module_conflict() -> Result<()> { #[test] fn run_script_explicit() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let test_script = context.temp_dir.child("script"); test_script.write_str(indoc! { r#" @@ -3967,7 +3967,7 @@ fn run_script_explicit() -> Result<()> { #[test] fn run_script_explicit_stdin() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let test_script = context.temp_dir.child("script"); test_script.write_str(indoc! { r#" @@ -4000,7 +4000,7 @@ fn run_script_explicit_stdin() -> Result<()> { #[test] fn run_script_explicit_no_file() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context .run() .arg("--script") @@ -4013,7 +4013,7 @@ fn run_script_explicit_no_file() { #[cfg(target_family = "unix")] #[test] fn run_script_explicit_directory() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); fs_err::create_dir(context.temp_dir.child("script"))?; @@ -4032,7 +4032,7 @@ fn run_script_explicit_directory() -> Result<()> { #[test] #[cfg(windows)] fn run_gui_script_explicit_windows() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let test_script = context.temp_dir.child("script"); test_script.write_str(indoc! { r#" @@ -4066,7 +4066,7 @@ fn run_gui_script_explicit_windows() -> Result<()> { #[test] #[cfg(windows)] fn run_gui_script_explicit_stdin_windows() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let test_script = context.temp_dir.child("script"); test_script.write_str(indoc! { r#" @@ -4100,7 +4100,7 @@ fn run_gui_script_explicit_stdin_windows() -> Result<()> { #[test] #[cfg(not(windows))] fn run_gui_script_explicit_unix() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let test_script = context.temp_dir.child("script"); test_script.write_str(indoc! { r#" # /// script @@ -4131,7 +4131,7 @@ fn run_gui_script_explicit_unix() -> Result<()> { fn run_linked_environment_path() -> Result<()> { use anyhow::Ok; - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_virtualenv_bin() .with_filtered_python_names(); @@ -4210,7 +4210,7 @@ fn run_linked_environment_path() -> Result<()> { #[test] fn run_active_project_environment() -> Result<()> { - let context = TestContext::new_with_versions(&["3.11", "3.12"]) + let context = uv_test::test_context_with_versions!(&["3.11", "3.12"]) .with_filtered_virtualenv_bin() .with_filtered_python_names(); @@ -4317,7 +4317,7 @@ fn run_active_project_environment() -> Result<()> { #[test] fn run_active_script_environment() -> Result<()> { - let context = TestContext::new_with_versions(&["3.11", "3.12"]) + let context = uv_test::test_context_with_versions!(&["3.11", "3.12"]) .with_filtered_virtualenv_bin() .with_filtered_python_names(); @@ -4418,7 +4418,7 @@ fn run_active_script_environment() -> Result<()> { #[test] #[cfg(not(windows))] fn run_gui_script_explicit_stdin_unix() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let test_script = context.temp_dir.child("script"); test_script.write_str(indoc! { r#" @@ -4451,7 +4451,7 @@ fn run_gui_script_explicit_stdin_unix() -> Result<()> { #[test] fn run_remote_pep723_script() { - let context = TestContext::new("3.12").with_filtered_python_names(); + let context = uv_test::test_context!("3.12").with_filtered_python_names(); let mut filters = context.filters(); filters.push(( r"(?m)^Downloaded remote script to:.*\.py$", @@ -4477,7 +4477,7 @@ fn run_remote_pep723_script() { #[cfg(unix)] // A URL could be a valid filepath on Unix but not on Windows #[test] fn run_url_like_with_local_file_priority() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let url = "https://example.com/path/to/main.py"; let local_path: std::path::PathBuf = ["https:", "", "example.com", "path", "to", "main.py"] @@ -4505,7 +4505,7 @@ fn run_url_like_with_local_file_priority() -> Result<()> { #[test] fn run_stdin_with_pep723() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let test_script = context.temp_dir.child("main.py"); test_script.write_str(indoc! { r#" @@ -4538,7 +4538,7 @@ fn run_stdin_with_pep723() -> Result<()> { #[test] fn run_with_env() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context.temp_dir.child("test.py").write_str(indoc! { " import os @@ -4586,7 +4586,7 @@ fn run_with_env() -> Result<()> { #[test] fn run_with_env_file() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context.temp_dir.child("test.py").write_str(indoc! { " import os @@ -4622,7 +4622,7 @@ fn run_with_env_file() -> Result<()> { #[test] fn run_with_multiple_env_files() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context.temp_dir.child("test.py").write_str(indoc! { " import os @@ -4672,7 +4672,7 @@ fn run_with_multiple_env_files() -> Result<()> { #[test] fn run_with_env_omitted() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context.temp_dir.child("test.py").write_str(indoc! { " import os @@ -4699,7 +4699,7 @@ fn run_with_env_omitted() -> Result<()> { #[test] fn run_with_malformed_env() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context.temp_dir.child("test.py").write_str(indoc! { " import os @@ -4727,7 +4727,7 @@ fn run_with_malformed_env() -> Result<()> { #[test] fn run_with_not_existing_env_file() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context.temp_dir.child("test.py").write_str(indoc! { " import os @@ -4755,7 +4755,7 @@ fn run_with_not_existing_env_file() -> Result<()> { #[test] fn run_with_extra_conflict() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -4801,7 +4801,7 @@ fn run_with_extra_conflict() -> Result<()> { #[test] fn run_with_group_conflict() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -4847,7 +4847,7 @@ fn run_with_group_conflict() -> Result<()> { #[test] fn run_default_groups() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5079,8 +5079,8 @@ fn run_default_groups() -> Result<()> { #[test] fn run_groups_requires_python() -> Result<()> { - let context = - TestContext::new_with_versions(&["3.11", "3.12", "3.13"]).with_filtered_python_sources(); + let context = uv_test::test_context_with_versions!(&["3.11", "3.12", "3.13"]) + .with_filtered_python_sources(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5238,7 +5238,7 @@ fn run_groups_requires_python() -> Result<()> { #[test] fn run_groups_include_requires_python() -> Result<()> { - let context = TestContext::new_with_versions(&["3.11", "3.12", "3.13"]); + let context = uv_test::test_context_with_versions!(&["3.11", "3.12", "3.13"]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5338,7 +5338,7 @@ fn run_groups_include_requires_python() -> Result<()> { #[cfg(unix)] #[test] fn exit_status_signal() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let script = context.temp_dir.child("segfault.py"); script.write_str(indoc! {r" @@ -5352,7 +5352,7 @@ fn exit_status_signal() -> Result<()> { #[test] fn run_repeated() -> Result<()> { - let context = TestContext::new_with_versions(&["3.13", "3.12"]); + let context = uv_test::test_context_with_versions!(&["3.13", "3.12"]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -5422,7 +5422,7 @@ fn run_repeated() -> Result<()> { /// See: #[test] fn run_without_overlay() -> Result<()> { - let context = TestContext::new_with_versions(&["3.13"]); + let context = uv_test::test_context_with_versions!(&["3.13"]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -5493,18 +5493,18 @@ fn run_without_overlay() -> Result<()> { #[cfg(unix)] #[test] fn detect_infinite_recursion() -> Result<()> { - use crate::common::get_bin; use indoc::formatdoc; use std::os::unix::fs::PermissionsExt; + use uv_test::get_bin; - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let test_script = context.temp_dir.child("main"); test_script.write_str(&formatdoc! { r#" #!{uv} run print("Hello, world!") - "#, uv = get_bin().display() })?; + "#, uv = get_bin!().display() })?; fs_err::set_permissions(test_script.path(), PermissionsExt::from_mode(0o0744))?; @@ -5530,7 +5530,7 @@ fn detect_infinite_recursion() -> Result<()> { #[test] fn run_uv_variable() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Display the `UV` variable uv_snapshot!( @@ -5551,7 +5551,7 @@ fn run_uv_variable() { #[cfg(windows)] #[test] fn run_windows_legacy_scripts() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -5782,7 +5782,7 @@ fn run_windows_legacy_scripts() -> Result<()> { /// See: #[test] fn run_pep723_script_with_constraints_lock() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let test_script = context.temp_dir.child("main.py"); test_script.write_str(indoc! { r#" @@ -5877,7 +5877,7 @@ fn run_pep723_script_with_constraints_lock() -> Result<()> { /// See: #[test] fn run_pep723_script_with_constraints() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let test_script = context.temp_dir.child("main.py"); test_script.write_str(indoc! { r#" @@ -5929,7 +5929,7 @@ fn run_pep723_script_with_constraints() -> Result<()> { #[test] fn run_no_sync_incompatible_python() -> Result<()> { - let context = TestContext::new_with_versions(&["3.12", "3.11", "3.9"]); + let context = uv_test::test_context_with_versions!(&["3.12", "3.11", "3.9"]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -5981,7 +5981,7 @@ fn run_no_sync_incompatible_python() -> Result<()> { #[test] fn run_python_preference_no_project() { let context = - TestContext::new_with_versions(&["3.12", "3.11"]).with_versions_as_managed(&["3.12"]); + uv_test::test_context_with_versions!(&["3.12", "3.11"]).with_versions_as_managed(&["3.12"]); context.venv().assert().success(); @@ -6027,7 +6027,7 @@ fn run_python_preference_no_project() { /// Regression test for: #[test] fn isolate_child_environment() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r#" @@ -6107,7 +6107,7 @@ fn isolate_child_environment() -> Result<()> { #[test] fn run_only_group_and_extra_conflict() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -6161,7 +6161,7 @@ fn run_only_group_and_extra_conflict() -> Result<()> { /// from the target's directory rather than the current working directory. #[test] fn run_target_workspace_discovery() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a workspace in a subdirectory. let workspace = context.temp_dir.child("project"); diff --git a/crates/uv/tests/it/self_update.rs b/crates/uv/tests/it/self_update.rs index 169c7e48e..9b247e3a2 100644 --- a/crates/uv/tests/it/self_update.rs +++ b/crates/uv/tests/it/self_update.rs @@ -7,7 +7,7 @@ use axoupdater::{ use uv_static::EnvVars; -use crate::common::{TestContext, get_bin, uv_snapshot}; +use uv_test::{get_bin, uv_snapshot}; #[test] fn check_self_update() { @@ -26,7 +26,7 @@ fn check_self_update() { app_name: "uv".to_owned(), package: "uv".to_owned(), owner: "astral-sh".to_owned(), - bin: get_bin(), + bin: get_bin!(), binaries: vec!["uv".to_owned()], args: vec!["self".to_owned(), "update".to_owned()], release_type: ReleaseSourceType::GitHub, @@ -45,7 +45,7 @@ fn check_self_update() { #[test] fn test_self_update_offline_error() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.self_update().arg("--offline"), @r" diff --git a/crates/uv/tests/it/show_settings.rs b/crates/uv/tests/it/show_settings.rs index f7367c0b3..c0fd80d6f 100644 --- a/crates/uv/tests/it/show_settings.rs +++ b/crates/uv/tests/it/show_settings.rs @@ -3,7 +3,7 @@ use std::process::Command; use assert_fs::prelude::*; use uv_static::EnvVars; -use crate::common::{TestContext, uv_snapshot}; +use uv_test::uv_snapshot; /// Add shared arguments to a command. /// @@ -32,7 +32,7 @@ fn add_shared_args(mut command: Command) -> Command { ignore = "Configuration tests are not yet supported on Windows" )] fn resolve_uv_toml() -> anyhow::Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Write a `uv.toml` file to the directory. let config = context.temp_dir.child("uv.toml"); @@ -676,7 +676,7 @@ fn resolve_uv_toml() -> anyhow::Result<()> { ignore = "Configuration tests are not yet supported on Windows" )] fn resolve_pyproject_toml() -> anyhow::Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Write a `uv.toml` file to the directory. let config = context.temp_dir.child("uv.toml"); @@ -1307,7 +1307,7 @@ fn resolve_pyproject_toml() -> anyhow::Result<()> { ignore = "Configuration tests are not yet supported on Windows" )] fn resolve_index_url() -> anyhow::Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Write a `pyproject.toml` file to the directory. let pyproject = context.temp_dir.child("pyproject.toml"); @@ -1847,7 +1847,7 @@ fn resolve_index_url() -> anyhow::Result<()> { ignore = "Configuration tests are not yet supported on Windows" )] fn resolve_find_links() -> anyhow::Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Write a `pyproject.toml` file to the directory. let pyproject = context.temp_dir.child("pyproject.toml"); @@ -2078,7 +2078,7 @@ fn resolve_find_links() -> anyhow::Result<()> { ignore = "Configuration tests are not yet supported on Windows" )] fn resolve_top_level() -> anyhow::Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Write out to the top-level (`tool.uv`, rather than `tool.uv.pip`). let pyproject = context.temp_dir.child("pyproject.toml"); @@ -2777,7 +2777,7 @@ fn resolve_user_configuration() -> anyhow::Result<()> { resolution = "lowest-direct" "#})?; - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio>3.0.0")?; @@ -3512,7 +3512,7 @@ fn resolve_tool() -> anyhow::Result<()> { resolution = "lowest-direct" "#})?; - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Add a local configuration to disable build isolation. let config = context.temp_dir.child("uv.toml"); @@ -3693,7 +3693,7 @@ fn resolve_tool() -> anyhow::Result<()> { ignore = "Configuration tests are not yet supported on Windows" )] fn resolve_poetry_toml() -> anyhow::Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Write a `uv.toml` file to the directory. let config = context.temp_dir.child("pyproject.toml"); @@ -3900,7 +3900,7 @@ fn resolve_poetry_toml() -> anyhow::Result<()> { ignore = "Configuration tests are not yet supported on Windows" )] fn resolve_both() -> anyhow::Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Write a `uv.toml` file to the directory. let config = context.temp_dir.child("uv.toml"); @@ -4151,7 +4151,7 @@ fn resolve_both() -> anyhow::Result<()> { ignore = "Configuration tests are not yet supported on Windows" )] fn resolve_both_special_fields() -> anyhow::Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Write a `uv.toml` file to the directory. let config = context.temp_dir.child("uv.toml"); @@ -4394,7 +4394,7 @@ fn resolve_both_special_fields() -> anyhow::Result<()> { /// Tests that errors when parsing `conflicts` are reported. #[test] fn invalid_conflicts() -> anyhow::Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject = context.temp_dir.child("pyproject.toml"); // Write in `pyproject.toml` schema and test the singleton case. @@ -4459,7 +4459,7 @@ fn invalid_conflicts() -> anyhow::Result<()> { /// Tests that valid `conflicts` are parsed okay. #[test] fn valid_conflicts() -> anyhow::Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let xdg = assert_fs::TempDir::new().expect("Failed to create temp dir"); let pyproject = context.temp_dir.child("pyproject.toml"); @@ -4496,7 +4496,7 @@ fn valid_conflicts() -> anyhow::Result<()> { ignore = "Configuration tests are not yet supported on Windows" )] fn resolve_config_file() -> anyhow::Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Write a `uv.toml` to a temporary location. (Use the cache directory for convenience, since // it's already obfuscated in the fixtures.) @@ -4795,7 +4795,7 @@ fn resolve_config_file() -> anyhow::Result<()> { ignore = "Configuration tests are not yet supported on Windows" )] fn resolve_skip_empty() -> anyhow::Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Set `lowest-direct` in a `uv.toml`. let config = context.temp_dir.child("uv.toml"); @@ -5182,7 +5182,7 @@ fn resolve_skip_empty() -> anyhow::Result<()> { ignore = "Configuration tests are not yet supported on Windows" )] fn allow_insecure_host() -> anyhow::Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let config = context.temp_dir.child("uv.toml"); config.write_str(indoc::indoc! {r#" @@ -5383,7 +5383,7 @@ fn allow_insecure_host() -> anyhow::Result<()> { ignore = "Configuration tests are not yet supported on Windows" )] fn index_priority() -> anyhow::Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let config = context.temp_dir.child("uv.toml"); config.write_str(indoc::indoc! {r#" @@ -6866,7 +6866,7 @@ fn index_priority() -> anyhow::Result<()> { ignore = "Configuration tests are not yet supported on Windows" )] fn verify_hashes() -> anyhow::Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio>3.0.0")?; @@ -7907,7 +7907,7 @@ fn verify_hashes() -> anyhow::Result<()> { ignore = "Configuration tests are not yet supported on Windows" )] fn preview_features() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let cmd = || { let mut cmd = context.version(); @@ -8692,7 +8692,7 @@ fn preview_features() { ignore = "Configuration tests are not yet supported on Windows" )] fn upgrade_pip_cli_config_interaction() -> anyhow::Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements_in = context.temp_dir.child("requirements.in"); requirements_in.write_str("anyio>3.0.0")?; @@ -9832,7 +9832,7 @@ fn upgrade_pip_cli_config_interaction() -> anyhow::Result<()> { ignore = "Configuration tests are not yet supported on Windows" )] fn upgrade_project_cli_config_interaction() -> anyhow::Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc::indoc! {r#" @@ -10623,7 +10623,7 @@ fn upgrade_project_cli_config_interaction() -> anyhow::Result<()> { ignore = "Configuration tests are not yet supported on Windows" )] fn build_isolation_override() -> anyhow::Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Write a `uv.toml` file to disable build isolation. let uv_toml = context.temp_dir.child("uv.toml"); diff --git a/crates/uv/tests/it/sync.rs b/crates/uv/tests/it/sync.rs index d173cc204..d17c7faa8 100644 --- a/crates/uv/tests/it/sync.rs +++ b/crates/uv/tests/it/sync.rs @@ -9,11 +9,11 @@ use tempfile::tempdir_in; use uv_fs::Simplified; use uv_static::EnvVars; -use crate::common::{TestContext, download_to_disk, packse_index_url, uv_snapshot, venv_bin_path}; +use uv_test::{TestContext, download_to_disk, packse_index_url, uv_snapshot, venv_bin_path}; #[test] fn sync() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -46,7 +46,7 @@ fn sync() -> Result<()> { #[test] fn locked() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -106,7 +106,7 @@ fn locked() -> Result<()> { #[test] fn frozen() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -161,7 +161,7 @@ fn frozen() -> Result<()> { #[test] fn empty() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -203,7 +203,7 @@ fn empty() -> Result<()> { /// Sync an individual package within a workspace. #[test] fn package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -271,7 +271,7 @@ fn package() -> Result<()> { /// Sync multiple packages within a workspace. #[test] fn multiple_packages() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -380,7 +380,7 @@ fn multiple_packages() -> Result<()> { /// Test json output #[test] fn sync_json() -> Result<()> { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_python_names() .with_filtered_virtualenv_bin(); @@ -597,7 +597,7 @@ fn sync_json() -> Result<()> { /// Test --dry json output #[test] fn sync_dry_json() -> Result<()> { - let context = TestContext::new_with_versions(&["3.12"]) + let context = uv_test::test_context_with_versions!(&["3.12"]) .with_filtered_python_names() .with_filtered_virtualenv_bin(); @@ -669,7 +669,7 @@ fn sync_dry_json() -> Result<()> { /// Ensure that we use the maximum Python version when a workspace contains mixed requirements. #[test] fn mixed_requires_python() -> Result<()> { - let context = TestContext::new_with_versions(&["3.9", "3.12"]); + let context = uv_test::test_context_with_versions!(&["3.9", "3.12"]); // Create a workspace root with a minimum Python requirement of Python 3.12. let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -756,7 +756,7 @@ fn mixed_requires_python() -> Result<()> { #[cfg(not(windows))] #[cfg(feature = "test-python-eol")] fn group_requires_python_useful_defaults() -> Result<()> { - let context = TestContext::new_with_versions(&["3.8", "3.9"]); + let context = uv_test::test_context_with_versions!(&["3.8", "3.9"]); // Require 3.8 for our project, but have a dev-dependency on a version of sphinx that needs 3.9 let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -901,7 +901,7 @@ fn group_requires_python_useful_defaults() -> Result<()> { #[cfg(not(windows))] #[cfg(feature = "test-python-eol")] fn group_requires_python_useful_non_defaults() -> Result<()> { - let context = TestContext::new_with_versions(&["3.8", "3.9"]); + let context = uv_test::test_context_with_versions!(&["3.8", "3.9"]); // Require 3.8 for our project, but have a dev-dependency on a version of sphinx that needs 3.9 let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -1044,7 +1044,7 @@ fn group_requires_python_useful_non_defaults() -> Result<()> { #[test] fn check() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1107,7 +1107,7 @@ fn check() -> Result<()> { /// Sync development dependencies in a (legacy) non-project workspace root. #[test] fn sync_legacy_non_project_dev_dependencies() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1188,7 +1188,7 @@ fn sync_legacy_non_project_dev_dependencies() -> Result<()> { /// Sync development dependencies in a (legacy) non-project workspace root with `--frozen`. #[test] fn sync_legacy_non_project_frozen() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1256,7 +1256,7 @@ fn sync_legacy_non_project_frozen() -> Result<()> { /// Sync development dependencies in a (legacy) non-project workspace root. #[test] fn sync_legacy_non_project_group() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1376,7 +1376,7 @@ fn sync_legacy_non_project_group() -> Result<()> { /// Modify the `pyproject.toml` after locking. #[test] fn sync_legacy_non_project_frozen_modification() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1431,7 +1431,7 @@ fn sync_legacy_non_project_frozen_modification() -> Result<()> { /// Use a `pip install` step to pre-install build dependencies for `--no-build-isolation`. #[test] fn sync_build_isolation() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1500,7 +1500,7 @@ fn sync_build_isolation() -> Result<()> { /// Use a `pip install` step to pre-install build dependencies for `--no-build-isolation-package`. #[test] fn sync_build_isolation_package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1588,7 +1588,7 @@ fn sync_build_isolation_package() -> Result<()> { /// By default, isolated dependencies should be installed before non-isolated dependencies. #[test] fn sync_build_isolation_package_order() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1750,7 +1750,7 @@ fn sync_build_isolation_package_order() -> Result<()> { /// Use dedicated extra groups to install dependencies for `--no-build-isolation-package`. #[test] fn sync_build_isolation_extra() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1873,7 +1873,7 @@ fn sync_build_isolation_extra() -> Result<()> { #[test] fn sync_extra_build_dependencies() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); // Write a test package that arbitrarily requires `anyio` at build time let child = context.temp_dir.child("child"); @@ -2115,7 +2115,7 @@ fn sync_extra_build_dependencies() -> Result<()> { #[test] fn sync_extra_build_dependencies_setuptools_legacy() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); // Write a test package that uses legacy setuptools (no pyproject.toml) and requires `anyio` at build time let child = context.temp_dir.child("child"); @@ -2206,7 +2206,7 @@ fn sync_extra_build_dependencies_setuptools_legacy() -> Result<()> { #[test] fn sync_extra_build_dependencies_setuptools() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); // Write a test package that uses setuptools with pyproject.toml and requires `anyio` at build time let child = context.temp_dir.child("child"); @@ -2312,7 +2312,7 @@ fn sync_extra_build_dependencies_setuptools() -> Result<()> { #[test] fn sync_extra_build_dependencies_sources() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let anyio_local = context.workspace_root.join("test/packages/anyio_local"); @@ -2389,7 +2389,7 @@ fn sync_extra_build_dependencies_sources() -> Result<()> { #[test] fn sync_extra_build_dependencies_index() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); // Write a test package that arbitrarily requires `anyio` at build time let child = context.temp_dir.child("child"); @@ -2541,7 +2541,7 @@ fn sync_extra_build_dependencies_index() -> Result<()> { #[test] fn sync_extra_build_dependencies_sources_from_child() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let anyio_local = context.workspace_root.join("test/packages/anyio_local"); @@ -2623,7 +2623,7 @@ fn sync_extra_build_dependencies_sources_from_child() -> Result<()> { #[test] fn sync_build_dependencies_module_error_hints() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); // Write a test package that arbitrarily requires `anyio` at build time let child = context.temp_dir.child("child"); @@ -2798,7 +2798,7 @@ fn sync_build_dependencies_module_error_hints() -> Result<()> { /// project dependencies. #[test] fn sync_reset_state() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2857,7 +2857,7 @@ fn sync_reset_state() -> Result<()> { /// Test that relative wheel paths are correctly preserved. #[test] fn sync_relative_wheel() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let requirements = r#"[project] name = "relative_wheel" @@ -2958,7 +2958,7 @@ fn sync_relative_wheel() -> Result<()> { /// Syncing against an unstable environment should fail (but locking should succeed). #[test] fn sync_environment() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2991,7 +2991,7 @@ fn sync_environment() -> Result<()> { #[test] fn sync_dev() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3075,7 +3075,7 @@ fn sync_dev() -> Result<()> { #[test] fn sync_group() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3311,7 +3311,7 @@ fn sync_group() -> Result<()> { #[test] fn sync_include_group() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3450,7 +3450,7 @@ fn sync_include_group() -> Result<()> { #[test] fn sync_exclude_group() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3528,7 +3528,7 @@ fn sync_exclude_group() -> Result<()> { #[test] fn sync_exclude_group_with_environment_variable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3606,7 +3606,7 @@ fn sync_exclude_group_with_environment_variable() -> Result<()> { #[test] fn sync_dev_group() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3649,7 +3649,7 @@ fn sync_dev_group() -> Result<()> { #[test] fn sync_non_existent_group() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3758,7 +3758,7 @@ fn sync_non_existent_group() -> Result<()> { fn sync_corner_groups() -> Result<()> { // Testing a bunch of random corner cases of flags so their behaviour is tracked. // It's fine if we decide we want to support these later! - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -3973,7 +3973,7 @@ fn sync_corner_groups() -> Result<()> { #[test] fn sync_non_existent_default_group() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -4008,7 +4008,7 @@ fn sync_non_existent_default_group() -> Result<()> { #[test] fn sync_default_groups() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -4261,7 +4261,7 @@ fn sync_default_groups() -> Result<()> { /// default-groups = "all" sugar works #[test] fn sync_default_groups_all() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -4390,7 +4390,7 @@ fn sync_default_groups_all() -> Result<()> { /// default-groups = "gibberish" error #[test] fn sync_default_groups_gibberish() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -4430,7 +4430,7 @@ fn sync_default_groups_gibberish() -> Result<()> { #[test] fn sync_disable_default_groups_with_environment_variable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -4531,7 +4531,7 @@ fn sync_disable_default_groups_with_environment_variable() -> Result<()> { #[test] fn sync_disable_default_groups_all_with_environment_variable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -4599,7 +4599,7 @@ fn sync_disable_default_groups_all_with_environment_variable() -> Result<()> { /// Sync with `--only-group`, where the group includes a workspace member. #[test] fn sync_group_member() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a workspace. let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -4664,7 +4664,7 @@ fn sync_group_member() -> Result<()> { /// Sync with `--only-group`, where the group includes a legacy non-`[project]` workspace member. #[test] fn sync_group_legacy_non_project_member() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a workspace. let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -4787,7 +4787,7 @@ fn sync_group_legacy_non_project_member() -> Result<()> { /// Sync with `--only-group`, where the group includes the project itself. #[test] fn sync_group_self() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -4934,7 +4934,7 @@ fn sync_group_self() -> Result<()> { #[test] fn sync_non_existent_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -4978,7 +4978,7 @@ fn sync_non_existent_extra() -> Result<()> { #[test] fn sync_non_existent_extra_no_optional_dependencies() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5021,7 +5021,7 @@ fn sync_non_existent_extra_no_optional_dependencies() -> Result<()> { /// version of uv that predates when `provides-extras` feature was added. #[test] fn sync_ignore_extras_check_when_no_provides_extras() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5079,7 +5079,7 @@ fn sync_ignore_extras_check_when_no_provides_extras() -> Result<()> { #[test] fn sync_workspace_members_with_transitive_dependencies() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5174,7 +5174,7 @@ fn sync_workspace_members_with_transitive_dependencies() -> Result<()> { #[test] fn sync_non_existent_extra_workspace_member() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5246,7 +5246,7 @@ fn sync_non_existent_extra_workspace_member() -> Result<()> { #[test] fn sync_non_existent_extra_non_project_workspace() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5336,7 +5336,7 @@ fn sync_non_existent_extra_non_project_workspace() -> Result<()> { /// sorting, changing the lockfile. #[test] fn read_metadata_statically_over_the_cache() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5370,7 +5370,7 @@ fn read_metadata_statically_over_the_cache() -> Result<()> { /// Avoid syncing the project package when `--no-install-project` is provided. #[test] fn no_install_project() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5424,7 +5424,7 @@ fn no_install_project() -> Result<()> { /// include all dependencies. #[test] fn no_install_workspace() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5563,7 +5563,7 @@ fn no_install_workspace() -> Result<()> { /// Avoid syncing local packages when `--no-install-local` is provided. #[test] fn no_install_local() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5647,7 +5647,7 @@ fn no_install_local() -> Result<()> { /// Avoid syncing the target package when `--no-install-package` is provided. #[test] fn no_install_package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5704,7 +5704,7 @@ fn no_install_package() -> Result<()> { /// Ensure that `--no-build` isn't enforced for projects that aren't installed in the first place. #[test] fn no_install_project_no_build() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5756,7 +5756,7 @@ fn no_install_project_no_build() -> Result<()> { #[test] fn sync_extra_build_dependencies_script() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); // Write a test package that arbitrarily requires `anyio` at build time let child = context.temp_dir.child("child"); @@ -5858,7 +5858,7 @@ fn sync_extra_build_dependencies_script() -> Result<()> { #[test] fn sync_extra_build_dependencies_script_sources() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let anyio_local = context.workspace_root.join("test/packages/anyio_local"); // Write a test package that arbitrarily requires `anyio` at a specific _path_ at build time @@ -5937,7 +5937,7 @@ fn sync_extra_build_dependencies_script_sources() -> Result<()> { #[test] fn virtual_no_build() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -5977,7 +5977,7 @@ fn virtual_no_build() -> Result<()> { #[test] fn virtual_empty() -> Result<()> { // testing how `uv sync` reacts to a pyproject with no `[project]` and nothing useful to it - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -6003,7 +6003,7 @@ fn virtual_empty() -> Result<()> { fn virtual_dependency_group() -> Result<()> { // testing basic `uv sync --group` functionality // when the pyproject.toml is fully virtual (no `[project]`) - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -6065,7 +6065,7 @@ fn virtual_dependency_group() -> Result<()> { #[test] fn virtual_no_build_dynamic_cached() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -6110,7 +6110,7 @@ fn virtual_no_build_dynamic_cached() -> Result<()> { #[test] fn virtual_no_build_dynamic_no_cache() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -6154,7 +6154,7 @@ fn virtual_no_build_dynamic_no_cache() -> Result<()> { /// Convert from a package to a virtual project. #[test] fn convert_to_virtual() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -6288,7 +6288,7 @@ fn convert_to_virtual() -> Result<()> { /// Convert from a virtual project to a package. #[test] fn convert_to_package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -6421,7 +6421,7 @@ fn convert_to_package() -> Result<()> { #[test] fn sync_custom_environment_path() -> Result<()> { - let mut context = TestContext::new_with_versions(&["3.11", "3.12"]) + let mut context = uv_test::test_context_with_versions!(&["3.11", "3.12"]) .with_filtered_virtualenv_bin() .with_filtered_python_names(); @@ -6595,7 +6595,7 @@ fn sync_custom_environment_path() -> Result<()> { #[test] fn sync_active_project_environment() -> Result<()> { - let context = TestContext::new_with_versions(&["3.11", "3.12"]) + let context = uv_test::test_context_with_versions!(&["3.11", "3.12"]) .with_filtered_virtualenv_bin() .with_filtered_python_names(); @@ -6720,7 +6720,7 @@ fn sync_active_project_environment() -> Result<()> { #[test] fn sync_active_script_environment() -> Result<()> { - let context = TestContext::new_with_versions(&["3.11", "3.12"]) + let context = uv_test::test_context_with_versions!(&["3.11", "3.12"]) .with_filtered_virtualenv_bin() .with_filtered_python_names(); @@ -6817,7 +6817,7 @@ fn sync_active_script_environment() -> Result<()> { #[test] fn sync_active_script_environment_json() -> Result<()> { - let context = TestContext::new_with_versions(&["3.11", "3.12"]) + let context = uv_test::test_context_with_versions!(&["3.11", "3.12"]) .with_filtered_virtualenv_bin() .with_filtered_exe_suffix(); @@ -7035,7 +7035,7 @@ fn sync_active_script_environment_json() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn sync_workspace_custom_environment_path() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -7167,7 +7167,7 @@ fn sync_workspace_custom_environment_path() -> Result<()> { #[test] fn sync_empty_virtual_environment() -> Result<()> { - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); // Create an empty directory context.temp_dir.child(".venv").create_dir_all()?; @@ -7204,7 +7204,7 @@ fn sync_empty_virtual_environment() -> Result<()> { /// Test for warnings when `VIRTUAL_ENV` is set but will not be respected. #[test] fn sync_legacy_non_project_warning() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -7345,7 +7345,7 @@ fn sync_legacy_non_project_warning() -> Result<()> { #[test] fn sync_update_project() -> Result<()> { - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -7404,7 +7404,7 @@ fn sync_update_project() -> Result<()> { #[test] fn sync_environment_prompt() -> Result<()> { - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -7442,7 +7442,7 @@ fn sync_environment_prompt() -> Result<()> { #[test] fn no_binary() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -7526,7 +7526,7 @@ fn no_binary() -> Result<()> { #[test] fn no_binary_error() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -7558,7 +7558,7 @@ fn no_binary_error() -> Result<()> { #[test] fn no_build() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -7605,7 +7605,7 @@ fn no_build() -> Result<()> { #[test] fn no_build_error() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -7678,7 +7678,7 @@ fn no_build_error() -> Result<()> { #[test] fn sync_wheel_url_source_error() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -7719,7 +7719,7 @@ fn sync_wheel_url_source_error() -> Result<()> { #[test] fn sync_wheel_path_source_error() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Download a wheel. let archive = context @@ -7770,7 +7770,7 @@ fn sync_wheel_path_source_error() -> Result<()> { #[test] fn sync_override_package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a dependency. let pyproject_toml = context.temp_dir.child("core").child("pyproject.toml"); @@ -8025,7 +8025,7 @@ fn sync_override_package() -> Result<()> { /// Avoid installing dev dependencies of transitive dependencies. #[test] fn transitive_dev() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -8101,7 +8101,7 @@ fn transitive_dev() -> Result<()> { /// Avoid installing dev dependencies of transitive dependencies. #[test] fn sync_no_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -8195,7 +8195,7 @@ fn sync_no_editable() -> Result<()> { /// Check warning message for /// if no `build-system` section is defined. fn sync_scripts_without_build_system() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -8237,7 +8237,7 @@ fn sync_scripts_without_build_system() -> Result<()> { /// Check warning message for /// if the project is marked as `package = false`. fn sync_scripts_project_not_packaged() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -8284,7 +8284,7 @@ fn sync_scripts_project_not_packaged() -> Result<()> { #[test] fn sync_dynamic_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -8399,7 +8399,7 @@ fn sync_dynamic_extra() -> Result<()> { #[test] fn build_system_requires_workspace() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let build = context.temp_dir.child("backend"); build.child("pyproject.toml").write_str( @@ -8482,7 +8482,7 @@ fn build_system_requires_workspace() -> Result<()> { #[test] fn build_system_requires_path() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let build = context.temp_dir.child("backend"); build.child("pyproject.toml").write_str( @@ -8562,7 +8562,7 @@ fn build_system_requires_path() -> Result<()> { #[test] fn sync_invalid_environment() -> Result<()> { - let context = TestContext::new_with_versions(&["3.11", "3.12"]) + let context = uv_test::test_context_with_versions!(&["3.11", "3.12"]) .with_filtered_virtualenv_bin() .with_filtered_python_names(); @@ -8722,7 +8722,7 @@ fn sync_invalid_environment() -> Result<()> { fn sync_partial_environment_delete() -> Result<()> { use std::os::unix::fs::PermissionsExt; - let context = TestContext::new_with_versions(&["3.13", "3.12"]); + let context = uv_test::test_context_with_versions!(&["3.13", "3.12"]); context.init().arg("-p").arg("3.12").assert().success(); uv_snapshot!(context.filters(), context.sync().arg("-p").arg("3.13"), @" @@ -8789,7 +8789,7 @@ fn sync_partial_environment_delete() -> Result<()> { /// `./anyio` is missing, install `anyio` from the registry. #[test] fn sync_no_sources_missing_member() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -8835,7 +8835,7 @@ fn sync_no_sources_missing_member() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn sync_no_sources_package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -8883,7 +8883,7 @@ fn sync_no_sources_package() -> Result<()> { #[test] fn sync_python_version() -> Result<()> { - let context: TestContext = TestContext::new_with_versions(&["3.10", "3.11", "3.12"]); + let context: TestContext = uv_test::test_context_with_versions!(&["3.10", "3.11", "3.12"]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc::indoc! {r#" @@ -9007,7 +9007,7 @@ fn sync_python_version() -> Result<()> { /// `requires-python` is ignored, falling back to the project's requirement. #[test] fn sync_ignores_incompatible_global_python_version() -> Result<()> { - let context = TestContext::new_with_versions(&["3.10", "3.11"]); + let context = uv_test::test_context_with_versions!(&["3.10", "3.11"]); // Create a global pin before creating the project (to avoid pin compatibility check) uv_snapshot!(context.filters(), context.python_pin().arg("--global").arg("3.10"), @r" @@ -9051,7 +9051,7 @@ fn sync_ignores_incompatible_global_python_version() -> Result<()> { #[test] fn sync_explicit() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -9109,7 +9109,7 @@ fn sync_explicit() -> Result<()> { /// Sync all members in a workspace. #[test] fn sync_all() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -9186,7 +9186,7 @@ fn sync_all() -> Result<()> { /// Sync all members in a workspace with extras attached. #[test] fn sync_all_extras() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -9330,7 +9330,7 @@ fn sync_all_extras() -> Result<()> { #[test] fn sync_extra_comma_separated() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -9370,7 +9370,7 @@ fn sync_extra_comma_separated() -> Result<()> { /// Sync all members in a workspace with dynamic extras. #[test] fn sync_all_extras_dynamic() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -9484,7 +9484,7 @@ fn sync_all_extras_dynamic() -> Result<()> { /// Sync all members in a workspace with dependency groups attached. #[test] fn sync_all_groups() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -9602,7 +9602,7 @@ fn sync_all_groups() -> Result<()> { #[test] fn sync_multiple_sources_index_disjoint_extras() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-30T00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-30T00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -9665,7 +9665,7 @@ fn sync_multiple_sources_index_disjoint_extras() -> Result<()> { #[test] fn sync_derivation_chain() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -9727,7 +9727,7 @@ fn sync_derivation_chain() -> Result<()> { #[test] fn sync_derivation_chain_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -9790,7 +9790,7 @@ fn sync_derivation_chain_extra() -> Result<()> { #[test] fn sync_derivation_chain_group() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -9857,7 +9857,7 @@ fn sync_derivation_chain_group() -> Result<()> { #[test] #[cfg(all(feature = "test-slow", feature = "test-git"))] fn sync_stale_egg_info() -> Result<()> { - let context = TestContext::new("3.13"); + let context = uv_test::test_context!("3.13"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -9963,7 +9963,7 @@ fn sync_stale_egg_info() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn sync_git_repeated_member_static_metadata() -> Result<()> { - let context = TestContext::new("3.13"); + let context = uv_test::test_context!("3.13"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -10057,7 +10057,7 @@ fn sync_git_repeated_member_static_metadata() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn sync_git_repeated_member_dynamic_metadata() -> Result<()> { - let context = TestContext::new("3.13"); + let context = uv_test::test_context!("3.13"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -10175,7 +10175,7 @@ fn sync_git_repeated_member_dynamic_metadata() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn sync_git_repeated_member_backwards_path() -> Result<()> { - let context = TestContext::new("3.13"); + let context = uv_test::test_context!("3.13"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -10269,7 +10269,7 @@ fn sync_git_repeated_member_backwards_path() -> Result<()> { /// is a package. #[test] fn mismatched_name_self_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -10303,7 +10303,7 @@ fn mismatched_name_self_editable() -> Result<()> { /// A wheel is available in the cache, but was requested under the wrong name. #[test] fn mismatched_name_cached_wheel() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Cache the `iniconfig` wheel. let pyproject_toml = context.temp_dir.child("pyproject.toml"); @@ -10358,7 +10358,7 @@ fn mismatched_name_cached_wheel() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn sync_git_path_dependency() -> Result<()> { - let context = TestContext::new("3.13"); + let context = uv_test::test_context!("3.13"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -10447,7 +10447,7 @@ fn sync_git_path_dependency() -> Result<()> { /// should choose the wheel with the highest build tag. #[test] fn sync_build_tag() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Populate the `--find-links` entries. fs_err::create_dir_all(context.temp_dir.join("links"))?; @@ -10568,7 +10568,7 @@ fn sync_build_tag() -> Result<()> { #[test] fn url_hash_mismatch() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -10634,7 +10634,7 @@ fn url_hash_mismatch() -> Result<()> { #[test] fn path_hash_mismatch() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Download the source. let archive = context.temp_dir.child("iniconfig-2.0.0.tar.gz"); @@ -10707,7 +10707,7 @@ fn path_hash_mismatch() -> Result<()> { #[test] fn find_links_relative_in_config_works_from_subdir() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -10753,7 +10753,7 @@ fn find_links_relative_in_config_works_from_subdir() -> Result<()> { #[test] fn sync_dry_run() -> Result<()> { - let context = TestContext::new_with_versions(&["3.9", "3.12"]); + let context = uv_test::test_context_with_versions!(&["3.9", "3.12"]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -10894,7 +10894,7 @@ fn sync_dry_run() -> Result<()> { #[test] fn sync_dry_run_and_locked() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -10948,7 +10948,7 @@ fn sync_dry_run_and_locked() -> Result<()> { #[test] fn sync_dry_run_and_frozen() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -10995,7 +10995,7 @@ fn sync_dry_run_and_frozen() -> Result<()> { #[test] fn sync_script() -> Result<()> { - let context = TestContext::new_with_versions(&["3.9", "3.12"]); + let context = uv_test::test_context_with_versions!(&["3.9", "3.12"]); let script = context.temp_dir.child("script.py"); script.write_str(indoc! { r#" @@ -11136,7 +11136,7 @@ fn sync_script() -> Result<()> { #[test] fn sync_locked_script() -> Result<()> { - let context = TestContext::new_with_versions(&["3.9", "3.12"]); + let context = uv_test::test_context_with_versions!(&["3.9", "3.12"]); let script = context.temp_dir.child("script.py"); script.write_str(indoc! { r#" @@ -11380,7 +11380,7 @@ fn sync_locked_script() -> Result<()> { #[test] fn sync_script_with_compatible_build_constraints() -> Result<()> { - let context = TestContext::new("3.9"); + let context = uv_test::test_context!("3.9"); let test_script = context.temp_dir.child("script.py"); @@ -11424,7 +11424,7 @@ fn sync_script_with_compatible_build_constraints() -> Result<()> { #[test] fn sync_script_with_incompatible_build_constraints() -> Result<()> { - let context = TestContext::new("3.9"); + let context = uv_test::test_context!("3.9"); let test_script = context.temp_dir.child("script.py"); @@ -11463,7 +11463,7 @@ fn sync_script_with_incompatible_build_constraints() -> Result<()> { #[test] fn unsupported_git_scheme() -> Result<()> { - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -11497,7 +11497,7 @@ fn unsupported_git_scheme() -> Result<()> { /// See: #[test] fn multiple_group_conflicts() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -11591,7 +11591,7 @@ fn multiple_group_conflicts() -> Result<()> { /// See: #[test] fn transitive_group_conflicts_shallow() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -11697,7 +11697,7 @@ fn transitive_group_conflicts_shallow() -> Result<()> { /// See: #[test] fn transitive_group_conflicts_deep() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -11794,7 +11794,7 @@ fn transitive_group_conflicts_deep() -> Result<()> { /// See: #[test] fn transitive_group_conflicts_siblings() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -11888,7 +11888,7 @@ fn transitive_group_conflicts_siblings() -> Result<()> { /// See: #[test] fn transitive_group_conflicts_cycle() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -11975,7 +11975,7 @@ fn transitive_group_conflicts_cycle() -> Result<()> { /// See: #[test] fn prune_cache_url_subdirectory() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -12028,7 +12028,7 @@ fn prune_cache_url_subdirectory() -> Result<()> { /// See #[test] fn locked_version_coherence() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -12124,7 +12124,7 @@ fn locked_version_coherence() -> Result<()> { /// See: #[test] fn sync_build_constraints() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-03-24T19:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-03-24T19:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -12253,7 +12253,7 @@ fn sync_build_constraints() -> Result<()> { // is incompatible with the interpreter version. #[test] fn sync_when_virtual_environment_incompatible_with_interpreter() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -12360,7 +12360,7 @@ fn sync_when_virtual_environment_incompatible_with_interpreter() -> Result<()> { /// Ensure that existing `uv.lock` files can use `upload_time` or `upload-time` interchangeably. #[test] fn sync_upload_time() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -12467,7 +12467,7 @@ fn sync_upload_time() -> Result<()> { /// See: #[test] fn repeated_dev_member_all_packages() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -12553,7 +12553,7 @@ fn repeated_dev_member_all_packages() -> Result<()> { /// Test that hash checking doesn't fail with dependency metadata. #[test] fn direct_url_dependency_metadata() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context.temp_dir.child("pyproject.toml").write_str(r#" [project] name = "debug" @@ -12589,7 +12589,7 @@ fn direct_url_dependency_metadata() -> Result<()> { #[test] fn sync_required_environment_hint() -> Result<()> { - let context = TestContext::new("3.13"); + let context = uv_test::test_context!("3.13"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(&formatdoc! {r#" @@ -12643,7 +12643,7 @@ fn sync_required_environment_hint() -> Result<()> { #[test] fn sync_url_with_query_parameters() -> Result<()> { - let context = TestContext::new("3.13").with_exclude_newer("2025-03-24T19:00:00Z"); + let context = uv_test::test_context!("3.13").with_exclude_newer("2025-03-24T19:00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(r#" @@ -12673,7 +12673,7 @@ fn sync_url_with_query_parameters() -> Result<()> { /// Test uv sync with --exclude-newer-package #[test] fn sync_exclude_newer_package() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -12742,7 +12742,7 @@ dependencies = [ /// Test exclude-newer-package in pyproject.toml configuration #[test] fn sync_exclude_newer_package_config() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -12828,7 +12828,7 @@ exclude-newer-package = { tqdm = "2022-09-04T00:00:00Z" } fn read_only() -> Result<()> { use std::os::unix::fs::PermissionsExt; - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -12876,7 +12876,7 @@ fn read_only() -> Result<()> { #[test] fn sync_python_platform() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -12917,7 +12917,7 @@ fn sync_python_platform() -> Result<()> { #[test] #[cfg(not(windows))] fn conflicting_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -13083,7 +13083,7 @@ fn conflicting_editable() -> Result<()> { #[test] #[cfg(not(windows))] fn undeclared_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -13247,7 +13247,7 @@ fn undeclared_editable() -> Result<()> { #[test] fn sync_python_preference() -> Result<()> { - let context = TestContext::new_with_versions(&["3.12", "3.11"]); + let context = uv_test::test_context_with_versions!(&["3.12", "3.11"]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -13388,7 +13388,7 @@ fn sync_python_preference() -> Result<()> { #[test] fn sync_python_missing_download_hint() -> Result<()> { - let context = TestContext::new_with_versions(&["3.12"]) + let context = uv_test::test_context_with_versions!(&["3.12"]) .with_managed_python_dirs() .with_filtered_python_sources(); @@ -13419,7 +13419,7 @@ fn sync_python_missing_download_hint() -> Result<()> { #[test] fn sync_config_settings_package() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-07-25T00:00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-07-25T00:00:00Z"); // Create a child project that uses `setuptools`. let dependency = context.temp_dir.child("dependency"); @@ -13567,7 +13567,7 @@ fn sync_config_settings_package() -> Result<()> { fn sync_does_not_remove_empty_virtual_environment_directory() -> Result<()> { use std::os::unix::fs::PermissionsExt; - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); let project_dir = context.temp_dir.child("project"); fs_err::create_dir(&project_dir)?; @@ -13609,7 +13609,7 @@ fn sync_does_not_remove_empty_virtual_environment_directory() -> Result<()> { /// Test that build dependencies respect locked versions from the lockfile. #[test] fn sync_build_dependencies_respect_locked_versions() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); // Write a test package that arbitrarily requires `anyio` at build time let child = context.temp_dir.child("child"); @@ -13863,7 +13863,7 @@ fn sync_build_dependencies_respect_locked_versions() -> Result<()> { #[test] fn sync_extra_build_variables() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); // Create a build backend that asserts that `EXPECTED_ANYIO_VERSION` matches the installed version of `anyio`. let build_backend = context.temp_dir.child("build_backend.py"); @@ -14001,7 +14001,7 @@ fn sync_extra_build_variables() -> Result<()> { #[test] fn reject_unmatched_runtime() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-01T00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-01T00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -14035,7 +14035,7 @@ fn reject_unmatched_runtime() -> Result<()> { #[test] #[cfg(feature = "test-git-lfs")] fn sync_git_lfs() -> Result<()> { - let context = TestContext::new("3.13").with_git_lfs_config(); + let context = uv_test::test_context!("3.13").with_git_lfs_config(); let pyproject_toml = context.temp_dir.child("pyproject.toml"); // Set `lfs = true` in the source @@ -14465,7 +14465,7 @@ fn sync_git_lfs() -> Result<()> { #[test] fn match_runtime_optional() -> Result<()> { - let context = TestContext::new("3.12").with_exclude_newer("2025-01-01T00:00Z"); + let context = uv_test::test_context!("3.12").with_exclude_newer("2025-01-01T00:00Z"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -14502,7 +14502,7 @@ fn match_runtime_optional() -> Result<()> { #[test] fn sync_extra_build_dependencies_cache() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Write a test package. context @@ -14708,7 +14708,7 @@ async fn sync_zstd_wheel() -> Result<()> { matchers::{method, path}, }; - let context = TestContext::new("3.13"); + let context = uv_test::test_context!("3.13"); let server = MockServer::start().await; // Copy the wheel files to serve them @@ -14818,7 +14818,7 @@ async fn sync_zstd_wheel() -> Result<()> { #[test] #[cfg(not(windows))] fn toggle_workspace_editable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child = context.temp_dir.child("child"); let pyproject_toml = child.child("pyproject.toml"); @@ -15036,7 +15036,7 @@ fn toggle_workspace_editable() -> Result<()> { #[test] #[cfg(not(windows))] fn workspace_editable_conflict() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let child1 = context.temp_dir.child("child1"); let pyproject_toml = child1.child("pyproject.toml"); @@ -15311,7 +15311,7 @@ fn workspace_editable_conflict() -> Result<()> { #[test] fn only_group_and_extra_conflict() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -15366,7 +15366,7 @@ fn only_group_and_extra_conflict() -> Result<()> { /// See: #[test] fn sync_no_sources_editable_to_package_switch() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a local package that will be used as editable dependency. let local_dep = context.temp_dir.child("local_dep"); @@ -15463,7 +15463,7 @@ fn sync_no_sources_editable_to_package_switch() -> Result<()> { #[test] fn sync_fails_ambiguous_url() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#" @@ -15510,7 +15510,7 @@ fn sync_fails_ambiguous_url() -> Result<()> { /// Regression test for: #[test] fn sync_reinstalls_on_version_change() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a workspace with a local directory dependency. let pyproject_toml = context.temp_dir.child("pyproject.toml"); diff --git a/crates/uv/tests/it/tool_dir.rs b/crates/uv/tests/it/tool_dir.rs index 5eb092416..769d59dfa 100644 --- a/crates/uv/tests/it/tool_dir.rs +++ b/crates/uv/tests/it/tool_dir.rs @@ -2,11 +2,11 @@ use assert_fs::fixture::PathChild; use uv_static::EnvVars; -use crate::common::{TestContext, uv_snapshot}; +use uv_test::uv_snapshot; #[test] fn tool_dir() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -24,7 +24,7 @@ fn tool_dir() { #[test] fn tool_dir_bin() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); diff --git a/crates/uv/tests/it/tool_install.rs b/crates/uv/tests/it/tool_install.rs index 4d1762f27..dae572906 100644 --- a/crates/uv/tests/it/tool_install.rs +++ b/crates/uv/tests/it/tool_install.rs @@ -14,11 +14,11 @@ use predicates::prelude::predicate; use uv_fs::copy_dir_all; use uv_static::EnvVars; -use crate::common::{TestContext, uv_snapshot}; +use uv_test::uv_snapshot; #[test] fn tool_install() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -182,7 +182,7 @@ fn tool_install() { #[test] fn tool_install_python_from_global_version_file() { - let context = TestContext::new_with_versions(&["3.11", "3.12", "3.13"]) + let context = uv_test::test_context_with_versions!(&["3.11", "3.12", "3.13"]) .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -412,7 +412,7 @@ fn tool_install_python_from_global_version_file() { #[test] fn tool_install_with_editable() -> Result<()> { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_exclude_newer("2025-01-18T00:00:00Z") .with_filtered_counts() .with_filtered_exe_suffix(); @@ -452,7 +452,7 @@ fn tool_install_with_editable() -> Result<()> { #[test] fn tool_install_with_compatible_build_constraints() -> Result<()> { - let context = TestContext::new("3.9") + let context = uv_test::test_context!("3.9") .with_exclude_newer("2024-05-04T00:00:00Z") .with_filtered_counts() .with_filtered_exe_suffix(); @@ -522,7 +522,7 @@ fn tool_install_with_compatible_build_constraints() -> Result<()> { #[test] fn tool_install_with_incompatible_build_constraints() -> Result<()> { - let context = TestContext::new("3.9") + let context = uv_test::test_context!("3.9") .with_exclude_newer("2024-05-04T00:00:00Z") .with_filtered_counts() .with_filtered_exe_suffix(); @@ -563,7 +563,7 @@ fn tool_install_with_incompatible_build_constraints() -> Result<()> { #[test] fn tool_install_suggest_other_packages_with_executable() { // FastAPI 0.111 is only available from this date onwards. - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_exclude_newer("2024-05-04T00:00:00Z") .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -627,7 +627,7 @@ fn tool_install_suggest_other_packages_with_executable() { /// Test installing a tool at a version #[test] fn tool_install_version() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -715,7 +715,7 @@ fn tool_install_version() { /// Test an editable installation of a tool. #[test] fn tool_install_editable() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -873,7 +873,7 @@ fn tool_install_editable() { /// Ensure that we remove any existing entrypoints upon error. #[test] fn tool_install_remove_on_empty() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -1014,7 +1014,7 @@ fn tool_install_remove_on_empty() -> Result<()> { /// Test an editable installation of a tool using `--from`. #[test] fn tool_install_editable_from() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -1098,7 +1098,7 @@ fn tool_install_editable_from() { /// Test installing a tool with `uv tool install --from` #[test] fn tool_install_from() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -1163,7 +1163,7 @@ fn tool_install_from() { /// Test installing and reinstalling an already installed tool #[test] fn tool_install_already_installed() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -1348,7 +1348,7 @@ fn tool_install_already_installed() { /// Test installing a tool when its entry point already exists #[test] fn tool_install_force() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -1620,7 +1620,7 @@ fn tool_install_force() { #[cfg(unix)] #[test] fn tool_install_home() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); // Install `black` @@ -1662,7 +1662,7 @@ fn tool_install_home() { /// Test `uv tool install` when the bin directory is inferred from `$XDG_DATA_HOME` #[test] fn tool_install_xdg_data_home() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let data_home = context.temp_dir.child("data/home"); let bin_dir = context.temp_dir.child("data/bin"); @@ -1699,7 +1699,7 @@ fn tool_install_xdg_data_home() { /// Test `uv tool install` when the bin directory is set by `$XDG_BIN_HOME` #[test] fn tool_install_xdg_bin_home() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -1734,7 +1734,7 @@ fn tool_install_xdg_bin_home() { /// Test `uv tool install` when the bin directory is set by `$UV_TOOL_BIN_DIR` #[test] fn tool_install_tool_bin_dir() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -1769,7 +1769,7 @@ fn tool_install_tool_bin_dir() { /// Test installing a tool that lacks entrypoints #[test] fn tool_install_no_entrypoints() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -1803,7 +1803,7 @@ fn tool_install_no_entrypoints() { /// Test installing a package that can't be installed. #[test] fn tool_install_uninstallable() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -1858,7 +1858,7 @@ fn tool_install_uninstallable() { /// Test installing a tool with a bare URL requirement. #[test] fn tool_install_unnamed_package() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -1947,7 +1947,7 @@ fn tool_install_unnamed_package() { #[test] #[cfg(feature = "test-git")] fn tool_install_git() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); let mut paths = BTreeSet::new(); @@ -2042,7 +2042,7 @@ fn tool_install_git() { #[test] #[cfg(feature = "test-git-lfs")] fn tool_install_git_lfs() { - let context = TestContext::new("3.13") + let context = uv_test::test_context!("3.13") .with_filtered_exe_suffix() .with_git_lfs_config(); let tool_dir = context.temp_dir.child("tools"); @@ -2238,7 +2238,7 @@ fn tool_install_git_lfs() { /// name conflict. #[test] fn tool_install_unnamed_conflict() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -2262,7 +2262,7 @@ fn tool_install_unnamed_conflict() { /// Test installing a tool with a bare URL requirement using `--from`. #[test] fn tool_install_unnamed_from() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -2352,7 +2352,7 @@ fn tool_install_unnamed_from() { /// Test installing a tool with a bare URL requirement using `--with`. #[test] fn tool_install_unnamed_with() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -2445,7 +2445,7 @@ fn tool_install_unnamed_with() { #[test] fn tool_install_with_dependencies_from_script() -> Result<()> { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -2571,7 +2571,7 @@ fn tool_install_with_dependencies_from_script() -> Result<()> { /// Test installing a tool with additional requirements from a `requirements.txt` file. #[test] fn tool_install_requirements_txt() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -2675,7 +2675,7 @@ fn tool_install_requirements_txt() { /// Ignore and warn when (e.g.) the `--index-url` argument is a provided `requirements.txt`. #[test] fn tool_install_requirements_txt_arguments() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -2803,7 +2803,7 @@ fn tool_install_requirements_txt_arguments() { /// Test upgrading an already installed tool. #[test] fn tool_install_upgrade() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -2967,7 +2967,7 @@ fn tool_install_upgrade() { /// Test reinstalling tools with varying `--python` requests. #[test] fn tool_install_python_requests() { - let context = TestContext::new_with_versions(&["3.11", "3.12"]) + let context = uv_test::test_context_with_versions!(&["3.11", "3.12"]) .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -3046,7 +3046,7 @@ fn tool_install_python_requests() { #[ignore = "https://github.com/astral-sh/uv/issues/7473"] #[test] fn tool_install_python_preference() { - let context = TestContext::new_with_versions(&["3.11", "3.12"]) + let context = uv_test::test_context_with_versions!(&["3.11", "3.12"]) .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -3188,7 +3188,7 @@ fn tool_install_python_preference() { /// Test preserving a tool environment when new but incompatible requirements are requested. #[test] fn tool_install_preserve_environment() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -3254,7 +3254,7 @@ fn tool_install_preserve_environment() { #[test] #[cfg(unix)] fn tool_install_warn_path() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -3288,7 +3288,7 @@ fn tool_install_warn_path() { /// Test installing and reinstalling with an invalid receipt. #[test] fn tool_install_bad_receipt() -> Result<()> { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -3358,7 +3358,7 @@ fn tool_install_bad_receipt() -> Result<()> { /// that isn't properly normalized). #[test] fn tool_install_malformed_dist_info() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_exclude_newer("2025-01-18T00:00:00Z") .with_filtered_counts() .with_filtered_exe_suffix(); @@ -3435,7 +3435,7 @@ fn tool_install_malformed_dist_info() { /// Test installing, then re-installing with different settings. #[test] fn tool_install_settings() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -3589,7 +3589,7 @@ fn tool_install_settings() { /// Test installing a tool with `uv tool install {package}@{version}`. #[test] fn tool_install_at_version() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -3655,7 +3655,7 @@ fn tool_install_at_version() { /// Test installing a tool with `uv tool install {package}@latest`. #[test] fn tool_install_at_latest() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -3704,7 +3704,7 @@ fn tool_install_at_latest() { /// Test installing a tool with `uv tool install {package} --from {package}@latest`. #[test] fn tool_install_from_at_latest() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_exclude_newer("2025-01-18T00:00:00Z") .with_filtered_counts() .with_filtered_exe_suffix(); @@ -3749,7 +3749,7 @@ fn tool_install_from_at_latest() { /// Test installing a tool with `uv tool install {package} --from {package}@{version}`. #[test] fn tool_install_from_at_version() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_exclude_newer("2025-01-18T00:00:00Z") .with_filtered_counts() .with_filtered_exe_suffix(); @@ -3794,7 +3794,7 @@ fn tool_install_from_at_version() { /// Test upgrading an already installed tool via `{package}@{latest}`. #[test] fn tool_install_at_latest_upgrade() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -3915,7 +3915,7 @@ fn tool_install_at_latest_upgrade() { /// Install a tool with `--constraints`. #[test] fn tool_install_constraints() -> Result<()> { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -4022,7 +4022,7 @@ fn tool_install_constraints() -> Result<()> { /// Install a tool with `--overrides`. #[test] fn tool_install_overrides() -> Result<()> { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -4086,7 +4086,7 @@ fn tool_install_overrides() -> Result<()> { /// `uv tool install python` is not allowed #[test] fn tool_install_python() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -4123,7 +4123,7 @@ fn tool_install_python() { #[test] fn tool_install_mismatched_name() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -4178,7 +4178,7 @@ fn tool_install_mismatched_name() { /// When installing from an authenticated index, the credentials should be omitted from the receipt. #[test] fn tool_install_credentials() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_exclude_newer("2025-01-18T00:00:00Z") .with_filtered_counts() .with_filtered_exe_suffix(); @@ -4258,7 +4258,7 @@ fn tool_install_credentials() { /// When installing from an authenticated index, the credentials should be omitted from the receipt. #[test] fn tool_install_default_credentials() -> Result<()> { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_exclude_newer("2025-01-18T00:00:00Z") .with_filtered_counts() .with_filtered_exe_suffix(); @@ -4380,7 +4380,7 @@ fn tool_install_default_credentials() -> Result<()> { /// Test installing a tool with `--with-executables-from`. #[test] fn tool_install_with_executables_from() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -4470,7 +4470,7 @@ fn tool_install_with_executables_from() { /// Test installing a tool with `--with-executables-from`, but the package has no entrypoints. #[test] fn tool_install_with_executables_from_no_entrypoints() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -4512,7 +4512,7 @@ fn tool_install_with_executables_from_no_entrypoints() { #[test] fn tool_install_find_links() { - let context = TestContext::new("3.13").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.13").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -4622,7 +4622,7 @@ fn tool_install_find_links() { #[test] fn tool_install_python_platform() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); diff --git a/crates/uv/tests/it/tool_list.rs b/crates/uv/tests/it/tool_list.rs index 485f3b354..a76fb27c7 100644 --- a/crates/uv/tests/it/tool_list.rs +++ b/crates/uv/tests/it/tool_list.rs @@ -1,14 +1,14 @@ -use crate::common::{self, TestContext, uv_snapshot}; use anyhow::Result; use assert_cmd::assert::OutputAssertExt; use assert_fs::fixture::PathChild; use fs_err as fs; use insta::assert_snapshot; use uv_static::EnvVars; +use uv_test::uv_snapshot; #[test] fn tool_list() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -37,7 +37,7 @@ fn tool_list() { #[test] fn tool_list_paths() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -67,7 +67,7 @@ fn tool_list_paths() { #[cfg(windows)] #[test] fn tool_list_paths_windows() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .clear_filters() .with_filtered_windows_temp_dir(); let tool_dir = context.temp_dir.child("tools"); @@ -98,7 +98,7 @@ fn tool_list_paths_windows() { #[test] fn tool_list_empty() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -116,7 +116,7 @@ fn tool_list_empty() { #[test] fn tool_list_missing_receipt() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -145,7 +145,7 @@ fn tool_list_missing_receipt() { #[test] fn tool_list_bad_environment() -> Result<()> { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_python_names() .with_filtered_virtualenv_bin() .with_filtered_exe_suffix(); @@ -170,7 +170,7 @@ fn tool_list_bad_environment() -> Result<()> { .assert() .success(); - let venv_path = common::venv_bin_path(tool_dir.path().join("black")); + let venv_path = uv_test::venv_bin_path(tool_dir.path().join("black")); // Remove the python interpreter for black fs::remove_dir_all(venv_path.clone())?; @@ -197,7 +197,7 @@ fn tool_list_bad_environment() -> Result<()> { #[test] fn tool_list_deprecated() -> Result<()> { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -284,7 +284,7 @@ fn tool_list_deprecated() -> Result<()> { #[test] fn tool_list_show_version_specifiers() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -340,7 +340,7 @@ fn tool_list_show_version_specifiers() { #[test] fn tool_list_show_with() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -455,7 +455,7 @@ fn tool_list_show_with() { #[test] fn tool_list_show_extras() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -566,7 +566,7 @@ fn tool_list_show_extras() { #[test] fn tool_list_show_python() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -596,7 +596,7 @@ fn tool_list_show_python() { #[test] fn tool_list_show_all() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); diff --git a/crates/uv/tests/it/tool_run.rs b/crates/uv/tests/it/tool_run.rs index 77891d4c9..9bdf0f9f0 100644 --- a/crates/uv/tests/it/tool_run.rs +++ b/crates/uv/tests/it/tool_run.rs @@ -1,14 +1,14 @@ -use crate::common::{TestContext, uv_snapshot, venv_bin_path}; use anyhow::Result; use assert_cmd::prelude::*; use assert_fs::prelude::*; use indoc::indoc; use uv_fs::copy_dir_all; use uv_static::EnvVars; +use uv_test::{uv_snapshot, venv_bin_path}; #[test] fn tool_run_args() { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let mut filters = context.filters(); filters.push(( r"Usage: uv tool run \[OPTIONS\] (?s).*", @@ -63,7 +63,7 @@ fn tool_run_args() { #[test] fn tool_run_at_version() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -158,7 +158,7 @@ fn tool_run_at_version() { #[test] fn tool_run_from_version() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -187,7 +187,7 @@ fn tool_run_from_version() { #[test] fn tool_run_constraints() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -219,7 +219,7 @@ fn tool_run_constraints() { #[test] fn tool_run_overrides() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -251,7 +251,7 @@ fn tool_run_overrides() { #[test] fn tool_run_suggest_valid_commands() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -303,7 +303,7 @@ fn tool_run_suggest_valid_commands() { #[test] fn tool_run_warn_executable_not_in_from() { // FastAPI 0.111 is only available from this date onwards. - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_exclude_newer("2024-05-04T00:00:00Z") .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -368,7 +368,7 @@ fn tool_run_warn_executable_not_in_from() { #[test] fn tool_run_from_install() { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -503,7 +503,7 @@ fn tool_run_from_install() { #[test] fn tool_run_from_install_constraints() { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -686,7 +686,7 @@ fn tool_run_from_install_constraints() { #[test] fn tool_run_cache() { - let context = TestContext::new_with_versions(&["3.11", "3.12"]).with_filtered_counts(); + let context = uv_test::test_context_with_versions!(&["3.11", "3.12"]).with_filtered_counts(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -849,7 +849,7 @@ fn tool_run_cache() { #[test] fn tool_run_url() { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -935,7 +935,7 @@ fn tool_run_url() { #[test] #[cfg(feature = "test-git")] fn tool_run_git() { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -1027,7 +1027,7 @@ fn tool_run_git() { #[test] #[cfg(feature = "test-git-lfs")] fn tool_run_git_lfs() { - let context = TestContext::new("3.13") + let context = uv_test::test_context!("3.13") .with_filtered_counts() .with_filtered_exe_suffix() .with_git_lfs_config(); @@ -1197,7 +1197,7 @@ fn tool_run_git_lfs() { /// Read requirements from a `requirements.txt` file. #[test] fn tool_run_requirements_txt() { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -1239,7 +1239,7 @@ fn tool_run_requirements_txt() { /// Ignore and warn when (e.g.) the `--index-url` argument is a provided `requirements.txt`. #[test] fn tool_run_requirements_txt_arguments() { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -1285,7 +1285,7 @@ fn tool_run_requirements_txt_arguments() { /// List installed tools when no command arg is given (e.g. `uv tool run`). #[test] fn tool_run_list_installed() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -1334,7 +1334,7 @@ fn tool_run_list_installed() { /// By default, omit resolver and installer output. #[test] fn tool_run_without_output() { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -1375,7 +1375,7 @@ fn tool_run_without_output() { #[test] #[cfg(not(windows))] fn tool_run_csv_with_shorthand() -> anyhow::Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -1437,7 +1437,7 @@ fn tool_run_csv_with_shorthand() -> anyhow::Result<()> { #[test] #[cfg(not(windows))] fn tool_run_csv_with() -> anyhow::Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -1499,7 +1499,7 @@ fn tool_run_csv_with() -> anyhow::Result<()> { #[test] #[cfg(windows)] fn tool_run_csv_with() -> anyhow::Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -1561,7 +1561,7 @@ fn tool_run_csv_with() -> anyhow::Result<()> { #[test] #[cfg(not(windows))] fn tool_run_repeated_with() -> anyhow::Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -1625,7 +1625,7 @@ fn tool_run_repeated_with() -> anyhow::Result<()> { #[test] #[cfg(windows)] fn tool_run_repeated_with() -> anyhow::Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -1688,7 +1688,7 @@ fn tool_run_repeated_with() -> anyhow::Result<()> { #[test] fn tool_run_with_editable() -> anyhow::Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -1824,7 +1824,7 @@ fn tool_run_with_editable() -> anyhow::Result<()> { #[test] fn warn_no_executables_found() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -1852,7 +1852,7 @@ fn warn_no_executables_found() { /// Warn when a user passes `--upgrade` to `uv tool run`. #[test] fn tool_run_upgrade_warn() { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -1907,7 +1907,7 @@ fn tool_run_upgrade_warn() { /// If we fail to resolve the tool, we should include "tool" in the error message. #[test] fn tool_run_resolution_error() { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -1927,7 +1927,7 @@ fn tool_run_resolution_error() { #[test] fn tool_run_latest() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -1992,7 +1992,7 @@ fn tool_run_latest() { #[test] fn tool_run_latest_extra() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -2051,7 +2051,7 @@ fn tool_run_latest_extra() { #[test] fn tool_run_extra() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -2084,7 +2084,7 @@ fn tool_run_extra() { #[test] fn tool_run_specifier() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -2116,7 +2116,7 @@ fn tool_run_specifier() { #[test] fn tool_run_python() { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); uv_snapshot!(context.filters(), context.tool_run() .arg("python") .arg("--version"), @" @@ -2146,7 +2146,7 @@ fn tool_run_python() { #[test] fn tool_run_python_at_version() { - let context = TestContext::new_with_versions(&["3.12", "3.11"]) + let context = uv_test::test_context_with_versions!(&["3.12", "3.11"]) .with_filtered_counts() .with_filtered_python_sources(); @@ -2350,7 +2350,7 @@ fn tool_run_python_at_version() { #[test] fn tool_run_hint_version_not_available() { - let context = TestContext::new_with_versions(&[]) + let context = uv_test::test_context_with_versions!(&[]) .with_filtered_counts() .with_filtered_python_sources(); @@ -2398,7 +2398,7 @@ fn tool_run_hint_version_not_available() { #[test] fn tool_run_python_from_global_version_file() { - let context = TestContext::new_with_versions(&["3.12", "3.11"]) + let context = uv_test::test_context_with_versions!(&["3.12", "3.11"]) .with_filtered_counts() .with_filtered_python_sources(); @@ -2425,7 +2425,7 @@ fn tool_run_python_from_global_version_file() { #[test] fn tool_run_python_version_overrides_global_pin() { - let context = TestContext::new_with_versions(&["3.12", "3.11"]) + let context = uv_test::test_context_with_versions!(&["3.12", "3.11"]) .with_filtered_counts() .with_filtered_python_sources(); @@ -2454,7 +2454,7 @@ fn tool_run_python_version_overrides_global_pin() { #[test] fn tool_run_python_with_explicit_default_bypasses_global_pin() { - let context = TestContext::new_with_versions(&["3.12", "3.11"]) + let context = uv_test::test_context_with_versions!(&["3.12", "3.11"]) .with_filtered_counts() .with_filtered_python_sources(); @@ -2485,7 +2485,7 @@ fn tool_run_python_with_explicit_default_bypasses_global_pin() { #[test] fn tool_run_python_from() { - let context = TestContext::new_with_versions(&["3.12", "3.11"]) + let context = uv_test::test_context_with_versions!(&["3.12", "3.11"]) .with_filtered_counts() .with_filtered_python_sources(); @@ -2566,7 +2566,7 @@ fn tool_run_python_from() { #[test] fn run_with_env_file() -> anyhow::Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -2660,7 +2660,7 @@ fn run_with_env_file() -> anyhow::Result<()> { #[test] fn tool_run_from_at() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_exclude_newer("2025-01-18T00:00:00Z") .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -2707,7 +2707,7 @@ fn tool_run_from_at() { #[test] fn tool_run_verbatim_name() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -2795,7 +2795,7 @@ fn tool_run_verbatim_name() { #[test] fn tool_run_with_existing_py_script() -> anyhow::Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); context.temp_dir.child("script.py").touch()?; uv_snapshot!(context.filters(), context.tool_run().arg("script.py"), @" @@ -2813,7 +2813,7 @@ fn tool_run_with_existing_py_script() -> anyhow::Result<()> { #[test] fn tool_run_with_existing_pyw_script() -> anyhow::Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); context.temp_dir.child("script.pyw").touch()?; // We treat arguments before the command as uv arguments @@ -2833,7 +2833,7 @@ fn tool_run_with_existing_pyw_script() -> anyhow::Result<()> { #[test] fn tool_run_with_nonexistent_py_script() { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); // We treat arguments before the command as uv arguments uv_snapshot!(context.filters(), context.tool_run() @@ -2851,7 +2851,7 @@ fn tool_run_with_nonexistent_py_script() { #[test] fn tool_run_with_nonexistent_pyw_script() { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); // We treat arguments before the command as uv arguments uv_snapshot!(context.filters(), context.tool_run() @@ -2869,7 +2869,7 @@ fn tool_run_with_nonexistent_pyw_script() { #[test] fn tool_run_with_from_script() { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); // We treat arguments before the command as uv arguments uv_snapshot!(context.filters(), context.tool_run() @@ -2889,7 +2889,7 @@ fn tool_run_with_from_script() { #[test] fn tool_run_with_script_and_from_script() { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); // We treat arguments before the command as uv arguments uv_snapshot!(context.filters(), context.tool_run() @@ -2911,7 +2911,7 @@ fn tool_run_with_script_and_from_script() { /// we show a helpful hint. #[test] fn tool_run_verbose_hint() { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -2981,7 +2981,7 @@ fn tool_run_verbose_hint() { #[test] fn tool_run_with_compatible_build_constraints() -> Result<()> { - let context = TestContext::new("3.9") + let context = uv_test::test_context!("3.9") .with_exclude_newer("2024-05-04T00:00:00Z") .with_filtered_counts() .with_filtered_exe_suffix(); @@ -3018,7 +3018,7 @@ fn tool_run_with_compatible_build_constraints() -> Result<()> { #[test] fn tool_run_with_incompatible_build_constraints() -> Result<()> { - let context = TestContext::new("3.9") + let context = uv_test::test_context!("3.9") .with_exclude_newer("2024-05-04T00:00:00Z") .with_filtered_counts() .with_filtered_exe_suffix(); @@ -3054,7 +3054,7 @@ fn tool_run_with_incompatible_build_constraints() -> Result<()> { #[test] fn tool_run_with_dependencies_from_script() -> Result<()> { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_missing_file_error(); @@ -3155,7 +3155,7 @@ fn tool_run_with_dependencies_from_script() -> Result<()> { #[cfg(windows)] #[test] fn tool_run_windows_runnable_types() -> anyhow::Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -3467,7 +3467,7 @@ fn tool_run_windows_runnable_types() -> anyhow::Result<()> { #[test] fn tool_run_reresolve_python() -> anyhow::Result<()> { - let context = TestContext::new_with_versions(&["3.11", "3.12"]).with_filtered_counts(); + let context = uv_test::test_context_with_versions!(&["3.11", "3.12"]).with_filtered_counts(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); let foo_dir = context.temp_dir.child("foo"); @@ -3561,7 +3561,7 @@ fn tool_run_reresolve_python() -> anyhow::Result<()> { #[cfg(windows)] #[test] fn tool_run_windows_dotted_package_name() -> anyhow::Result<()> { - let context = TestContext::new("3.12").with_filtered_counts(); + let context = uv_test::test_context!("3.12").with_filtered_counts(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -3597,7 +3597,7 @@ fn tool_run_windows_dotted_package_name() -> anyhow::Result<()> { /// Regression test for #[test] fn tool_run_latest_keyring_auth() { - let keyring_context = TestContext::new("3.12"); + let keyring_context = uv_test::test_context!("3.12"); // Install our keyring plugin keyring_context @@ -3612,7 +3612,7 @@ fn tool_run_latest_keyring_auth() { .assert() .success(); - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_exclude_newer("2025-01-18T00:00:00Z") .with_filtered_counts(); let tool_dir = context.temp_dir.child("tools"); diff --git a/crates/uv/tests/it/tool_uninstall.rs b/crates/uv/tests/it/tool_uninstall.rs index e0d3227c3..610d081e1 100644 --- a/crates/uv/tests/it/tool_uninstall.rs +++ b/crates/uv/tests/it/tool_uninstall.rs @@ -3,11 +3,11 @@ use assert_fs::fixture::PathChild; use uv_static::EnvVars; -use crate::common::{TestContext, uv_snapshot}; +use uv_test::uv_snapshot; #[test] fn tool_uninstall() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -68,7 +68,7 @@ fn tool_uninstall() { #[test] fn tool_uninstall_multiple_names() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -115,7 +115,7 @@ fn tool_uninstall_multiple_names() { #[test] fn tool_uninstall_not_installed() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -133,7 +133,7 @@ fn tool_uninstall_not_installed() { #[test] fn tool_uninstall_missing_receipt() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); @@ -162,7 +162,7 @@ fn tool_uninstall_missing_receipt() { #[test] fn tool_uninstall_all_missing_receipt() { - let context = TestContext::new("3.12").with_filtered_exe_suffix(); + let context = uv_test::test_context!("3.12").with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); let bin_dir = context.temp_dir.child("bin"); diff --git a/crates/uv/tests/it/tool_upgrade.rs b/crates/uv/tests/it/tool_upgrade.rs index 1bb9c0149..016088703 100644 --- a/crates/uv/tests/it/tool_upgrade.rs +++ b/crates/uv/tests/it/tool_upgrade.rs @@ -3,11 +3,11 @@ use insta::assert_snapshot; use uv_static::EnvVars; -use crate::common::{TestContext, uv_snapshot}; +use uv_test::uv_snapshot; #[test] fn tool_upgrade_empty() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -92,7 +92,7 @@ fn tool_upgrade_empty() { #[test] fn tool_upgrade_name() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -142,7 +142,7 @@ fn tool_upgrade_name() { #[test] fn tool_upgrade_multiple_names() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -217,7 +217,7 @@ fn tool_upgrade_multiple_names() { #[test] fn tool_upgrade_pinned_hint() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); @@ -268,7 +268,7 @@ fn tool_upgrade_pinned_hint() { #[test] fn tool_upgrade_pinned_hint_with_mixed_constraint() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); @@ -320,7 +320,7 @@ fn tool_upgrade_pinned_hint_with_mixed_constraint() { #[test] fn tool_upgrade_all() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -394,7 +394,7 @@ fn tool_upgrade_all() { #[test] fn tool_upgrade_non_existing_package() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -432,7 +432,7 @@ fn tool_upgrade_non_existing_package() { #[test] fn tool_upgrade_not_stop_if_upgrade_fails() -> anyhow::Result<()> { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -512,7 +512,7 @@ fn tool_upgrade_not_stop_if_upgrade_fails() -> anyhow::Result<()> { #[test] fn tool_upgrade_settings() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -577,7 +577,7 @@ fn tool_upgrade_settings() { #[test] fn tool_upgrade_respect_constraints() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -628,7 +628,7 @@ fn tool_upgrade_respect_constraints() { #[test] fn tool_upgrade_constraint() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -743,7 +743,7 @@ fn tool_upgrade_constraint() { /// itself. #[test] fn tool_upgrade_with() { - let context = TestContext::new("3.12") + let context = uv_test::test_context!("3.12") .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -793,7 +793,7 @@ fn tool_upgrade_with() { #[test] fn tool_upgrade_python() { - let context = TestContext::new_with_versions(&["3.11", "3.12"]) + let context = uv_test::test_context_with_versions!(&["3.11", "3.12"]) .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -852,7 +852,7 @@ fn tool_upgrade_python() { #[test] fn tool_upgrade_python_with_all() { - let context = TestContext::new_with_versions(&["3.11", "3.12"]) + let context = uv_test::test_context_with_versions!(&["3.11", "3.12"]) .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); @@ -945,7 +945,7 @@ fn tool_upgrade_python_with_all() { /// packages. #[test] fn test_tool_upgrade_additional_entrypoints() { - let context = TestContext::new_with_versions(&["3.11", "3.12"]) + let context = uv_test::test_context_with_versions!(&["3.11", "3.12"]) .with_filtered_counts() .with_filtered_exe_suffix(); let tool_dir = context.temp_dir.child("tools"); diff --git a/crates/uv/tests/it/tree.rs b/crates/uv/tests/it/tree.rs index e310b1658..1e0eeee7b 100644 --- a/crates/uv/tests/it/tree.rs +++ b/crates/uv/tests/it/tree.rs @@ -5,11 +5,11 @@ use indoc::{formatdoc, indoc}; use insta::assert_snapshot; use url::Url; -use crate::common::{TestContext, uv_snapshot}; +use uv_test::uv_snapshot; #[test] fn nested_dependencies() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -50,7 +50,7 @@ fn nested_dependencies() -> Result<()> { #[test] fn nested_platform_dependencies() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -117,7 +117,7 @@ fn nested_platform_dependencies() -> Result<()> { #[test] fn invert() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -179,7 +179,7 @@ fn invert() -> Result<()> { #[test] fn frozen() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -241,7 +241,7 @@ fn frozen() -> Result<()> { #[test] fn outdated() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -273,7 +273,7 @@ fn outdated() -> Result<()> { #[test] fn platform_dependencies() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -353,7 +353,7 @@ fn platform_dependencies() -> Result<()> { #[test] fn platform_dependencies_inverted() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -398,7 +398,7 @@ fn platform_dependencies_inverted() -> Result<()> { #[test] fn repeated_dependencies() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -444,7 +444,7 @@ fn repeated_dependencies() -> Result<()> { /// URLs. #[test] fn repeated_version() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let v1 = context.temp_dir.child("v1"); fs_err::create_dir_all(&v1)?; @@ -516,7 +516,7 @@ fn repeated_version() -> Result<()> { #[test] fn dev_dependencies() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -570,7 +570,7 @@ fn dev_dependencies() -> Result<()> { #[test] fn dev_dependencies_inverted() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -627,7 +627,7 @@ fn dev_dependencies_inverted() -> Result<()> { #[test] fn optional_dependencies() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -677,7 +677,7 @@ fn optional_dependencies() -> Result<()> { #[test] fn optional_dependencies_inverted() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -735,7 +735,7 @@ fn optional_dependencies_inverted() -> Result<()> { #[test] fn package() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -810,7 +810,7 @@ fn package() -> Result<()> { #[test] fn group() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -920,7 +920,7 @@ fn group() -> Result<()> { #[test] fn cycle() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1006,7 +1006,7 @@ fn cycle() -> Result<()> { #[test] fn workspace_dev() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1085,7 +1085,7 @@ fn workspace_dev() -> Result<()> { #[test] fn non_project() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1121,7 +1121,7 @@ fn non_project() -> Result<()> { #[test] fn non_project_member() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1195,7 +1195,7 @@ fn non_project_member() -> Result<()> { #[test] fn script() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let script = context.temp_dir.child("script.py"); script.write_str(indoc! {r#" @@ -1594,7 +1594,7 @@ fn script() -> Result<()> { #[test] fn only_group() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1676,7 +1676,7 @@ fn only_group() -> Result<()> { #[test] fn show_sizes() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1706,7 +1706,7 @@ fn show_sizes() -> Result<()> { #[test] fn workspace_circular_dependencies() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create workspace root let pyproject_toml = context.temp_dir.child("pyproject.toml"); diff --git a/crates/uv/tests/it/venv.rs b/crates/uv/tests/it/venv.rs index 89ef4e75a..89e93a402 100644 --- a/crates/uv/tests/it/venv.rs +++ b/crates/uv/tests/it/venv.rs @@ -9,11 +9,11 @@ use uv_static::EnvVars; #[cfg(unix)] use fs_err::os::unix::fs::symlink; -use crate::common::{TestContext, uv_snapshot}; +use uv_test::uv_snapshot; #[test] fn create_venv() { - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); // Create a virtual environment at `.venv`. uv_snapshot!(context.filters(), context.venv() @@ -72,7 +72,7 @@ fn create_venv() { #[test] fn create_venv_313() { - let context = TestContext::new_with_versions(&["3.13"]); + let context = uv_test::test_context_with_versions!(&["3.13"]); uv_snapshot!(context.filters(), context.venv() .arg(context.venv.as_os_str()) @@ -94,7 +94,7 @@ fn create_venv_313() { #[test] fn create_venv_project_environment() -> Result<()> { - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); // `uv venv` ignores `UV_PROJECT_ENVIRONMENT` when it's not a project uv_snapshot!(context.filters(), context.venv().env(EnvVars::UV_PROJECT_ENVIRONMENT, "foo"), @" @@ -213,7 +213,7 @@ fn create_venv_project_environment() -> Result<()> { #[test] fn virtual_empty() -> Result<()> { // testing how `uv venv` reacts to a pyproject with no `[project]` and nothing useful to it - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -239,7 +239,7 @@ fn virtual_empty() -> Result<()> { fn virtual_dependency_group() -> Result<()> { // testing basic `uv venv` functionality // when the pyproject.toml is fully virtual (no `[project]`, but `[dependency-groups]` defined) - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -265,7 +265,7 @@ fn virtual_dependency_group() -> Result<()> { #[test] fn create_venv_defaults_to_cwd() { - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); uv_snapshot!(context.filters(), context.venv() .arg("--python") .arg("3.12"), @" @@ -285,7 +285,7 @@ fn create_venv_defaults_to_cwd() { #[test] fn create_venv_ignores_virtual_env_variable() { - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); // We shouldn't care if `VIRTUAL_ENV` is set to an non-existent directory // because we ignore virtual environment interpreter sources (we require a system interpreter) uv_snapshot!(context.filters(), context.venv() @@ -304,7 +304,7 @@ fn create_venv_ignores_virtual_env_variable() { #[test] fn create_venv_reads_request_from_python_version_file() { - let context = TestContext::new_with_versions(&["3.11", "3.12"]); + let context = uv_test::test_context_with_versions!(&["3.11", "3.12"]); // Without the file, we should use the first on the PATH uv_snapshot!(context.filters(), context.venv(), @" @@ -343,7 +343,7 @@ fn create_venv_reads_request_from_python_version_file() { #[test] fn create_venv_reads_request_from_python_versions_file() { - let context = TestContext::new_with_versions(&["3.11", "3.12"]); + let context = uv_test::test_context_with_versions!(&["3.11", "3.12"]); // Without the file, we should use the first on the PATH uv_snapshot!(context.filters(), context.venv(), @" @@ -382,7 +382,7 @@ fn create_venv_reads_request_from_python_versions_file() { #[test] fn create_venv_respects_pyproject_requires_python() -> Result<()> { - let context = TestContext::new_with_versions(&["3.11", "3.9", "3.10", "3.12"]); + let context = uv_test::test_context_with_versions!(&["3.11", "3.9", "3.10", "3.12"]); // Without a Python requirement, we use the first on the PATH uv_snapshot!(context.filters(), context.venv(), @" @@ -567,7 +567,7 @@ fn create_venv_respects_pyproject_requires_python() -> Result<()> { #[test] fn create_venv_respects_group_requires_python() -> Result<()> { - let context = TestContext::new_with_versions(&["3.9", "3.10", "3.11", "3.12"]); + let context = uv_test::test_context_with_versions!(&["3.9", "3.10", "3.11", "3.12"]); // Without a Python requirement, we use the first on the PATH uv_snapshot!(context.filters(), context.venv(), @" @@ -745,7 +745,7 @@ fn create_venv_respects_group_requires_python() -> Result<()> { #[test] fn create_venv_ignores_missing_pyproject_metadata() -> Result<()> { - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r"[tool.no.project.here]" })?; @@ -769,7 +769,7 @@ fn create_venv_ignores_missing_pyproject_metadata() -> Result<()> { #[test] fn create_venv_warns_user_on_requires_python_discovery_error() -> Result<()> { - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! { r"invalid toml" })?; @@ -807,7 +807,7 @@ fn create_venv_warns_user_on_requires_python_discovery_error() -> Result<()> { #[test] fn create_venv_explicit_request_takes_priority_over_python_version_file() { - let context = TestContext::new_with_versions(&["3.11", "3.12"]); + let context = uv_test::test_context_with_versions!(&["3.11", "3.12"]); context .temp_dir @@ -833,7 +833,7 @@ fn create_venv_explicit_request_takes_priority_over_python_version_file() { #[test] #[cfg(feature = "test-pypi")] fn seed() { - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); uv_snapshot!(context.filters(), context.venv() .arg(context.venv.as_os_str()) .arg("--seed") @@ -857,7 +857,7 @@ fn seed() { #[test] #[cfg(feature = "test-pypi")] fn seed_older_python_version() { - let context = TestContext::new_with_versions(&["3.11"]); + let context = uv_test::test_context_with_versions!(&["3.11"]); uv_snapshot!(context.filters(), context.venv() .arg(context.venv.as_os_str()) .arg("--seed") @@ -882,7 +882,7 @@ fn seed_older_python_version() { #[test] fn create_venv_with_invalid_http_timeout() { - let context = TestContext::new_with_versions(&["3.12"]).with_http_timeout("not_a_number"); + let context = uv_test::test_context_with_versions!(&["3.12"]).with_http_timeout("not_a_number"); uv_snapshot!(context.filters(), context.venv() .arg(context.venv.as_os_str()) .arg("--python") @@ -898,7 +898,7 @@ fn create_venv_with_invalid_http_timeout() { #[test] fn create_venv_with_invalid_concurrent_installs() { - let context = TestContext::new_with_versions(&["3.12"]).with_concurrent_installs("0"); + let context = uv_test::test_context_with_versions!(&["3.12"]).with_concurrent_installs("0"); uv_snapshot!(context.filters(), context.venv() .arg(context.venv.as_os_str()) .arg("--python") @@ -914,7 +914,7 @@ fn create_venv_with_invalid_concurrent_installs() { #[test] fn create_venv_unknown_python_minor() { - let context = TestContext::new_with_versions(&["3.12"]).with_filtered_python_sources(); + let context = uv_test::test_context_with_versions!(&["3.12"]).with_filtered_python_sources(); let mut command = context.venv(); command @@ -940,7 +940,7 @@ fn create_venv_unknown_python_minor() { #[test] fn create_venv_unknown_python_patch() { - let context = TestContext::new_with_versions(&["3.12"]).with_filtered_python_sources(); + let context = uv_test::test_context_with_versions!(&["3.12"]).with_filtered_python_sources(); let mut command = context.venv(); command @@ -967,7 +967,7 @@ fn create_venv_unknown_python_patch() { #[cfg(feature = "test-python-patch")] #[test] fn create_venv_python_patch() { - let context = TestContext::new_with_versions(&["3.12.9"]); + let context = uv_test::test_context_with_versions!(&["3.12.9"]); uv_snapshot!(context.filters(), context.venv() .arg(context.venv.as_os_str()) @@ -989,7 +989,7 @@ fn create_venv_python_patch() { #[test] fn file_exists() -> Result<()> { - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); // Create a file at `.venv`. Creating a virtualenv at the same path should fail. context.venv.touch()?; @@ -1015,7 +1015,7 @@ fn file_exists() -> Result<()> { #[test] fn empty_dir_exists() -> Result<()> { - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); // Create an empty directory at `.venv`. Creating a virtualenv at the same path should succeed. context.venv.create_dir_all()?; @@ -1041,7 +1041,7 @@ fn empty_dir_exists() -> Result<()> { #[test] fn non_empty_dir_exists() -> Result<()> { - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); // Create a non-empty directory at `.venv`. Creating a virtualenv at the same path should fail, // unless `--clear` is specified. @@ -1086,7 +1086,7 @@ fn non_empty_dir_exists() -> Result<()> { #[test] fn non_empty_dir_exists_allow_existing() -> Result<()> { - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); // Create a non-empty directory at `.venv`. Creating a virtualenv at the same path should // succeed when `--allow-existing` is specified, but fail when it is not. @@ -1151,7 +1151,7 @@ fn non_empty_dir_exists_allow_existing() -> Result<()> { /// Run `uv venv` followed by `uv venv --allow-existing`. #[test] fn create_venv_then_allow_existing() { - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); // Create a venv uv_snapshot!(context.filters(), context.venv(), @" @@ -1184,7 +1184,7 @@ fn create_venv_then_allow_existing() { #[test] #[cfg(windows)] fn windows_shims() -> Result<()> { - let context = TestContext::new_with_versions(&["3.10", "3.9"]); + let context = uv_test::test_context_with_versions!(&["3.10", "3.9"]); let shim_path = context.temp_dir.child("shim"); let py39 = context @@ -1230,7 +1230,7 @@ fn windows_shims() -> Result<()> { #[test] fn verify_pyvenv_cfg() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyvenv_cfg = context.venv.child("pyvenv.cfg"); context.venv.assert(predicates::path::is_dir()); @@ -1249,7 +1249,7 @@ fn verify_pyvenv_cfg() { #[test] fn verify_pyvenv_cfg_relocatable() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a virtual environment at `.venv`. context @@ -1310,7 +1310,7 @@ fn verify_pyvenv_cfg_relocatable() { /// With `relocatable-envs-default` preview feature, venvs are relocatable by default. #[test] fn relocatable_envs_default_preview() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a virtual environment with the preview feature enabled. context @@ -1334,7 +1334,7 @@ fn relocatable_envs_default_preview() { /// With `relocatable-envs-default` preview feature, `--no-relocatable` opts out. #[test] fn relocatable_envs_default_no_relocatable() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create a virtual environment with the preview feature but opt out. context @@ -1359,7 +1359,7 @@ fn relocatable_envs_default_no_relocatable() { /// Ensure that a nested virtual environment uses the same `home` directory as the parent. #[test] fn verify_nested_pyvenv_cfg() -> Result<()> { - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); // Create a virtual environment at `.venv`. context @@ -1412,7 +1412,7 @@ fn verify_nested_pyvenv_cfg() -> Result<()> { #[test] #[cfg(windows)] fn path_with_trailing_space_gives_proper_error() { - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); // Set a custom cache directory with a trailing space let path_with_trailing_slash = format!("{} ", context.cache_dir.path().display()); @@ -1423,7 +1423,7 @@ fn path_with_trailing_space_gives_proper_error() { r"CACHEDIR.TAG`: .* \(os error 3\)", "CACHEDIR.TAG`: The system cannot find the path specified. (os error 3)", )); - uv_snapshot!(filters, std::process::Command::new(crate::common::get_bin()) + uv_snapshot!(filters, std::process::Command::new(uv_test::get_bin!()) .arg("venv") .env(EnvVars::UV_CACHE_DIR, path_with_trailing_slash), @r###" success: false @@ -1448,7 +1448,7 @@ fn create_venv_apostrophe() { use std::process::Command; use std::process::Stdio; - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); let venv_dir = context.temp_dir.join("Testing's"); @@ -1495,7 +1495,7 @@ fn create_venv_apostrophe() { #[test] fn venv_python_preference() { let context = - TestContext::new_with_versions(&["3.12", "3.11"]).with_versions_as_managed(&["3.12"]); + uv_test::test_context_with_versions!(&["3.12", "3.11"]).with_versions_as_managed(&["3.12"]); // Create a managed interpreter environment uv_snapshot!(context.filters(), context.venv(), @" @@ -1559,7 +1559,7 @@ fn venv_python_preference() { #[test] #[cfg(unix)] fn create_venv_symlink_clear_preservation() -> Result<()> { - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); // Create a target directory let target_dir = context.temp_dir.child("target"); @@ -1617,7 +1617,7 @@ fn create_venv_symlink_clear_preservation() -> Result<()> { #[test] #[cfg(unix)] fn create_venv_symlink_recreate_preservation() -> Result<()> { - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); // Create a target directory let target_dir = context.temp_dir.child("target"); @@ -1675,7 +1675,7 @@ fn create_venv_symlink_recreate_preservation() -> Result<()> { #[test] #[cfg(unix)] fn create_venv_nested_symlink_preservation() -> Result<()> { - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); // Create a target directory let target_dir = context.temp_dir.child("target"); @@ -1741,7 +1741,7 @@ fn create_venv_nested_symlink_preservation() -> Result<()> { #[test] #[cfg(unix)] fn create_venv_current_working_directory() { - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); uv_snapshot!(context.filters(), context.venv() .arg(context.venv.as_os_str()) @@ -1783,7 +1783,7 @@ fn create_venv_current_working_directory() { #[test] #[cfg(windows)] fn create_venv_current_working_directory() { - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); uv_snapshot!(context.filters(), context.venv() .arg(context.venv.as_os_str()) @@ -1821,7 +1821,7 @@ fn create_venv_current_working_directory() { #[test] fn no_clear_with_existing_directory() { - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); // Create a virtual environment first uv_snapshot!(context.filters(), context.venv() @@ -1862,7 +1862,7 @@ fn no_clear_with_existing_directory() { #[test] fn no_clear_with_non_existent_directory() { - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); // Create with --no-clear on non-existent directory (should succeed) uv_snapshot!(context.filters(), context.venv() @@ -1886,7 +1886,7 @@ fn no_clear_with_non_existent_directory() { #[test] fn no_clear_overrides_clear() { - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); // Create a non-empty directory at `.venv` context.venv.create_dir_all().unwrap(); @@ -1916,7 +1916,7 @@ fn no_clear_overrides_clear() { #[test] fn no_clear_conflicts_with_allow_existing() { - let context = TestContext::new_with_versions(&["3.12"]); + let context = uv_test::test_context_with_versions!(&["3.12"]); // Try to use --no-clear with --allow-existing (should fail) uv_snapshot!(context.filters(), context.venv() diff --git a/crates/uv/tests/it/version.rs b/crates/uv/tests/it/version.rs index 91a5d86d5..813e30481 100644 --- a/crates/uv/tests/it/version.rs +++ b/crates/uv/tests/it/version.rs @@ -4,13 +4,13 @@ use assert_fs::prelude::*; use indoc::indoc; use insta::assert_snapshot; -use crate::common::TestContext; -use crate::common::uv_snapshot; +use uv_test::TestContext; +use uv_test::uv_snapshot; // Print the version #[test] fn version_get() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -48,7 +48,7 @@ fn version_get() -> Result<()> { // Print the version (json format) #[test] fn version_get_json() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -91,7 +91,7 @@ fn version_get_json() -> Result<()> { // Print the version (--short) #[test] fn version_get_short() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -131,7 +131,7 @@ fn version_get_short() -> Result<()> { // Set the version #[test] fn version_set_value() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -173,7 +173,7 @@ requires-python = ">=3.12" // Set the version (--short) #[test] fn version_set_value_short() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -216,7 +216,7 @@ requires-python = ">=3.12" // Bump patch version #[test] fn version_bump_patch() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -256,7 +256,7 @@ requires-python = ">=3.12" #[test] fn version_bump_patch_value() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -296,7 +296,7 @@ requires-python = ">=3.12" #[test] fn version_bump_minor_value() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -336,7 +336,7 @@ requires-python = ">=3.12" #[test] fn version_bump_major_value() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -377,7 +377,7 @@ requires-python = ">=3.12" // Bump patch version (--short) #[test] fn version_bump_patch_short() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -418,7 +418,7 @@ requires-python = ">=3.12" #[test] fn version_bump_patch_value_must_increase() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -457,7 +457,7 @@ requires-python = ">=3.12" /// Preserve comments immediately preceding the version when bumping #[test] fn version_bump_preserves_preceding_comments() -> Result<()> { - let context: TestContext = TestContext::new("3.12"); + let context: TestContext = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -502,7 +502,7 @@ fn version_bump_preserves_preceding_comments() -> Result<()> { // Bump minor version #[test] fn version_bump_minor() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -543,7 +543,7 @@ requires-python = ">=3.12" // bump major version #[test] fn version_major_version() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -584,7 +584,7 @@ requires-python = ">=3.12" // Bump patch but the input version is missing a component #[test] fn version_patch_uncompleted() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -625,7 +625,7 @@ requires-python = ">=3.12" // Bump minor but the input version is missing a component #[test] fn version_minor_uncompleted() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -666,7 +666,7 @@ requires-python = ">=3.12" // Bump major but the input version is missing a component #[test] fn version_major_uncompleted() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -707,7 +707,7 @@ requires-python = ">=3.12" // Bump major but the input version is .dev #[test] fn version_major_dev() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -748,7 +748,7 @@ requires-python = ">=3.12" // Bump major but the input version is a complex mess #[test] fn version_major_complex_mess() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -792,7 +792,7 @@ requires-python = ">=3.12" // now it fails for a dozen reasons! #[test] fn many_bump_complex() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -838,7 +838,7 @@ requires-python = ">=3.12" // --bump stable #[test] fn bump_stable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -879,7 +879,7 @@ requires-python = ">=3.12" // --bump alpha #[test] fn bump_alpha() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -920,7 +920,7 @@ requires-python = ">=3.12" // --bump beta #[test] fn bump_beta() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -960,7 +960,7 @@ requires-python = ">=3.12" #[test] fn bump_beta_with_value_existing() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1000,7 +1000,7 @@ requires-python = ">=3.12" #[test] fn bump_beta_with_value_new() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1042,7 +1042,7 @@ requires-python = ">=3.12" // --bump rc #[test] fn bump_rc() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1083,7 +1083,7 @@ requires-python = ">=3.12" // --bump post #[test] fn bump_post() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1123,7 +1123,7 @@ requires-python = ">=3.12" #[test] fn bump_post_with_value_clears_dev() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1164,7 +1164,7 @@ requires-python = ">=3.12" // --bump dev #[test] fn bump_dev() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1204,7 +1204,7 @@ requires-python = ">=3.12" #[test] fn bump_dev_with_value() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1244,7 +1244,7 @@ requires-python = ">=3.12" #[test] fn bump_patch_and_dev_value() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1285,7 +1285,7 @@ requires-python = ">=3.12" #[test] fn bump_patch_and_dev_explicit_values_sorted() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1327,7 +1327,7 @@ requires-python = ">=3.12" // Bump major but the input version is .post #[test] fn version_major_post() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1367,7 +1367,7 @@ requires-python = ">=3.12" #[test] fn bump_stable_with_value_fails() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1393,7 +1393,7 @@ requires-python = ">=3.12" #[test] fn bump_empty_value_fails() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1419,7 +1419,7 @@ requires-python = ">=3.12" #[test] fn bump_invalid_numeric_value_fails() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1446,7 +1446,7 @@ requires-python = ">=3.12" // --bump stable but it decreases the version #[test] fn bump_decrease_stable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1473,7 +1473,7 @@ requires-python = ">=3.12" // --bump alpha but it decreases the version by reverting beta #[test] fn bump_decrease_alpha_beta() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1500,7 +1500,7 @@ requires-python = ">=3.12" // --bump alpha but it decreases the version from a stable #[test] fn bump_decrease_alpha_stable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1527,7 +1527,7 @@ requires-python = ">=3.12" // --bump dev but it decreases the version from a stable #[test] fn bump_decrease_dev_stable() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1554,7 +1554,7 @@ requires-python = ">=3.12" // --bump dev but it decreases the version from a pre-release #[test] fn bump_decrease_dev_prerelease() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1581,7 +1581,7 @@ requires-python = ">=3.12" // --bump major twice #[test] fn bump_double_major() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1609,7 +1609,7 @@ requires-python = ">=3.12" // --bump alpha twice #[test] fn bump_double_alpha() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1637,7 +1637,7 @@ requires-python = ">=3.12" // --bump stable --bump major #[test] fn bump_stable_major() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1665,7 +1665,7 @@ requires-python = ">=3.12" // --bump major --bump alpha #[test] fn bump_alpha_major() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1695,7 +1695,7 @@ requires-python = ">=3.12" // --bump major --bump minor #[test] fn bump_minor_major() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1725,7 +1725,7 @@ requires-python = ">=3.12" // --bump alpha --bump dev #[test] fn bump_alpha_dev() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1753,7 +1753,7 @@ requires-python = ">=3.12" // --bump major --bump dev #[test] fn bump_dev_major() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1783,7 +1783,7 @@ requires-python = ">=3.12" // --bump major --bump post #[test] fn bump_post_major() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1811,7 +1811,7 @@ requires-python = ">=3.12" // Set version --dry-run #[test] fn version_set_dry() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1851,7 +1851,7 @@ requires-python = ">=3.12" // Bump version --dry-run #[test] fn version_major_dry() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1891,7 +1891,7 @@ requires-python = ">=3.12" // Set version invalid #[test] fn version_set_invalid() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1930,7 +1930,7 @@ requires-python = ">=3.12" // forget --bump but pass a valid bump name #[test] fn version_missing_bump() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -1969,7 +1969,7 @@ requires-python = ">=3.12" // Dynamic version should error on read #[test] fn version_get_dynamic() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2007,7 +2007,7 @@ fn version_get_dynamic() -> Result<()> { // Dynamic version should error on write #[test] fn version_set_dynamic() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2047,7 +2047,7 @@ fn version_set_dynamic() -> Result<()> { /// (In this case, because tool.uv.managed = false) #[test] fn version_get_fallback_unmanaged() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2089,7 +2089,7 @@ fn version_get_fallback_unmanaged() -> Result<()> { // version_get_fallback with `--short` #[test] fn version_get_fallback_unmanaged_short() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2157,7 +2157,7 @@ fn git_version_info_expected() -> bool { // and --project was passed explicitly. #[test] fn version_get_fallback_unmanaged_strict() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2201,7 +2201,7 @@ fn version_get_fallback_unmanaged_strict() -> Result<()> { // and --project was passed explicitly. #[test] fn version_get_fallback_missing_strict() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.version() .arg("--project").arg("."), @" @@ -2219,7 +2219,7 @@ fn version_get_fallback_missing_strict() -> Result<()> { /// Should error with hint if pyproject.toml is missing in normal mode #[test] fn version_get_missing_with_hint() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.version(), @" success: false @@ -2239,7 +2239,7 @@ fn version_get_missing_with_hint() -> Result<()> { // (also setup a honeypot project and make sure it's not used) #[test] fn self_version() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2276,7 +2276,7 @@ fn self_version() -> Result<()> { // (also setup a honeypot project and make sure it's not used) #[test] fn self_version_short() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2322,7 +2322,7 @@ fn self_version_short() -> Result<()> { // (also setup a honeypot project and make sure it's not used) #[test] fn self_version_json() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2407,7 +2407,7 @@ fn self_version_json() -> Result<()> { // Ensure that the global `--project` option is respected. #[test] fn version_get_workspace() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2491,7 +2491,7 @@ fn version_get_workspace() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn version_set_workspace() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let workspace = context.temp_dir.child("pyproject.toml"); workspace.write_str(indoc! {r#" @@ -2833,7 +2833,7 @@ fn version_set_workspace() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn version_set_evil_constraints() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let workspace = context.temp_dir.child("pyproject.toml"); workspace.write_str(indoc! {r#" @@ -3077,7 +3077,7 @@ fn version_set_evil_constraints() -> Result<()> { #[test] fn virtual_empty() -> Result<()> { // testing how `uv version` reacts to a pyproject with no `[project]` and nothing useful to it - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -3141,7 +3141,7 @@ fn add_virtual_dependency_group() -> Result<()> { // testing basic `uv version` functionality // when the pyproject.toml is fully virtual (no `[project]`) // But at least has some dependency-group tables (shouldn't matter to this command) - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str(indoc! {r#" @@ -3210,7 +3210,7 @@ fn add_virtual_dependency_group() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn version_extras() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( diff --git a/crates/uv/tests/it/workflow.rs b/crates/uv/tests/it/workflow.rs index 2c506c8c5..e473e39a6 100644 --- a/crates/uv/tests/it/workflow.rs +++ b/crates/uv/tests/it/workflow.rs @@ -1,11 +1,11 @@ -use crate::common::{TestContext, diff_snapshot, uv_snapshot}; use anyhow::Result; use assert_fs::fixture::{FileWriteStr, PathChild}; use insta::assert_snapshot; +use uv_test::{diff_snapshot, uv_snapshot}; #[test] fn packse_add_remove_one_package() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context.copy_ecosystem_project("packse"); uv_snapshot!(context.filters(), context.lock(), @" @@ -213,7 +213,7 @@ fn packse_add_remove_one_package() { #[test] fn packse_add_remove_existing_package_noop() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context.copy_ecosystem_project("packse"); uv_snapshot!(context.filters(), context.lock(), @" @@ -249,7 +249,7 @@ fn packse_add_remove_existing_package_noop() { /// transitive dependency. #[test] fn packse_promote_transitive_to_direct_then_remove() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context.copy_ecosystem_project("packse"); uv_snapshot!(context.filters(), context.lock(), @" @@ -397,7 +397,7 @@ fn packse_promote_transitive_to_direct_then_remove() { #[test] fn jax_instability() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( r#" diff --git a/crates/uv/tests/it/workspace.rs b/crates/uv/tests/it/workspace.rs index 95199c511..da92f40ee 100644 --- a/crates/uv/tests/it/workspace.rs +++ b/crates/uv/tests/it/workspace.rs @@ -10,7 +10,7 @@ use indoc::indoc; use insta::{assert_json_snapshot, assert_snapshot}; use serde::{Deserialize, Serialize}; -use crate::common::{TestContext, copy_dir_ignore, make_project, uv_snapshot}; +use uv_test::{copy_dir_ignore, make_project, uv_snapshot}; fn workspaces_dir() -> PathBuf { env::current_dir() @@ -26,7 +26,7 @@ fn workspaces_dir() -> PathBuf { #[test] #[cfg(feature = "test-pypi")] fn test_albatross_in_examples_bird_feeder() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let workspace = context.temp_dir.child("workspace"); copy_dir_ignore(workspaces_dir(), &workspace).unwrap(); @@ -70,7 +70,7 @@ fn test_albatross_in_examples_bird_feeder() { #[test] #[cfg(feature = "test-pypi")] fn test_albatross_in_examples() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let workspace = context.temp_dir.child("workspace"); copy_dir_ignore(workspaces_dir(), &workspace).unwrap(); @@ -111,7 +111,7 @@ fn test_albatross_in_examples() { #[test] #[cfg(feature = "test-pypi")] fn test_albatross_just_project() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let workspace = context.temp_dir.child("workspace"); copy_dir_ignore(workspaces_dir(), &workspace).unwrap(); @@ -152,7 +152,7 @@ fn test_albatross_just_project() { #[test] #[cfg(feature = "test-pypi")] fn test_albatross_project_in_excluded() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let workspace = context.temp_dir.child("workspace"); copy_dir_ignore(workspaces_dir(), &workspace).unwrap(); @@ -228,7 +228,7 @@ fn test_albatross_project_in_excluded() { #[test] #[cfg(feature = "test-pypi")] fn test_albatross_root_workspace() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let workspace = context.temp_dir.child("workspace"); copy_dir_ignore(workspaces_dir(), &workspace).unwrap(); @@ -272,7 +272,7 @@ fn test_albatross_root_workspace() { #[test] #[cfg(feature = "test-pypi")] fn test_albatross_root_workspace_bird_feeder() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let workspace = context.temp_dir.child("workspace"); copy_dir_ignore(workspaces_dir(), &workspace).unwrap(); @@ -318,7 +318,7 @@ fn test_albatross_root_workspace_bird_feeder() { #[test] #[cfg(feature = "test-pypi")] fn test_albatross_root_workspace_albatross() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let workspace = context.temp_dir.child("workspace"); copy_dir_ignore(workspaces_dir(), &workspace).unwrap(); @@ -364,7 +364,7 @@ fn test_albatross_root_workspace_albatross() { #[test] #[cfg(feature = "test-pypi")] fn test_albatross_virtual_workspace() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let workspace = context.temp_dir.child("workspace"); copy_dir_ignore(workspaces_dir(), &workspace).unwrap(); @@ -412,7 +412,7 @@ fn test_albatross_virtual_workspace() { #[test] #[cfg(feature = "test-pypi")] fn test_uv_run_with_package_virtual_workspace() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let work_dir = context.temp_dir.join("albatross-virtual-workspace"); copy_dir_ignore( @@ -482,7 +482,7 @@ fn test_uv_run_with_package_virtual_workspace() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn test_uv_run_virtual_workspace_root() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let work_dir = context.temp_dir.join("albatross-virtual-workspace"); copy_dir_ignore( @@ -523,7 +523,7 @@ fn test_uv_run_virtual_workspace_root() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn test_uv_run_with_package_root_workspace() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let work_dir = context.temp_dir.join("albatross-root-workspace"); copy_dir_ignore(workspaces_dir().join("albatross-root-workspace"), &work_dir)?; @@ -586,7 +586,7 @@ fn test_uv_run_with_package_root_workspace() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn test_uv_run_isolate() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let work_dir = context.temp_dir.join("albatross-root-workspace"); copy_dir_ignore(workspaces_dir().join("albatross-root-workspace"), &work_dir)?; @@ -682,7 +682,7 @@ fn workspace_lock_idempotence(workspace: &str, subdirectories: &[&str]) -> Resul let mut shared_lock = None; for dir in subdirectories { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let work_dir = context.temp_dir.join(workspace); copy_dir_ignore(workspaces_dir().join(workspace), &work_dir)?; @@ -759,7 +759,7 @@ struct Package { /// `e`. We have `a -> b`, `b -> c`, `c -> d`. `e` should not be installed. #[test] fn workspace_to_workspace_paths_dependencies() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Build the main workspace ... let main_workspace = context.temp_dir.child("main-workspace"); @@ -855,7 +855,7 @@ fn workspace_to_workspace_paths_dependencies() -> Result<()> { /// Ensure that workspace discovery skips an empty directory that matches a member glob. #[test] fn workspace_empty_member() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Build the main workspace ... let workspace = context.temp_dir.child("workspace"); @@ -1083,7 +1083,7 @@ fn workspace_nonempty_member_no_pyproject() -> Result<()> { /// Ensure that workspace discovery ignores hidden directories. #[test] fn workspace_hidden_files() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Build the main workspace ... let workspace = context.temp_dir.child("workspace"); @@ -1139,7 +1139,7 @@ fn workspace_hidden_files() -> Result<()> { /// Ensure that workspace discovery accepts valid hidden directories. #[test] fn workspace_hidden_member() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Build the main workspace ... let workspace = context.temp_dir.child("workspace"); @@ -1205,7 +1205,7 @@ fn workspace_hidden_member() -> Result<()> { /// Ensure that workspace discovery accepts valid hidden directories. #[test] fn workspace_non_included_member() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Build the main workspace ... let workspace = context.temp_dir.child("workspace"); @@ -1268,7 +1268,7 @@ fn workspace_non_included_member() -> Result<()> { /// relative to the member. #[test] fn workspace_inherit_sources() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create the workspace root. let workspace = context.temp_dir.child("workspace"); @@ -1502,7 +1502,7 @@ fn workspace_inherit_sources() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn workspace_unsatisfiable_member_dependencies() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create the workspace root. let workspace = context.temp_dir.child("workspace"); @@ -1558,7 +1558,7 @@ fn workspace_unsatisfiable_member_dependencies() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn workspace_unsatisfiable_member_dependencies_conflicting() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create the workspace root. let workspace = context.temp_dir.child("workspace"); @@ -1626,7 +1626,7 @@ fn workspace_unsatisfiable_member_dependencies_conflicting() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn workspace_unsatisfiable_member_dependencies_conflicting_threeway() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create the workspace root. let workspace = context.temp_dir.child("workspace"); @@ -1709,7 +1709,7 @@ fn workspace_unsatisfiable_member_dependencies_conflicting_threeway() -> Result< #[test] #[cfg(feature = "test-pypi")] fn workspace_unsatisfiable_member_dependencies_conflicting_extra() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create the workspace root. let workspace = context.temp_dir.child("workspace"); @@ -1779,7 +1779,7 @@ fn workspace_unsatisfiable_member_dependencies_conflicting_extra() -> Result<()> #[test] #[cfg(feature = "test-pypi")] fn workspace_unsatisfiable_member_dependencies_conflicting_dev() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create the workspace root. let workspace = context.temp_dir.child("workspace"); @@ -1850,7 +1850,7 @@ fn workspace_unsatisfiable_member_dependencies_conflicting_dev() -> Result<()> { #[test] #[cfg(feature = "test-pypi")] fn workspace_member_name_shadows_dependencies() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Create the workspace root. let workspace = context.temp_dir.child("workspace"); @@ -1922,7 +1922,7 @@ fn workspace_member_name_shadows_dependencies() -> Result<()> { /// the paths don't line up by accident. #[test] fn test_path_hopping() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Build the main project ... let deps = indoc! {r#" @@ -1980,7 +1980,7 @@ fn test_path_hopping() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn transitive_dep_in_git_workspace_no_root() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2055,7 +2055,7 @@ fn transitive_dep_in_git_workspace_no_root() -> Result<()> { #[test] #[cfg(feature = "test-git")] fn transitive_dep_in_git_workspace_with_root() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let pyproject_toml = context.temp_dir.child("pyproject.toml"); pyproject_toml.write_str( @@ -2120,7 +2120,7 @@ fn transitive_dep_in_git_workspace_with_root() -> Result<()> { #[test] fn workspace_members_with_leading_dot_slash() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Build the main workspace with leading `./` in member paths let workspace = context.temp_dir.child("workspace"); @@ -2190,7 +2190,7 @@ fn workspace_members_with_leading_dot_slash() -> Result<()> { #[test] fn workspace_members_with_parent_directory() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Build a workspace with a member outside its directory using `../` let workspace = context.temp_dir.child("workspace"); @@ -2235,7 +2235,7 @@ fn workspace_members_with_parent_directory() -> Result<()> { #[test] fn workspace_members_with_complex_relative_paths() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Build a workspace with complex relative path normalization let workspace = context.temp_dir.child("workspace"); diff --git a/crates/uv/tests/it/workspace_dir.rs b/crates/uv/tests/it/workspace_dir.rs index a85933cae..d064f7d16 100644 --- a/crates/uv/tests/it/workspace_dir.rs +++ b/crates/uv/tests/it/workspace_dir.rs @@ -2,12 +2,12 @@ use anyhow::Result; use assert_cmd::assert::OutputAssertExt; use assert_fs::fixture::PathChild; -use crate::common::{TestContext, copy_dir_ignore, uv_snapshot}; +use uv_test::{copy_dir_ignore, uv_snapshot}; /// Test basic output for a simple workspace with one member. #[test] fn workspace_dir_simple() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Initialize a workspace with one member context.init().arg("foo").assert().success(); @@ -29,7 +29,7 @@ fn workspace_dir_simple() { /// Workspace dir output when run with `--package`. #[test] fn workspace_dir_specific_package() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context.init().arg("foo").assert().success(); context.init().arg("foo/bar").assert().success(); let workspace = context.temp_dir.child("foo"); @@ -62,7 +62,7 @@ fn workspace_dir_specific_package() { /// Test output when run from a workspace member directory. #[test] fn workspace_metadata_from_member() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let workspace = context.temp_dir.child("workspace"); let albatross_workspace = context @@ -90,7 +90,7 @@ fn workspace_metadata_from_member() -> Result<()> { /// Test workspace dir error output for a non-existent package. #[test] fn workspace_dir_package_doesnt_exist() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Initialize a workspace with one member context.init().arg("foo").assert().success(); @@ -111,7 +111,7 @@ fn workspace_dir_package_doesnt_exist() { /// Test workspace dir error output when not in a project. #[test] fn workspace_metadata_no_project() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.workspace_dir(), @r" success: false diff --git a/crates/uv/tests/it/workspace_list.rs b/crates/uv/tests/it/workspace_list.rs index b941a1e51..6aede5adb 100644 --- a/crates/uv/tests/it/workspace_list.rs +++ b/crates/uv/tests/it/workspace_list.rs @@ -2,12 +2,12 @@ use anyhow::Result; use assert_cmd::assert::OutputAssertExt; use assert_fs::fixture::PathChild; -use crate::common::{TestContext, copy_dir_ignore, uv_snapshot}; +use uv_test::{copy_dir_ignore, uv_snapshot}; /// Test basic list output for a simple workspace with one member. #[test] fn workspace_list_simple() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Initialize a workspace with one member context.init().arg("foo").assert().success(); @@ -40,7 +40,7 @@ fn workspace_list_simple() { /// Test list output for a root workspace (workspace with a root package). #[test] fn workspace_list_root_workspace() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let workspace = context.temp_dir.child("workspace"); copy_dir_ignore( @@ -69,7 +69,7 @@ fn workspace_list_root_workspace() -> Result<()> { /// Test list output for a virtual workspace (no root package). #[test] fn workspace_list_virtual_workspace() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let workspace = context.temp_dir.child("workspace"); copy_dir_ignore( @@ -98,7 +98,7 @@ fn workspace_list_virtual_workspace() -> Result<()> { /// Test list output when run from a workspace member directory. #[test] fn workspace_list_from_member() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let workspace = context.temp_dir.child("workspace"); copy_dir_ignore( @@ -129,7 +129,7 @@ fn workspace_list_from_member() -> Result<()> { /// Test list output for a workspace with multiple packages. #[test] fn workspace_list_multiple_members() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Initialize workspace root context.init().arg("pkg-a").assert().success(); @@ -181,7 +181,7 @@ fn workspace_list_multiple_members() { /// Test list output for a single project (not a workspace). #[test] fn workspace_list_single_project() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context.init().arg("my-project").assert().success(); @@ -202,7 +202,7 @@ fn workspace_list_single_project() { /// Test list output with excluded packages. #[test] fn workspace_list_with_excluded() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let workspace = context.temp_dir.child("workspace"); copy_dir_ignore( @@ -229,7 +229,7 @@ fn workspace_list_with_excluded() -> Result<()> { /// Test list error output when not in a project. #[test] fn workspace_list_no_project() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.workspace_list(), @r" success: false diff --git a/crates/uv/tests/it/workspace_metadata.rs b/crates/uv/tests/it/workspace_metadata.rs index 0cc5b9faf..db1d79d7c 100644 --- a/crates/uv/tests/it/workspace_metadata.rs +++ b/crates/uv/tests/it/workspace_metadata.rs @@ -2,12 +2,12 @@ use anyhow::Result; use assert_cmd::assert::OutputAssertExt; use assert_fs::fixture::PathChild; -use crate::common::{TestContext, copy_dir_ignore, uv_snapshot}; +use uv_test::{copy_dir_ignore, uv_snapshot}; /// Test basic metadata output for a simple workspace with one member. #[test] fn workspace_metadata_simple() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Initialize a workspace with one member context.init().arg("foo").assert().success(); @@ -40,7 +40,7 @@ fn workspace_metadata_simple() { /// Test metadata for a root workspace (workspace with a root package). #[test] fn workspace_metadata_root_workspace() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let workspace = context.temp_dir.child("workspace"); copy_dir_ignore( @@ -86,7 +86,7 @@ fn workspace_metadata_root_workspace() -> Result<()> { /// Test metadata for a virtual workspace (no root package). #[test] fn workspace_metadata_virtual_workspace() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let workspace = context.temp_dir.child("workspace"); copy_dir_ignore( @@ -132,7 +132,7 @@ fn workspace_metadata_virtual_workspace() -> Result<()> { /// Test metadata when run from a workspace member directory. #[test] fn workspace_metadata_from_member() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let workspace = context.temp_dir.child("workspace"); copy_dir_ignore( @@ -180,7 +180,7 @@ fn workspace_metadata_from_member() -> Result<()> { /// Test metadata for a workspace with multiple packages. #[test] fn workspace_metadata_multiple_members() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); // Initialize workspace root context.init().arg("pkg-a").assert().success(); @@ -236,7 +236,7 @@ fn workspace_metadata_multiple_members() { /// Test metadata for a single project (not a workspace). #[test] fn workspace_metadata_single_project() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); context.init().arg("my-project").assert().success(); @@ -268,7 +268,7 @@ fn workspace_metadata_single_project() { /// Test metadata with excluded packages. #[test] fn workspace_metadata_with_excluded() -> Result<()> { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); let workspace = context.temp_dir.child("workspace"); copy_dir_ignore( @@ -306,7 +306,7 @@ fn workspace_metadata_with_excluded() -> Result<()> { /// Test metadata error when not in a project. #[test] fn workspace_metadata_no_project() { - let context = TestContext::new("3.12"); + let context = uv_test::test_context!("3.12"); uv_snapshot!(context.filters(), context.workspace_metadata(), @" success: false diff --git a/scripts/scenarios/templates/compile.mustache b/scripts/scenarios/templates/compile.mustache index 20be5f85f..ede4bd53b 100644 --- a/scripts/scenarios/templates/compile.mustache +++ b/scripts/scenarios/templates/compile.mustache @@ -15,7 +15,7 @@ use predicates::prelude::predicate; use uv_static::EnvVars; -use crate::common::{ +use uv_test::{ TestContext, build_vendor_links_url, get_bin, packse_index_url, python_path_with_versions, uv_snapshot, }; @@ -55,7 +55,7 @@ fn command(context: &TestContext, python_versions: &[&str]) -> Command { {{/python_patch}} #[test] fn {{module_name}}() -> Result<()> { - let context = TestContext::new("{{environment.python}}"); + let context = uv_test::test_context!("{{environment.python}}"); let python_versions = &[{{#environment.additional_python}}"{{.}}", {{/environment.additional_python}}]; // In addition to the standard filters, swap out package names for shorter messages diff --git a/scripts/scenarios/templates/install.mustache b/scripts/scenarios/templates/install.mustache index 249f82065..a98bfb90a 100644 --- a/scripts/scenarios/templates/install.mustache +++ b/scripts/scenarios/templates/install.mustache @@ -9,7 +9,7 @@ use std::process::Command; use uv_static::EnvVars; -use crate::common::{TestContext, build_vendor_links_url, packse_index_url, uv_snapshot}; +use uv_test::{TestContext, build_vendor_links_url, packse_index_url, uv_snapshot}; /// Create a `pip install` command with options shared across all scenarios. fn command(context: &TestContext) -> Command { @@ -38,7 +38,7 @@ fn command(context: &TestContext) -> Command { {{/python_patch}} #[test] fn {{module_name}}() { - let context = TestContext::new("{{environment.python}}"); + let context = uv_test::test_context!("{{environment.python}}"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters(); diff --git a/scripts/scenarios/templates/lock.mustache b/scripts/scenarios/templates/lock.mustache index 67cc3738b..e77d20210 100644 --- a/scripts/scenarios/templates/lock.mustache +++ b/scripts/scenarios/templates/lock.mustache @@ -15,7 +15,7 @@ use insta::assert_snapshot; use uv_static::EnvVars; -use crate::common::{TestContext, packse_index_url, uv_snapshot}; +use uv_test::{packse_index_url, uv_snapshot}; {{#scenarios}} @@ -29,7 +29,7 @@ use crate::common::{TestContext, packse_index_url, uv_snapshot}; /// ``` #[test] fn {{module_name}}() -> Result<()> { - let context = TestContext::new("{{environment.python}}"); + let context = uv_test::test_context!("{{environment.python}}"); // In addition to the standard filters, swap out package names for shorter messages let mut filters = context.filters();