use std::path::PathBuf;
use tempfile::TempDir;
use trimdown::{compress_image, compress_ods, compress_odg, Cli, PdfQuality, PdfMethod};
fn create_test_cli(output: PathBuf, quality: u8, max_width: u32, preserve_metadata: bool) -> Cli {
Cli {
command: None,
input: None,
output: Some(output),
folder: false,
quality,
max_width,
video_crf: 23,
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,
streaming: false,
memory_limit: None,
}
}
#[tokio::test]
async fn test_example_image_standard_quality() {
let temp_dir = TempDir::new().unwrap();
let output = temp_dir.path().join("image_standard.jpg");
let cli = create_test_cli(output.clone(), 85, 1920, false);
let result = compress_image(
&PathBuf::from("tests/fixtures/images/large.jpg"),
&output,
&cli
).await;
assert!(result.is_ok(), "Standard quality image compression should succeed");
}
#[tokio::test]
async fn test_example_image_high_quality() {
let temp_dir = TempDir::new().unwrap();
let output = temp_dir.path().join("image_hq.jpg");
let cli = create_test_cli(output.clone(), 95, 2560, true);
let result = compress_image(
&PathBuf::from("tests/fixtures/images/large.jpg"),
&output,
&cli
).await;
assert!(result.is_ok(), "High quality image compression should succeed");
}
#[tokio::test]
async fn test_example_image_web_optimized() {
let temp_dir = TempDir::new().unwrap();
let output = temp_dir.path().join("image_web.jpg");
let cli = create_test_cli(output.clone(), 75, 1280, false);
let result = compress_image(
&PathBuf::from("tests/fixtures/images/large.jpg"),
&output,
&cli
).await;
assert!(result.is_ok(), "Web-optimized image compression should succeed");
}
#[tokio::test]
async fn test_example_image_quality_comparison() {
let temp_dir = TempDir::new().unwrap();
let qualities = vec![75, 85, 95];
for quality in qualities {
let output = temp_dir.path().join(format!("image_q{}.jpg", quality));
let cli = create_test_cli(output.clone(), quality, 1920, false);
let result = compress_image(
&PathBuf::from("tests/fixtures/images/large.jpg"),
&output,
&cli
).await;
assert!(result.is_ok(), "Quality {} compression should succeed", quality);
assert!(output.exists(), "Output file should exist for quality {}", quality);
}
}
#[tokio::test]
async fn test_example_ods_standard() {
let temp_dir = TempDir::new().unwrap();
let output = temp_dir.path().join("spreadsheet.ods");
let cli = create_test_cli(output.clone(), 85, 1920, false);
let result = compress_ods(
&PathBuf::from("tests/fixtures/office/sample.ods"),
&output,
&cli
).await;
assert!(result.is_ok(), "ODS compression should succeed");
assert!(output.exists(), "Compressed ODS file should exist");
}
#[tokio::test]
async fn test_example_ods_high_quality() {
let temp_dir = TempDir::new().unwrap();
let output = temp_dir.path().join("spreadsheet_hq.ods");
let cli = create_test_cli(output.clone(), 95, 2560, true);
let result = compress_ods(
&PathBuf::from("tests/fixtures/office/sample.ods"),
&output,
&cli
).await;
assert!(result.is_ok(), "High quality ODS compression should succeed");
assert!(output.exists(), "High quality ODS file should exist");
}
#[tokio::test]
async fn test_example_odg_standard() {
let temp_dir = TempDir::new().unwrap();
let output = temp_dir.path().join("drawing.odg");
let cli = create_test_cli(output.clone(), 85, 1920, false);
let result = compress_odg(
&PathBuf::from("tests/fixtures/office/sample.odg"),
&output,
&cli
).await;
assert!(result.is_ok(), "ODG compression should succeed");
assert!(output.exists(), "Compressed ODG file should exist");
}
#[tokio::test]
async fn test_example_odg_maximum_quality() {
let temp_dir = TempDir::new().unwrap();
let output = temp_dir.path().join("drawing_max.odg");
let cli = create_test_cli(output.clone(), 95, 3840, true);
let result = compress_odg(
&PathBuf::from("tests/fixtures/office/sample.odg"),
&output,
&cli
).await;
assert!(result.is_ok(), "Maximum quality ODG compression should succeed");
assert!(output.exists(), "Maximum quality ODG file should exist");
}
#[tokio::test]
async fn test_example_opendocument_batch() {
let temp_dir = TempDir::new().unwrap();
let ods_output = temp_dir.path().join("batch_spreadsheet.ods");
let odg_output = temp_dir.path().join("batch_drawing.odg");
let cli = create_test_cli(ods_output.clone(), 85, 1920, false);
let ods_result = compress_ods(
&PathBuf::from("tests/fixtures/office/sample.ods"),
&ods_output,
&cli
).await;
let cli2 = create_test_cli(odg_output.clone(), 85, 1920, false);
let odg_result = compress_odg(
&PathBuf::from("tests/fixtures/office/sample.odg"),
&odg_output,
&cli2
).await;
assert!(ods_result.is_ok(), "Batch ODS compression should succeed");
assert!(odg_result.is_ok(), "Batch ODG compression should succeed");
assert!(ods_output.exists() && odg_output.exists(), "Both files should exist");
}
#[tokio::test]
async fn test_example_metadata_preservation() {
let temp_dir = TempDir::new().unwrap();
let output = temp_dir.path().join("image_with_metadata.jpg");
let cli = create_test_cli(output.clone(), 90, 1920, true);
let result = compress_image(
&PathBuf::from("tests/fixtures/images/large.jpg"),
&output,
&cli
).await;
assert!(result.is_ok(), "Image compression with metadata preservation should succeed");
assert!(cli.preserve_metadata, "Metadata preservation flag should be set");
}
#[tokio::test]
async fn test_example_different_resolutions() {
let temp_dir = TempDir::new().unwrap();
let resolutions = vec![1280, 1920, 2560, 3840];
for max_width in resolutions {
let output = temp_dir.path().join(format!("image_{}px.jpg", max_width));
let cli = create_test_cli(output.clone(), 85, max_width, false);
let result = compress_image(
&PathBuf::from("tests/fixtures/images/large.jpg"),
&output,
&cli
).await;
assert!(result.is_ok(), "Compression at {}px should succeed", max_width);
}
}