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_validate_vlm_backend_requires_model() {
    let overrides = ExtractionOverrides {
        ocr_backend: Some("vlm".to_string()),
        ..default_overrides()
    };

    let error = overrides
        .validate()
        .expect_err("VLM backend without a model should fail");

    assert_eq!(
        error.to_string(),
        "--ocr-backend vlm requires --vlm-model to be specified"
    );
}

#[cfg(feature = "ocr-surface")]
#[test]
fn test_ocr_backend_options_vlm_flow() {
    let mut config = ExtractionConfig::default();
    let backend_options_json = r#"{"task":"chart","layout_mode":"whole_page"}"#;
    let overrides = ExtractionOverrides {
        vlm_model: Some("openai/gpt-4o".to_string()),
        ocr_backend_options: Some(backend_options_json.to_string()),
        ..default_overrides()
    };

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

    overrides.apply(&mut config);

    let ocr = config.ocr.expect("OCR should be configured");
    assert_eq!(ocr.backend, "vlm");

    let opts = ocr.backend_options.expect("backend_options should be Some");
    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"));

    assert!(ocr.vlm_config.is_some());
    let vlm = ocr.vlm_config.unwrap();
    assert_eq!(vlm.model, "openai/gpt-4o");
}