Add tests for uv_pep508::verbatim_url::expand_env_vars (#18676)

## Summary

I noticed a gap in testing while working in this area so I added some
unit tests for `expand_env_vars`.

## Test Plan

N/A (tests don't need tests)
This commit is contained in:
Tomasz Kramkowski
2026-03-23 18:01:10 +00:00
committed by GitHub
parent 2175e2ffba
commit c43c0d0e8b
4 changed files with 76 additions and 2 deletions
Generated
+1
View File
@@ -6717,6 +6717,7 @@ dependencies = [
"serde",
"serde_json",
"smallvec",
"temp-env",
"thiserror 2.0.18",
"tracing",
"tracing-test",
+1
View File
@@ -34,6 +34,7 @@ rustc-hash = { workspace = true }
schemars = { workspace = true, optional = true }
serde = { workspace = true, features = ["derive", "rc"] }
smallvec = { workspace = true }
temp-env = { workspace = true }
thiserror = { workspace = true }
tracing = { workspace = true, optional = true }
unicode-width = { workspace = true }
+1 -2
View File
@@ -1084,7 +1084,6 @@ impl<T: Pep508Url + Display, D: rkyv::rancor::Fallible + ?Sized>
mod tests {
//! Half of these tests are copied from <https://github.com/pypa/packaging/pull/624>
use std::env;
use std::str::FromStr;
use insta::assert_snapshot;
@@ -1822,7 +1821,7 @@ mod tests {
"foo @ file:foo-3.0.0-py3-none-any.whl",
"foo @ ./foo-3.0.0-py3-none-any.whl",
];
let cwd = env::current_dir().unwrap();
let cwd = std::env::current_dir().unwrap();
for requirement in requirements {
assert_eq!(
+73
View File
@@ -791,4 +791,77 @@ mod tests {
@"ambiguous user/pass authority in URL (not percent-encoded?): https:***@domain/a/b/c"
);
}
#[test]
fn env_vars() {
temp_env::with_vars(
[
("FOO", None),
("BAR", Some("bar")),
("BAZ", Some("baz")),
("Not-Valid", Some("Not-Valid")),
("TEST_1", Some("Test 1")),
("PROJECT_ROOT", None),
],
|| {
// Basic
assert_eq!(expand_env_vars(""), Cow::Borrowed(""));
assert_eq!(expand_env_vars("test"), Cow::Borrowed("test"));
assert_eq!(expand_env_vars("$"), Cow::Borrowed("$"));
// Invalid
assert_eq!(expand_env_vars("$FOO"), Cow::Borrowed("$FOO"));
assert_eq!(expand_env_vars("$BAR"), Cow::Borrowed("$BAR"));
assert_eq!(expand_env_vars("${BAR"), Cow::Borrowed("${BAR"));
assert_eq!(expand_env_vars("$BAR}"), Cow::Borrowed("$BAR}"));
assert_eq!(expand_env_vars("${ BAR }"), Cow::Borrowed("${ BAR }"));
assert_eq!(
expand_env_vars("${Not-Valid}"),
Cow::Borrowed("${Not-Valid}")
);
assert_eq!(expand_env_vars("${}"), Cow::Borrowed("${}"));
// Missing
assert_eq!(expand_env_vars("${FOO}"), "${FOO}");
// Case sensitive
assert_eq!(expand_env_vars("${bar}"), "${bar}");
// One variable referenced
assert_eq!(expand_env_vars("${BAR}"), "bar");
assert_eq!(expand_env_vars("foo ${BAR}"), "foo bar");
assert_eq!(expand_env_vars("foo ${BAR} baz"), "foo bar baz");
assert_eq!(expand_env_vars("foo ${BAR} baz ${BAR}"), "foo bar baz bar");
// Two variables referenced
assert_eq!(expand_env_vars("${FOO} ${BAR} ${BAZ}"), "${FOO} bar baz");
assert_eq!(expand_env_vars("<${BAR}-${BAZ}>"), "<bar-baz>");
assert_eq!(
expand_env_vars("${FOO}${BAR}${BAZ}${FOO}${BAR}${BAZ}"),
"${FOO}barbaz${FOO}barbaz"
);
// Weird
assert_eq!(expand_env_vars("${${TEST_1}}"), "${Test 1}");
// PROJECT_ROOT
let cwd = std::env::current_dir().unwrap();
let cwd = cwd.to_string_lossy();
assert_eq!(
expand_env_vars("${PROJECT_ROOT}/file"),
format!("{cwd}/file")
);
assert_eq!(
expand_env_vars("$PROJECT_ROOT/file.txt"),
Cow::Borrowed("$PROJECT_ROOT/file.txt")
);
assert_eq!(
expand_env_vars("${FOO} ${BAR} ${PROJECT_ROOT} ${BAZ}"),
format!("${{FOO}} bar {cwd} baz")
);
},
);
}
}