use std::fs;
use std::path::PathBuf;
use tempfile::TempDir;
use trimdown::{Cli, PdfQuality, PdfMethod};
#[tokio::test]
async fn test_compression_workflow() {
let temp_dir = TempDir::new().unwrap();
let input_path = temp_dir.path().join("test.txt");
fs::write(&input_path, b"test content").unwrap();
let cli = Cli {
command: None,
input: Some(input_path.clone()),
output: Some(temp_dir.path().join("output.txt")),
folder: false,
quality: 85,
max_width: 1920,
video_crf: 28,
video_max_width: 1920,
pdf_quality: PdfQuality::Ebook,
pdf_method: PdfMethod::Auto,
force: false,
verbose: false,
dry_run: false,
preset: None,
parallel: false,
preserve_metadata: false,
streaming: false,
memory_limit: None,
};
assert!(input_path.exists());
}
#[test]
fn test_cli_validation() {
let cli = Cli {
command: None,
input: Some(PathBuf::from("test.pptx")),
output: None,
folder: false,
quality: 85,
max_width: 1920,
video_crf: 28,
video_max_width: 1920,
pdf_quality: PdfQuality::Ebook,
pdf_method: PdfMethod::Auto,
force: false,
verbose: false,
dry_run: false,
preset: None,
parallel: false,
preserve_metadata: false,
streaming: false,
memory_limit: None,
};
assert_eq!(cli.quality, 85);
assert_eq!(cli.max_width, 1920);
assert_eq!(cli.video_crf, 28);
assert!(!cli.force);
assert!(!cli.verbose);
assert!(!cli.dry_run);
assert!(!cli.parallel);
}
#[test]
fn test_quality_bounds() {
let cli_low = Cli {
command: None,
input: Some(PathBuf::from("test.pptx")),
output: None,
folder: false,
quality: 1,
max_width: 1920,
video_crf: 28,
video_max_width: 1920,
pdf_quality: PdfQuality::Ebook,
pdf_method: PdfMethod::Auto,
force: false,
verbose: false,
dry_run: false,
preset: None,
parallel: false,
preserve_metadata: false,
streaming: false,
memory_limit: None,
};
assert_eq!(cli_low.quality, 1);
let cli_high = Cli {
command: None,
input: Some(PathBuf::from("test.pptx")),
output: None,
folder: false,
quality: 100,
max_width: 1920,
video_crf: 28,
video_max_width: 1920,
pdf_quality: PdfQuality::Ebook,
pdf_method: PdfMethod::Auto,
force: false,
verbose: false,
dry_run: false,
preset: None,
parallel: false,
preserve_metadata: false,
streaming: false,
memory_limit: None,
};
assert_eq!(cli_high.quality, 100);
}
#[test]
fn test_video_crf_bounds() {
let cli_low = Cli {
command: None,
input: Some(PathBuf::from("test.mp4")),
output: None,
folder: false,
quality: 85,
max_width: 1920,
video_crf: 0,
video_max_width: 1920,
pdf_quality: PdfQuality::Ebook,
pdf_method: PdfMethod::Auto,
force: false,
verbose: false,
dry_run: false,
preset: None,
parallel: false,
preserve_metadata: false,
streaming: false,
memory_limit: None,
};
assert_eq!(cli_low.video_crf, 0);
let cli_high = Cli {
command: None,
input: Some(PathBuf::from("test.mp4")),
output: None,
folder: false,
quality: 85,
max_width: 1920,
video_crf: 51,
video_max_width: 1920,
pdf_quality: PdfQuality::Ebook,
pdf_method: PdfMethod::Auto,
force: false,
verbose: false,
dry_run: false,
preset: None,
parallel: false,
preserve_metadata: false,
streaming: false,
memory_limit: None,
};
assert_eq!(cli_high.video_crf, 51);
}
#[test]
fn test_pdf_quality_variants() {
let qualities = vec![
PdfQuality::Screen,
PdfQuality::Ebook,
PdfQuality::Printer,
PdfQuality::Prepress,
PdfQuality::Maximum,
];
for quality in qualities {
let cli = Cli {
command: None,
input: Some(PathBuf::from("test.pdf")),
output: None,
folder: false,
quality: 85,
max_width: 1920,
video_crf: 28,
video_max_width: 1920,
pdf_quality: quality.clone(),
pdf_method: PdfMethod::Auto,
force: false,
verbose: false,
dry_run: false,
preset: None,
parallel: false,
preserve_metadata: false,
streaming: false,
memory_limit: None,
};
assert_eq!(cli.pdf_quality, quality);
}
}
#[test]
fn test_pdf_method_variants() {
let methods = vec![
PdfMethod::Auto,
PdfMethod::Native,
PdfMethod::Qpdf,
PdfMethod::Mutool,
PdfMethod::Ghostscript,
];
for method in methods {
let cli = Cli {
command: None,
input: Some(PathBuf::from("test.pdf")),
output: None,
folder: false,
quality: 85,
max_width: 1920,
video_crf: 28,
video_max_width: 1920,
pdf_quality: PdfQuality::Ebook,
pdf_method: method.clone(),
force: false,
verbose: false,
dry_run: false,
preset: None,
parallel: false,
preserve_metadata: false,
streaming: false,
memory_limit: None,
};
assert_eq!(cli.pdf_method, method);
}
}
#[test]
fn test_dry_run_flag() {
let cli = Cli {
command: None,
input: Some(PathBuf::from("test.pptx")),
output: None,
folder: false,
quality: 85,
max_width: 1920,
video_crf: 28,
video_max_width: 1920,
pdf_quality: PdfQuality::Ebook,
pdf_method: PdfMethod::Auto,
force: false,
verbose: false,
dry_run: true,
preset: None,
parallel: false,
preserve_metadata: false,
streaming: false,
memory_limit: None,
};
assert!(cli.dry_run);
}
#[test]
fn test_parallel_flag() {
let cli = Cli {
command: None,
input: Some(PathBuf::from("/path/to/folder")),
output: None,
folder: true,
quality: 85,
max_width: 1920,
video_crf: 28,
video_max_width: 1920,
pdf_quality: PdfQuality::Ebook,
pdf_method: PdfMethod::Auto,
force: false,
verbose: false,
dry_run: false,
preset: None,
parallel: true,
preserve_metadata: false,
streaming: false,
memory_limit: None,
};
assert!(cli.parallel);
assert!(cli.folder);
}
#[test]
fn test_preset_option() {
let presets = vec!["fast", "balanced", "maximum"];
for preset in presets {
let cli = Cli {
command: None,
input: Some(PathBuf::from("test.pptx")),
output: None,
folder: false,
quality: 85,
max_width: 1920,
video_crf: 28,
video_max_width: 1920,
pdf_quality: PdfQuality::Ebook,
pdf_method: PdfMethod::Auto,
force: false,
verbose: false,
dry_run: false,
preset: Some(preset.to_string()),
parallel: false,
preserve_metadata: false,
streaming: false,
memory_limit: None,
};
assert_eq!(cli.preset.as_deref(), Some(preset));
}
}
#[test]
fn test_output_path_with_custom_name() {
let temp_dir = TempDir::new().unwrap();
let input_path = temp_dir.path().join("input.pptx");
let output_path = temp_dir.path().join("custom_output.pptx");
let cli = Cli {
command: None,
input: Some(input_path.clone()),
output: Some(output_path.clone()),
folder: false,
quality: 85,
max_width: 1920,
video_crf: 28,
video_max_width: 1920,
pdf_quality: PdfQuality::Ebook,
pdf_method: PdfMethod::Auto,
force: false,
verbose: false,
dry_run: false,
preset: None,
parallel: false,
preserve_metadata: false,
streaming: false,
memory_limit: None,
};
assert_eq!(cli.output, Some(output_path));
}
#[test]
fn test_force_overwrite_flag() {
let cli = Cli {
command: None,
input: Some(PathBuf::from("test.pptx")),
output: Some(PathBuf::from("output.pptx")),
folder: false,
quality: 85,
max_width: 1920,
video_crf: 28,
video_max_width: 1920,
pdf_quality: PdfQuality::Ebook,
pdf_method: PdfMethod::Auto,
force: true,
verbose: false,
dry_run: false,
preset: None,
parallel: false,
preserve_metadata: false,
streaming: false,
memory_limit: None,
};
assert!(cli.force);
}
#[test]
fn test_verbose_flag() {
let cli = Cli {
command: None,
input: Some(PathBuf::from("test.pptx")),
output: None,
folder: false,
quality: 85,
max_width: 1920,
video_crf: 28,
video_max_width: 1920,
pdf_quality: PdfQuality::Ebook,
pdf_method: PdfMethod::Auto,
force: false,
verbose: true,
dry_run: false,
preset: None,
parallel: false,
preserve_metadata: false,
streaming: false,
memory_limit: None,
};
assert!(cli.verbose);
}
#[test]
fn test_max_width_values() {
let widths = vec![1280, 1920, 2560, 3840];
for width in widths {
let cli = Cli {
command: None,
input: Some(PathBuf::from("test.pptx")),
output: None,
folder: false,
quality: 85,
max_width: width,
video_crf: 28,
video_max_width: 1920,
pdf_quality: PdfQuality::Ebook,
pdf_method: PdfMethod::Auto,
force: false,
verbose: false,
dry_run: false,
preset: None,
parallel: false,
preserve_metadata: false,
streaming: false,
memory_limit: None,
};
assert_eq!(cli.max_width, width);
}
}