xberg-cli 1.3.0

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 test_ocr_backend_options_parsed_and_applied() {
    let mut config = ExtractionConfig::default();
    let backend_options_json = r#"{"task":"chart","layout_mode":"whole_page"}"#;
    let overrides = ExtractionOverrides {
        ocr: Some(true),
        ocr_backend_options: Some(backend_options_json.to_string()),
        ..default_overrides()
    };

    assert!(overrides.validate().is_ok());

    overrides.apply(&mut config);
    let ocr = config.ocr.unwrap();

    assert!(ocr.backend_options.is_some());
    let opts = ocr.backend_options.unwrap();
    assert!(opts.is_object());
    assert_eq!(opts.get("task").and_then(|v| v.as_str()), Some("chart"));
    assert_eq!(opts.get("layout_mode").and_then(|v| v.as_str()), Some("whole_page"));
}

#[cfg(feature = "ocr-surface")]
#[test]
fn test_ocr_backend_options_invalid_json_fails_validation() {
    let overrides = ExtractionOverrides {
        ocr: Some(true),
        ocr_backend_options: Some("not-valid-json".to_string()),
        ..default_overrides()
    };
    assert!(overrides.validate().is_err());
}

#[cfg(feature = "ocr-surface")]
#[test]
fn test_ocr_backend_options_not_object_fails_validation() {
    let overrides = ExtractionOverrides {
        ocr: Some(true),
        ocr_backend_options: Some(r#"["array", "not", "object"]"#.to_string()),
        ..default_overrides()
    };
    assert!(overrides.validate().is_err());
}

#[cfg(feature = "ocr-surface")]
#[test]
fn test_ocr_backend_options_threaded_into_config() {
    let mut config = ExtractionConfig::default();
    let overrides = ExtractionOverrides {
        ocr: Some(true),
        ocr_backend: Some("candle-glm-ocr".to_string()),
        ocr_backend_options: Some(r#"{"layout_mode":"whole_page"}"#.to_string()),
        ..default_overrides()
    };
    overrides.apply(&mut config);
    let ocr = config.ocr.unwrap();
    assert_eq!(ocr.backend, "candle-glm-ocr");
    let opts = ocr.backend_options.expect("backend_options should be Some");
    assert_eq!(opts, serde_json::json!({"layout_mode": "whole_page"}));
}

#[cfg(feature = "ocr-surface")]
#[test]
fn test_validate_rejects_non_object_backend_options() {
    let overrides = ExtractionOverrides {
        ocr_backend_options: Some(r#"["not","an","object"]"#.to_string()),
        ..default_overrides()
    };
    let err = overrides.validate().unwrap_err();
    assert!(
        err.to_string().contains("--ocr-backend-options must be a JSON object"),
        "unexpected error: {err}"
    );
}

#[cfg(feature = "ocr-surface")]
#[test]
fn test_validate_rejects_invalid_json_backend_options() {
    let overrides = ExtractionOverrides {
        ocr_backend_options: Some("not-json".to_string()),
        ..default_overrides()
    };
    let err = overrides.validate().unwrap_err();
    assert!(
        err.to_string().contains("invalid --ocr-backend-options JSON"),
        "unexpected error: {err}"
    );
}

#[cfg(feature = "ocr-surface")]
#[test]
fn test_ocr_backend_options_none_when_absent() {
    let mut config = ExtractionConfig::default();
    let overrides = ExtractionOverrides {
        ocr: Some(true),
        ocr_backend: Some("candle-glm-ocr".to_string()),
        ..default_overrides()
    };
    overrides.apply(&mut config);
    let ocr = config.ocr.unwrap();
    assert!(ocr.backend_options.is_none());
}