use anyhow::Result;
use lumin::search::{SearchOptions, search_files};
use lumin::traverse::{TraverseOptions, traverse_directory};
use lumin::view::{FileContents, ViewOptions, view_file};
use serial_test::serial;
use std::path::Path;
mod test_helpers;
use test_helpers::{TEST_DIR, TestEnvironment};
#[cfg(test)]
mod integration_tests {
use super::*;
#[test]
#[serial]
fn test_workflow_traverse_then_search() -> Result<()> {
let _env = TestEnvironment::setup()?;
let traverse_options = TraverseOptions::default();
let files = traverse_directory(Path::new(TEST_DIR), &traverse_options)?;
let rust_files: Vec<_> = files
.iter()
.filter(|f| f.file_type == "rs")
.map(|f| &f.file_path)
.collect();
assert!(!rust_files.is_empty());
let search_options = SearchOptions::default();
let mut search_results = Vec::new();
for file_path in rust_files {
let results = search_files("fn", file_path, &search_options)?;
search_results.extend(results.lines);
}
assert!(!search_results.is_empty());
Ok(())
}
#[test]
#[serial]
fn test_workflow_search_then_view() -> Result<()> {
let _env = TestEnvironment::setup()?;
let search_options = SearchOptions::default();
let search_results = search_files("^# ", Path::new(TEST_DIR), &search_options)?;
assert!(!search_results.lines.is_empty());
let view_options = ViewOptions::default();
for result in &search_results.lines {
let file_view = view_file(&result.file_path, &view_options)?;
assert!(file_view.file_type.starts_with("text/"));
match &file_view.contents {
FileContents::Text {
content,
metadata: _,
} => {
assert!(content.contains("#"));
}
_ => panic!("Expected text content, got a different variant"),
}
}
Ok(())
}
#[test]
#[serial]
fn test_file_type_handling() -> Result<()> {
let _env = TestEnvironment::setup()?;
let mut traverse_options = TraverseOptions::default();
traverse_options.only_text_files = false;
traverse_options.respect_gitignore = false;
let files = traverse_directory(Path::new(TEST_DIR), &traverse_options)?;
let mut rust_files = Vec::new();
let mut markdown_files = Vec::new();
let mut python_files = Vec::new();
let mut binary_files = Vec::new();
let mut hidden_files = Vec::new();
for file in &files {
match file.file_type.as_str() {
"rs" => rust_files.push(&file.file_path),
"md" => markdown_files.push(&file.file_path),
"py" => python_files.push(&file.file_path),
"jpg" | "png" => binary_files.push(&file.file_path),
_ => {}
}
if file.is_hidden() {
hidden_files.push(&file.file_path);
}
}
assert!(!rust_files.is_empty(), "No Rust files found");
assert!(!markdown_files.is_empty(), "No Markdown files found");
assert!(!python_files.is_empty(), "No Python files found");
assert!(
!binary_files.is_empty()
|| files
.iter()
.any(|f| f.file_path.to_string_lossy().contains("binary_executable")),
"No binary files found"
);
let view_options = ViewOptions::default();
let rust_view = view_file(&rust_files[0], &view_options)?;
assert!(rust_view.file_type.starts_with("text/"));
let md_view = view_file(&markdown_files[0], &view_options)?;
assert!(md_view.file_type.starts_with("text/"));
let py_view = view_file(&python_files[0], &view_options)?;
assert!(py_view.file_type.starts_with("text/"));
if !binary_files.is_empty() {
let bin_view = view_file(&binary_files[0], &view_options)?;
match &bin_view.contents {
FileContents::Binary { message, metadata } => {
assert!(message.contains("Binary file"));
assert!(metadata.binary);
assert!(metadata.size_bytes > 0);
}
FileContents::Image { message, metadata } => {
assert!(message.contains("Image file"));
assert!(metadata.binary);
assert!(metadata.size_bytes > 0);
}
_ => panic!("Expected binary or image content, got a different variant"),
}
} else {
let bin_path = Path::new(TEST_DIR).join("images").join("binary_executable");
if bin_path.exists() {
let bin_view = view_file(&bin_path, &view_options)?;
match &bin_view.contents {
FileContents::Binary { message, metadata } => {
assert!(message.contains("Binary file"));
assert!(metadata.binary);
assert!(metadata.size_bytes > 0);
}
_ => panic!("Expected binary content, got a different variant"),
}
}
}
Ok(())
}
}