use minijinja::Value;
use minijinja::value::Kwargs;
use std::path::PathBuf;
use std::sync::Arc;
use tmpltool::TemplateContext;
use tmpltool::functions::ContextFunction;
use tmpltool::functions::filesystem::ReadLines;
fn create_trusted_context() -> Arc<TemplateContext> {
Arc::new(TemplateContext::new(PathBuf::from("."), true))
}
#[test]
fn test_read_lines_basic() {
let context = create_trusted_context();
let result = ReadLines::call(
context.clone(),
Kwargs::from_iter(vec![("path", Value::from("Cargo.toml"))]),
)
.unwrap();
let lines: Vec<_> = result.try_iter().unwrap().collect();
assert!(lines.len() <= 10);
assert!(!lines.is_empty());
}
#[test]
fn test_read_lines_with_max() {
let context = create_trusted_context();
let result = ReadLines::call(
context.clone(),
Kwargs::from_iter(vec![
("path", Value::from("Cargo.toml")),
("max_lines", Value::from(3)),
]),
)
.unwrap();
let lines: Vec<_> = result.try_iter().unwrap().collect();
assert_eq!(lines.len(), 3);
}
#[test]
fn test_read_lines_entire_file() {
let context = create_trusted_context();
let result = ReadLines::call(
context.clone(),
Kwargs::from_iter(vec![
("path", Value::from("Cargo.toml")),
("max_lines", Value::from(0)),
]),
)
.unwrap();
let lines: Vec<_> = result.try_iter().unwrap().collect();
assert!(lines.len() > 3);
}
#[test]
fn test_read_lines_invalid_max_large() {
let context = create_trusted_context();
let result = ReadLines::call(
context.clone(),
Kwargs::from_iter(vec![
("path", Value::from("Cargo.toml")),
("max_lines", Value::from(20000)),
]),
);
assert!(result.is_err());
assert!(
result
.unwrap_err()
.to_string()
.contains("between 0 and 10000")
);
}
#[test]
fn test_read_lines_last_lines() {
let context = create_trusted_context();
let result = ReadLines::call(
context.clone(),
Kwargs::from_iter(vec![
("path", Value::from("Cargo.toml")),
("max_lines", Value::from(-3)),
]),
)
.unwrap();
let lines: Vec<_> = result.try_iter().unwrap().collect();
assert_eq!(lines.len(), 3);
}
#[test]
fn test_read_lines_negative_more_than_file() {
let context = create_trusted_context();
let result = ReadLines::call(
context.clone(),
Kwargs::from_iter(vec![
("path", Value::from("Cargo.toml")),
("max_lines", Value::from(-10000)),
]),
)
.unwrap();
let lines: Vec<_> = result.try_iter().unwrap().collect();
assert!(!lines.is_empty());
}
#[test]
fn test_read_lines_nonexistent() {
let context = create_trusted_context();
let result = ReadLines::call(
context.clone(),
Kwargs::from_iter(vec![("path", Value::from("nonexistent.txt"))]),
);
assert!(result.is_err());
assert!(result.unwrap_err().to_string().contains("Failed to read"));
}