xberg-cli 1.3.2

Command-line interface for Xberg document intelligence
#[cfg(feature = "ocr-surface")]
use super::super::*;
#[cfg(feature = "ocr-surface")]
use super::default_overrides;
#[cfg(feature = "ocr-surface")]
use xberg::ExtractionConfig;

#[cfg(feature = "ocr-surface")]
#[test]
fn should_enable_ocr_when_cli_true_overrides_loaded_disable() {
    let mut config = ExtractionConfig {
        disable_ocr: true,
        ..ExtractionConfig::default()
    };
    let overrides = ExtractionOverrides {
        ocr: Some(true),
        ..default_overrides()
    };

    overrides.apply(&mut config);

    assert!(
        !config.disable_ocr,
        "explicit --ocr true should override loaded disable_ocr=true"
    );
    assert!(config.ocr.expect("--ocr true should configure OCR").enabled);
}

#[cfg(feature = "ocr-surface")]
#[test]
fn should_preserve_loaded_disable_ocr_when_ocr_flag_is_absent() {
    let mut config = ExtractionConfig {
        disable_ocr: true,
        ..ExtractionConfig::default()
    };

    default_overrides().apply(&mut config);

    assert!(config.disable_ocr, "an absent OCR flag should preserve loaded config");
}

#[cfg(feature = "ocr-surface")]
#[test]
fn should_clear_loaded_ocr_routing_when_cli_false_hard_disables_ocr() {
    let mut config = ExtractionConfig {
        force_ocr: true,
        ocr_strategy: xberg::OcrStrategy::ScannedPages { min_confidence: 0.8 },
        force_ocr_pages: Some(vec![2, 4]),
        ..ExtractionConfig::default()
    };
    let overrides = ExtractionOverrides {
        ocr: Some(false),
        ..default_overrides()
    };

    overrides.apply(&mut config);

    assert!(!config.force_ocr, "--ocr false should override loaded force_ocr=true");
    assert_eq!(config.ocr_strategy, xberg::OcrStrategy::Auto);
    assert!(
        config.force_ocr_pages.is_none(),
        "--ocr false should clear forced page selection"
    );
}

#[cfg(feature = "ocr-surface")]
#[test]
fn should_reject_ocr_false_with_force_ocr_true() {
    let overrides = ExtractionOverrides {
        ocr: Some(false),
        force_ocr: Some(true),
        ..default_overrides()
    };

    assert_eq!(
        overrides
            .validate()
            .expect_err("disabling and forcing OCR should conflict")
            .to_string(),
        "--ocr false cannot be combined with --force-ocr true"
    );
}

#[cfg(feature = "ocr-surface")]
#[test]
fn should_reject_ocr_false_with_scanned_pages() {
    let overrides = ExtractionOverrides {
        ocr: Some(false),
        ocr_scanned_pages: true,
        ..default_overrides()
    };

    assert_eq!(
        overrides
            .validate()
            .expect_err("disabling OCR and selecting scanned pages should conflict")
            .to_string(),
        "--ocr false cannot be combined with --ocr-scanned-pages"
    );
}

#[cfg(feature = "ocr-surface")]
#[test]
fn should_reject_contradictory_ocr_and_disable_ocr_values() {
    for (ocr, disable_ocr) in [(true, true), (false, false)] {
        let overrides = ExtractionOverrides {
            ocr: Some(ocr),
            disable_ocr: Some(disable_ocr),
            ..default_overrides()
        };

        assert_eq!(
            overrides
                .validate()
                .expect_err("contradictory OCR flags should be rejected")
                .to_string(),
            "--ocr and --disable-ocr specify contradictory values"
        );
    }
}

#[cfg(feature = "ocr-surface")]
#[test]
fn test_validate_invalid_ocr_backend() {
    let overrides = ExtractionOverrides {
        ocr_backend: Some("invalid-backend".to_string()),
        ..default_overrides()
    };
    let err = overrides.validate().unwrap_err();
    assert!(err.to_string().contains("Invalid OCR backend"));
}

#[cfg(feature = "ocr-surface")]
#[test]
fn test_validate_valid_ocr_backends() {
    for backend in &["tesseract", "paddle-ocr", "sceptre"] {
        let overrides = ExtractionOverrides {
            ocr_backend: Some(backend.to_string()),
            ..default_overrides()
        };
        assert!(overrides.validate().is_ok(), "Expected backend '{backend}' to be valid");
    }
}