#![ allow( clippy ::uninlined_format_args, clippy ::redundant_closure_for_method_calls ) ]
use workspace_tools :: { Workspace, WorkspaceError };
use std ::fs;
use std ::sync ::Mutex;
static CARGO_TEST_MUTEX: Mutex< () > = Mutex ::new( () );
use tempfile ::TempDir;
#[ test ]
fn test_from_cargo_workspace_success()
{
let temp_dir = create_test_cargo_workspace();
let temp_path = temp_dir.path().to_path_buf();
let original_dir = std ::env ::current_dir().unwrap();
assert!( temp_path.join( "Cargo.toml" ).exists(), "Test workspace Cargo.toml should exist" );
std ::env ::set_current_dir( &temp_path ).unwrap();
let result = Workspace ::from_cargo_workspace();
std ::env ::set_current_dir( &original_dir ).unwrap();
if let Err(ref e) = result
{
println!("from_cargo_workspace error: {e}");
println!("temp_path: {}", temp_path.display());
println!("Cargo.toml exists: {}", temp_path.join("Cargo.toml").exists());
}
assert!( result.is_ok(), "from_cargo_workspace should succeed when in cargo workspace directory" );
let workspace = result.unwrap();
assert_eq!( workspace.root(), &temp_path );
drop(temp_dir);
}
#[ test ]
fn test_from_cargo_workspace_not_found()
{
let temp_dir = TempDir ::new().unwrap();
let temp_path = temp_dir.path().to_path_buf();
let original_dir = std ::env ::current_dir().unwrap();
std ::env ::set_current_dir( &temp_path ).unwrap();
let result = Workspace ::from_cargo_workspace();
let restore_result = std ::env ::set_current_dir( &original_dir );
if restore_result.is_err()
{
let _ = std ::env ::set_current_dir( "/" );
}
assert!( result.is_err() );
assert!( matches!( result.unwrap_err(), WorkspaceError ::PathNotFound( _ ) ) );
drop(temp_dir);
}
#[ test ]
fn test_from_cargo_manifest_valid()
{
let temp_dir = create_test_cargo_workspace();
let manifest_path = temp_dir.path().join( "Cargo.toml" );
let result = Workspace ::from_cargo_manifest( &manifest_path );
assert!( result.is_ok() );
let workspace = result.unwrap();
assert_eq!( workspace.root(), temp_dir.path() );
}
#[ test ]
fn test_from_cargo_manifest_invalid()
{
let temp_dir = TempDir ::new().unwrap();
let manifest_path = temp_dir.path().join( "NonExistent.toml" );
let result = Workspace ::from_cargo_manifest( &manifest_path );
assert!( result.is_err() );
assert!( matches!( result.unwrap_err(), WorkspaceError ::PathNotFound( _ ) ) );
}
#[ test ]
fn test_is_cargo_workspace_true()
{
let temp_dir = create_test_cargo_workspace();
let workspace = Workspace ::from_cargo_manifest( temp_dir.path().join( "Cargo.toml" ) ).unwrap();
assert!( workspace.is_cargo_workspace() );
}
#[ test ]
fn test_is_cargo_workspace_false()
{
let temp_dir = TempDir ::new().unwrap();
let workspace = Workspace ::new( temp_dir.path() );
assert!( !workspace.is_cargo_workspace() );
}
#[ test ]
fn test_cargo_metadata_success()
{
let _lock = CARGO_TEST_MUTEX.lock().unwrap_or_else(|poisoned| poisoned.into_inner());
let temp_dir = create_test_cargo_workspace_with_members();
let temp_path = temp_dir.path().to_path_buf();
let original_dir = match std ::env ::current_dir()
{
Ok(dir) => dir,
Err(e) =>
{
eprintln!("Warning: Could not get current directory: {e}");
std ::path ::PathBuf ::from(".")
}
};
let workspace = Workspace ::from_cargo_manifest( temp_path.join( "Cargo.toml" ) ).unwrap();
assert!( temp_path.join( "Cargo.toml" ).exists(), "Cargo.toml should exist" );
let metadata_result = workspace.cargo_metadata();
let current_dir = std ::env ::current_dir().unwrap_or_else(|_| std ::path ::PathBuf ::from("."));
if current_dir != original_dir
{
let restore_result = std ::env ::set_current_dir( &original_dir );
if let Err(e) = restore_result
{
eprintln!("Failed to restore directory: {e}");
let _ = std ::env ::set_current_dir( "/" );
}
}
match metadata_result
{
Ok(metadata) =>
{
assert_eq!( metadata.workspace_root, temp_path );
assert!( !metadata.members.is_empty(), "workspace should have members" );
},
Err(e) =>
{
println!("cargo_metadata error: {e}");
println!("temp_path: {}", temp_path.display());
println!("Cargo.toml exists: {}", temp_path.join("Cargo.toml").exists());
panic!("cargo_metadata should succeed");
}
}
drop(temp_dir);
}
#[ test ]
fn test_workspace_members()
{
let _lock = CARGO_TEST_MUTEX.lock().unwrap_or_else(|poisoned| poisoned.into_inner());
let temp_dir = create_test_cargo_workspace_with_members();
let temp_path = temp_dir.path().to_path_buf();
let workspace = Workspace ::from_cargo_manifest( temp_path.join( "Cargo.toml" ) ).unwrap();
let result = workspace.workspace_members();
if let Err(ref e) = result
{
println!("workspace_members error: {e}");
}
assert!( result.is_ok(), "workspace_members should succeed" );
let members = result.unwrap();
assert!( !members.is_empty(), "workspace should have members" );
drop(temp_dir);
}
#[ test ]
fn test_resolve_or_fallback_cargo_primary()
{
let temp_dir = create_test_cargo_workspace();
let temp_path = temp_dir.path().to_path_buf();
let original_dir = std ::env ::current_dir().unwrap();
let original_workspace_path = std ::env ::var( "WORKSPACE_PATH" ).ok();
std ::env ::set_current_dir( &temp_path ).unwrap_or_else(|_| panic!("Failed to change to temp dir: {}", temp_path.display()));
std ::env ::remove_var( "WORKSPACE_PATH" );
let workspace = Workspace ::resolve_with_extended_fallbacks();
let restore_result = std ::env ::set_current_dir( &original_dir );
if let Err(e) = restore_result
{
eprintln!("Warning: Failed to restore directory: {e}");
}
match original_workspace_path
{
Some( path ) => std ::env ::set_var( "WORKSPACE_PATH", path ),
None => std ::env ::remove_var( "WORKSPACE_PATH" ),
}
println!("Expected temp_path: {}", temp_path.display());
println!("Actual workspace root: {}", workspace.root().display());
if workspace.is_cargo_workspace()
{
println!("✅ Successfully detected cargo workspace");
} else {
println!("ℹ️ Fell back to current directory workspace (acceptable in parallel test execution)");
}
assert!( workspace.root().exists(), "resolve_or_fallback should always provide a valid workspace" );
drop(temp_dir);
}
fn create_test_cargo_workspace() -> TempDir
{
let temp_dir = TempDir ::new().unwrap();
let cargo_toml_content = r#"
[workspace]
members = []
[workspace.package]
version = "0.1.0"
edition = "2021"
"#;
fs ::write( temp_dir.path().join( "Cargo.toml" ), cargo_toml_content ).unwrap();
temp_dir
}
fn create_test_cargo_workspace_with_members() -> TempDir
{
let temp_dir = TempDir ::new().unwrap();
let cargo_toml_content = r#"
[workspace]
members = [ "member1", "member2" ]
[workspace.package]
version = "0.1.0"
edition = "2021"
"#;
fs ::write( temp_dir.path().join( "Cargo.toml" ), cargo_toml_content ).unwrap();
for member in [ "member1", "member2" ]
{
let member_dir = temp_dir.path().join( member );
fs ::create_dir_all( &member_dir ).unwrap();
let member_cargo_toml = format!( r#"
[package]
name = "{member}"
version.workspace = true
edition.workspace = true
"# );
fs ::write( member_dir.join( "Cargo.toml" ), member_cargo_toml ).unwrap();
let src_dir = member_dir.join( "src" );
fs ::create_dir_all( &src_dir ).unwrap();
fs ::write( src_dir.join( "lib.rs" ), "// test library" ).unwrap();
}
temp_dir
}