trimdown 0.1.6

Fast file compression tool for Office documents (PPTX, DOCX, XLSX), PDFs, videos, images, OpenDocument formats, and archives with streaming support
Documentation
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,
    }
}

// Image compression tests
#[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();
    
    // Compress with different quality levels
    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);
    }
}

// OpenDocument Spreadsheet tests
#[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");
}

// OpenDocument Graphics tests
#[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");
}

// Combined workflow tests
#[tokio::test]
async fn test_example_opendocument_batch() {
    let temp_dir = TempDir::new().unwrap();
    
    // Test both ODS and ODG in sequence
    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);
    }
}