From 5c077fe3c6dca4069bf3186446860e07b4faf0a0 Mon Sep 17 00:00:00 2001 From: alexion Date: Thu, 17 Sep 2026 09:54:13 -0400 Subject: [PATCH] refactor(monorepo): simplify workspace path tests --- src/monorepo/workspace_test.rs | 100 +++++++++++++++------------------ 1 file changed, 46 insertions(+), 54 deletions(-) diff --git a/src/monorepo/workspace_test.rs b/src/monorepo/workspace_test.rs index d1b6462..1be75f0 100644 --- a/src/monorepo/workspace_test.rs +++ b/src/monorepo/workspace_test.rs @@ -1,43 +1,19 @@ use std::ffi::OsString; use std::path::PathBuf; -use std::sync::Mutex; use monorepo::workspace::resolve_workspace_path; -static ENV_LOCK: Mutex<()> = Mutex::new(()); - const BUILD_WORKSPACE_DIRECTORY: &str = "BUILD_WORKSPACE_DIRECTORY"; struct EnvRestore { - key: &'static str, value: Option, } impl EnvRestore { - fn set(key: &'static str, value: &str) -> Self { - let restore = Self { - key, - value: std::env::var_os(key), - }; - - unsafe { - std::env::set_var(key, value); + fn capture() -> Self { + Self { + value: std::env::var_os(BUILD_WORKSPACE_DIRECTORY), } - - restore - } - - fn remove(key: &'static str) -> Self { - let restore = Self { - key, - value: std::env::var_os(key), - }; - - unsafe { - std::env::remove_var(key); - } - - restore } } @@ -45,42 +21,58 @@ impl Drop for EnvRestore { fn drop(&mut self) { unsafe { if let Some(value) = &self.value { - std::env::set_var(self.key, value); + std::env::set_var(BUILD_WORKSPACE_DIRECTORY, value); } else { - std::env::remove_var(self.key); + std::env::remove_var(BUILD_WORKSPACE_DIRECTORY); } } } } -#[test] -fn absolute_path_returns_unchanged_path() { - let _lock = ENV_LOCK.lock().unwrap(); - let _workspace = EnvRestore::set(BUILD_WORKSPACE_DIRECTORY, "/workspace"); - let path = PathBuf::from("/tmp/output"); - - let resolved = resolve_workspace_path(path.clone()); - - assert_eq!(resolved, path); +#[derive(Debug)] +struct Case { + name: &'static str, + workspace: Option<&'static str>, + path: &'static str, + expected: &'static str, } #[test] -fn relative_path_joins_workspace_path() { - let _lock = ENV_LOCK.lock().unwrap(); - let _workspace = EnvRestore::set(BUILD_WORKSPACE_DIRECTORY, "/workspace"); +fn resolve_workspace_path_cases() { + let _restore = EnvRestore::capture(); - let resolved = resolve_workspace_path(PathBuf::from("output/graph")); + let cases = [ + Case { + name: "absolute path returns unchanged path", + workspace: Some("/workspace"), + path: "/tmp/output", + expected: "/tmp/output", + }, + Case { + name: "relative path joins workspace path", + workspace: Some("/workspace"), + path: "output/graph", + expected: "/workspace/output/graph", + }, + Case { + name: "relative path without workspace returns unchanged path", + workspace: None, + path: "output/graph", + expected: "output/graph", + }, + ]; - assert_eq!(resolved, PathBuf::from("/workspace/output/graph")); -} - -#[test] -fn relative_path_without_workspace_returns_unchanged_path() { - let _lock = ENV_LOCK.lock().unwrap(); - let _workspace = EnvRestore::remove(BUILD_WORKSPACE_DIRECTORY); - let path = PathBuf::from("output/graph"); - - let resolved = resolve_workspace_path(path.clone()); - - assert_eq!(resolved, path); + for case in cases { + unsafe { + if let Some(workspace) = case.workspace { + std::env::set_var(BUILD_WORKSPACE_DIRECTORY, workspace); + } else { + std::env::remove_var(BUILD_WORKSPACE_DIRECTORY); + } + } + + let resolved = resolve_workspace_path(PathBuf::from(case.path)); + + assert_eq!(resolved, PathBuf::from(case.expected), "{}", case.name); + } }