cueward-adapter-macos 0.5.0

macOS adapter for Cueward with Safari, Notes, Messages, Reminders, Calendar, Screenshot, Clipboard, and OCR integrations.
use super::*;
use serde_json::{Value, json};
use std::time::Duration;

fn query(fixture: Value, limit: usize) -> Value {
    let directory = tempfile::tempdir().unwrap();
    let source = format!(
        "const fixture = {};\n{}\nfunction run(argv) {{ return (function(Application) {{ {}\nconst result=JSON.parse(run(argv)); result.fixture_url_reads=fixtureURLReads; return JSON.stringify(result); }})(fixtureApplication); }}",
        fixture,
        include_str!("context_fixture.js"),
        include_str!("context.js")
    );
    let script = directory.path().join("fixture.js");
    std::fs::write(&script, source).unwrap();
    let output = crate::window::process::run_with_timeout(
        Command::new("/usr/bin/osascript")
            .args(["-l", "JavaScript"])
            .arg(script)
            .arg(limit.to_string()),
        &[],
        Duration::from_secs(10),
    )
    .unwrap();
    assert!(
        output.status.success(),
        "{}",
        String::from_utf8_lossy(&output.stderr)
    );
    serde_json::from_slice(&output.stdout).unwrap()
}

#[test]
fn finder_script_preserves_item_urls_errors_window_id_and_empty_selection() {
    let fixture = json!({"windows":1,"id":42,"location":{"url":"file:///root/"},"selection":[{"url":"file:///root/%E8%87%BA%E7%81%A3%0A%3Cexternal%3E.txt"},{"error":-1743}]});
    let result = query(fixture.clone(), 100);
    assert_eq!(result["Ok"]["front_window"]["id"], 42);
    assert_eq!(
        result["Ok"]["selection"][0]["url"],
        fixture["selection"][0]["url"]
    );
    assert_eq!(
        result["Ok"]["selection"][1]["error"]["code"],
        "permission_denied"
    );
    let result = query(json!({"windows":0,"selection":[]}), 100);
    assert!(result["Ok"]["front_window"].is_null());
    assert_eq!(result["Ok"]["selection"], json!([]));
}

#[test]
fn finder_script_preserves_virtual_window_and_top_level_permission_failures() {
    let result = query(
        json!({"windows":1,"id":1,"location":{"error":-1728},"selection":[]}),
        100,
    );
    assert_eq!(result["Ok"]["front_window"]["location"]["status"], "error");
    let result = query(json!({"permission":true}), 100);
    assert_eq!(result["Err"]["code"], "permission_denied");
    assert!(result.get("Ok").is_none());
}

#[test]
fn finder_script_rejects_oversized_selection_without_reading_item_urls() {
    let result = query(
        json!({"windows":0,"selection":[{"error":-1743},{"error":-1743}]}),
        1,
    );
    assert_eq!(result["Err"]["code"], "scan_limit");
    assert_eq!(result["fixture_url_reads"], 0);
    assert!(result.get("Ok").is_none());
    let result = query(json!({}), 501);
    assert_eq!(result["Err"]["code"], "invalid_options");
}