use anyhow::Result;
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 view_tests {
use super::*;
#[test]
#[serial]
fn test_view_text_file() -> Result<()> {
let _env = TestEnvironment::setup()?;
std::fs::copy(
"tests/fixtures/text_files/config.toml",
Path::new(TEST_DIR).join("config.toml"),
)?;
let file_path = Path::new(TEST_DIR).join("config.toml");
let options = ViewOptions::default();
let result = view_file(&file_path, &options)?;
assert_eq!(result.file_path, file_path);
assert!(result.file_type.starts_with("text/"));
match &result.contents {
FileContents::Text { content, metadata } => {
assert!(!content.is_empty());
assert!(content.contains("server"));
assert!(content.contains("database"));
assert!(content.contains("port = 8080"));
assert!(metadata.line_count > 0);
assert!(metadata.char_count > 0);
}
_ => panic!("Expected text content, got a different variant"),
}
Ok(())
}
#[test]
#[serial]
fn test_view_markdown_file() -> Result<()> {
let _env = TestEnvironment::setup()?;
let file_path = Path::new(TEST_DIR).join("docs").join("README.md");
let options = ViewOptions::default();
let result = view_file(&file_path, &options)?;
assert_eq!(result.file_path, file_path);
assert!(result.file_type.starts_with("text/"));
match &result.contents {
FileContents::Text { content, metadata } => {
assert!(content.contains("# Test Documentation"));
assert!(metadata.line_count > 0);
}
_ => panic!("Expected text content, got a different variant"),
}
Ok(())
}
#[test]
#[serial]
fn test_view_binary_file() -> Result<()> {
let _env = TestEnvironment::setup()?;
let file_path = Path::new(TEST_DIR).join("images").join("binary_executable");
let options = ViewOptions::default();
let result = view_file(&file_path, &options)?;
assert_eq!(result.file_path, file_path);
match &result.contents {
FileContents::Binary { message, metadata } => {
assert!(message.contains("Binary file detected"));
assert!(metadata.binary);
assert!(metadata.size_bytes > 0);
}
_ => panic!("Expected binary content, got a different variant"),
}
Ok(())
}
#[test]
#[serial]
fn test_view_with_size_limit() -> Result<()> {
let _env = TestEnvironment::setup()?;
let file_path = Path::new(TEST_DIR).join("images").join("sample.jpg"); let options = ViewOptions {
max_size: Some(1024), line_from: None,
line_to: None,
};
let result = view_file(&file_path, &options);
assert!(result.is_err());
let err = format!("{}", result.unwrap_err());
assert!(err.contains("File is too large"));
Ok(())
}
#[test]
#[serial]
fn test_view_nonexistent_file() -> Result<()> {
let _env = TestEnvironment::setup()?;
let file_path = Path::new(TEST_DIR).join("nonexistent.txt");
let options = ViewOptions::default();
let result = view_file(&file_path, &options);
assert!(result.is_err());
let err = format!("{}", result.unwrap_err());
assert!(err.contains("File not found"));
Ok(())
}
#[test]
#[serial]
fn test_view_ignored_file() -> Result<()> {
let _env = TestEnvironment::setup()?;
let hidden_file = Path::new(TEST_DIR).join(".hidden").join("secret.txt");
let options = ViewOptions::default();
let result = view_file(&hidden_file, &options)?;
match &result.contents {
FileContents::Text { content, metadata } => {
assert!(content.contains("API_KEY=test_key_12345"));
assert!(metadata.line_count > 0);
}
_ => panic!("Expected text content, got a different variant"),
}
Ok(())
}
}