use raz_core::{FileDetector, Position, UniversalCommandGenerator};
use std::fs;
use tempfile::TempDir;
#[test]
fn test_nested_module_file_detection() -> Result<(), Box<dyn std::error::Error>> {
let temp_dir = TempDir::new()?;
let project_root = temp_dir.path();
fs::write(
project_root.join("Cargo.toml"),
r#"[package]
name = "rust-bench-guide"
version = "0.1.0"
edition = "2021"
"#,
)?;
fs::create_dir_all(project_root.join("src/power/over"))?;
fs::write(project_root.join("src/lib.rs"), r#"pub mod power;"#)?;
fs::write(project_root.join("src/power/mod.rs"), r#"pub mod over;"#)?;
fs::write(
project_root.join("src/power/over/mod.rs"),
r#"pub mod level_900;"#,
)?;
let test_file = project_root.join("src/power/over/level_900.rs");
fs::write(
&test_file,
r#"pub fn power_level() -> u32 {
9000
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
assert_eq!(power_level(), 9000);
}
#[test]
fn it_never_works() {
assert_eq!(power_level(), 9001);
}
}
"#,
)?;
let cursor = Position {
line: 14, column: 4,
};
let context = FileDetector::detect_context(&test_file, Some(cursor))?;
match &context.project_type {
raz_core::file_detection::RustProjectType::CargoPackage { package_name, .. } => {
assert_eq!(package_name, "rust-bench-guide");
}
_ => panic!("Expected CargoPackage project type"),
}
assert_eq!(
context.file_role,
raz_core::file_detection::FileRole::Module
);
let test_entry = context
.entry_points
.iter()
.find(|ep| ep.name == "it_never_works")
.expect("Should find it_never_works test");
assert_eq!(
test_entry.full_path.as_ref().unwrap(),
"power::over::level_900::tests::it_never_works"
);
let commands = UniversalCommandGenerator::generate_commands(&context, Some(cursor))?;
let test_command = commands
.iter()
.find(|c| {
c.args
.iter()
.any(|arg| arg.contains("power::over::level_900::tests::it_never_works"))
|| (c.label.contains("module")
&& c.args
.iter()
.any(|arg| arg.contains("power::over::level_900::tests::")))
})
.expect("Should generate test command for the module or specific test");
assert_eq!(test_command.command, "cargo");
assert!(test_command.args.contains(&"test".to_string()));
assert!(test_command.args.contains(&"--package".to_string()));
assert!(test_command.args.contains(&"rust-bench-guide".to_string()));
let args_str = test_command.args.join(" ");
assert!(
args_str.contains("power::over::level_900::tests::it_never_works"),
"Command should include full module path. Got: {args_str}"
);
assert!(
args_str.contains("--exact"),
"Command should include --exact flag"
);
Ok(())
}
#[test]
fn test_module_file_not_treated_as_standalone() -> Result<(), Box<dyn std::error::Error>> {
let temp_dir = TempDir::new()?;
let project_root = temp_dir.path();
fs::write(
project_root.join("Cargo.toml"),
r#"[package]
name = "test-project"
version = "0.1.0"
edition = "2021"
"#,
)?;
fs::create_dir_all(project_root.join("src/utils"))?;
let module_file = project_root.join("src/utils/helpers.rs");
fs::write(
&module_file,
r#"
pub fn helper() -> i32 {
42
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_helper() {
assert_eq!(helper(), 42);
}
}
"#,
)?;
let context = FileDetector::detect_context(&module_file, None)?;
assert_eq!(
context.file_role,
raz_core::file_detection::FileRole::Module
);
match context.project_type {
raz_core::file_detection::RustProjectType::CargoPackage { .. } => {}
_ => panic!(
"Module file should not be converted to SingleFile: {:?}",
context.project_type
),
}
let commands = UniversalCommandGenerator::generate_commands(&context, None)?;
let test_command = commands
.iter()
.find(|c| c.id == "cargo-test")
.expect("Should have cargo test command");
assert_eq!(test_command.command, "cargo");
assert!(!commands.iter().any(|c| c.command == "rustc"));
Ok(())
}