use std::fs;
use std::path::PathBuf;
use tempfile::TempDir;
use anyhow::Result;
fn setup_test_project() -> Result<(TempDir, PathBuf)> {
let temp_dir = TempDir::new()?;
let project_dir = temp_dir.path().join("test_project");
fs::create_dir_all(&project_dir)?;
fs::create_dir_all(project_dir.join("src"))?;
let cargo_content = r#"[package]
name = "test_project"
version = "0.1.0"
edition = "2021"
[dependencies]
"#;
fs::write(project_dir.join("Cargo.toml"), cargo_content)?;
let main_content = r#"fn main() {
// Empty main function for testing
}
"#;
fs::write(project_dir.join("src").join("main.rs"), main_content)?;
Ok((temp_dir, project_dir))
}
#[test]
fn test_error_handling_in_utils() -> Result<()> {
let (_temp_dir, project_dir) = setup_test_project()?;
fs::remove_file(project_dir.join("Cargo.toml"))?;
let result = ferrisup_common::cargo::read_cargo_toml(&project_dir);
assert!(result.is_err());
let error = result.unwrap_err().to_string();
assert!(error.contains("Cargo.toml not found"),
"Error should mention 'Cargo.toml not found'");
Ok(())
}
#[test]
#[ignore = "Skipping due to interactive prompts that aren't properly handled by test mode"]
fn test_error_handling_with_nonexistent_directory() {
let non_existent_dir = PathBuf::from("/non/existent/path");
let result = ferrisup_common::fs::create_directory(&non_existent_dir.join("test"));
assert!(result.is_err());
let error = result.unwrap_err().to_string();
assert!(error.contains("Failed to create directory") || error.contains("No such file or directory"),
"Error should mention directory creation failure");
}
#[test]
fn test_error_handling_with_invalid_workspace_members() -> Result<()> {
let (_temp_dir, project_dir) = setup_test_project()?;
let invalid_workspace_content = r#"[package]
name = "test_project"
version = "0.1.0"
edition = "2021"
[workspace]
members = [
"invalid-path",
]
"#;
fs::write(project_dir.join("Cargo.toml"), invalid_workspace_content)?;
let result = ferrisup_common::cargo::update_workspace_members(&project_dir);
assert!(result.is_ok());
let updated_content = fs::read_to_string(project_dir.join("Cargo.toml"))?;
assert!(updated_content.contains("members"));
Ok(())
}
#[test]
fn test_error_handling_with_file_operations() -> Result<()> {
let (_temp_dir, project_dir) = setup_test_project()?;
#[cfg(unix)]
{
use std::os::unix::fs::PermissionsExt;
let src_dir = project_dir.join("src");
let metadata = fs::metadata(&src_dir)?;
let mut perms = metadata.permissions();
perms.set_mode(0o444); fs::set_permissions(&src_dir, perms)?;
let result = fs::write(src_dir.join("new_file.rs"), "test content");
assert!(result.is_err());
let mut perms = metadata.permissions();
perms.set_mode(0o755); fs::set_permissions(&src_dir, perms)?;
}
Ok(())
}
#[test]
fn test_transform_execute_full_stack() -> Result<()> {
let (temp_dir, project_dir) = setup_test_project()?;
std::env::set_var("FERRISUP_TEST_MODE", "1");
assert_eq!(std::env::var("FERRISUP_TEST_MODE").unwrap_or_default(), "1");
let result = ferrisup::commands::transform::execute(
Some(project_dir.to_str().unwrap()),
Some("full-stack")
);
assert!(result.is_ok());
drop(temp_dir);
Ok(())
}
#[test]
fn test_transform_execute_with_invalid_template() -> Result<()> {
let (temp_dir, project_dir) = setup_test_project()?;
std::env::set_var("FERRISUP_TEST_MODE", "1");
let result = ferrisup::commands::transform::execute(
Some(project_dir.to_str().unwrap()),
Some("non-existent-template")
);
assert!(result.is_err());
let error = result.unwrap_err().to_string();
assert!(error.contains("Invalid template") || error.contains("Unknown template"),
"Error should mention invalid template");
drop(temp_dir);
Ok(())
}
#[test]
#[ignore = "Skipping due to interactive prompts that aren't properly handled by test mode"]
fn test_transform_execute_with_valid_project() -> Result<()> {
let (temp_dir, project_dir) = setup_test_project()?;
std::env::set_var("FERRISUP_TEST_MODE", "1");
let result = ferrisup::commands::transform::execute(
Some(project_dir.to_str().unwrap()),
Some("library")
);
assert!(result.is_ok());
assert!(project_dir.join("src").join("lib.rs").exists());
drop(temp_dir);
Ok(())
}
#[test]
#[ignore = "Skipping due to interactive prompts that aren't properly handled by test mode"]
fn test_transform_execute_with_invalid_path() -> Result<()> {
let invalid_path = "/non/existent/path";
std::env::set_var("FERRISUP_TEST_MODE", "1");
let result = ferrisup::commands::transform::execute(
Some(invalid_path),
Some("library")
);
assert!(result.is_err());
Ok(())
}