use anyhow::Result;
use lumin::traverse::{TraverseOptions, traverse_directory};
use std::path::Path;
#[test]
fn test_traverse_basic() -> Result<()> {
let directory = Path::new("tests/fixtures");
let options = TraverseOptions::default();
let results = traverse_directory(directory, &options)?;
assert!(!results.is_empty());
let file_paths: Vec<String> = results
.iter()
.map(|r| r.file_path.to_string_lossy().to_string())
.collect();
assert!(file_paths.iter().any(|path| path.contains("sample.txt")));
assert!(file_paths.iter().any(|path| path.contains("markdown.md")));
assert!(file_paths.iter().any(|path| path.contains("config.toml")));
assert!(file_paths.iter().any(|path| path.contains("file.rs")));
assert!(file_paths.iter().all(|path| !path.contains("temp.tmp")));
assert!(file_paths.iter().all(|path| !path.contains("log.log")));
assert!(file_paths.iter().all(|path| !path.contains(".hidden")));
Ok(())
}
#[test]
fn test_traverse_with_binary_files() -> Result<()> {
let directory = Path::new("tests/fixtures");
let options = TraverseOptions {
only_text_files: false,
..TraverseOptions::default()
};
let results = traverse_directory(directory, &options)?;
let file_paths: Vec<String> = results
.iter()
.map(|r| r.file_path.to_string_lossy().to_string())
.collect();
assert!(file_paths.iter().any(|path| path.contains("sample.txt")));
assert!(file_paths.iter().any(|path| path.contains("binary.bin")));
assert!(file_paths.iter().any(|path| path.contains("sample.jpg")));
Ok(())
}
#[test]
fn test_traverse_without_gitignore_respect() -> Result<()> {
let directory = Path::new("tests/fixtures");
let options = TraverseOptions {
respect_gitignore: false,
..TraverseOptions::default()
};
let results = traverse_directory(directory, &options)?;
let file_paths: Vec<String> = results
.iter()
.map(|r| r.file_path.to_string_lossy().to_string())
.collect();
assert!(file_paths.iter().any(|path| path.contains("temp.tmp")));
assert!(file_paths.iter().any(|path| path.contains("log.log")));
assert!(
file_paths
.iter()
.any(|path| path.contains(".hidden/secret.txt"))
);
Ok(())
}
#[test]
fn test_traverse_with_glob_pattern() -> Result<()> {
let directory = Path::new("tests/fixtures");
let options = TraverseOptions {
pattern: Some("**/*.txt".to_string()),
..TraverseOptions::default()
};
let results = traverse_directory(directory, &options)?;
assert!(!results.is_empty());
assert!(
results
.iter()
.all(|r| r.file_path.to_string_lossy().ends_with(".txt"))
);
assert!(
results
.iter()
.all(|r| !r.file_path.to_string_lossy().ends_with(".md"))
);
assert!(
results
.iter()
.all(|r| !r.file_path.to_string_lossy().ends_with(".rs"))
);
Ok(())
}
#[test]
fn test_traverse_with_substring_pattern() -> Result<()> {
let directory = Path::new("tests/fixtures");
let options = TraverseOptions {
pattern: Some("level".to_string()),
..TraverseOptions::default()
};
let results = traverse_directory(directory, &options)?;
assert!(!results.is_empty());
assert!(
results
.iter()
.all(|r| r.file_path.to_string_lossy().contains("level"))
);
let file_paths: Vec<String> = results
.iter()
.map(|r| r.file_path.to_string_lossy().to_string())
.collect();
assert!(file_paths.iter().any(|path| path.contains("level1.txt")));
assert!(file_paths.iter().any(|path| path.contains("level2.txt")));
Ok(())
}
#[test]
fn test_is_hidden_check() -> Result<()> {
let directory = Path::new("tests/fixtures");
let options = TraverseOptions {
respect_gitignore: false,
..TraverseOptions::default()
};
let results = traverse_directory(directory, &options)?;
let hidden_files: Vec<_> = results
.iter()
.filter(|r| r.file_path.to_string_lossy().contains(".hidden"))
.collect();
assert!(!hidden_files.is_empty());
for file in hidden_files {
assert!(
file.is_hidden(),
"File in .hidden directory should be marked as hidden"
);
}
Ok(())
}