earl 0.5.2

AI-safe CLI for AI agents
use earl::output::human::render_human_output;
use earl::output::json::render_json_output;
use earl::protocol::executor::ExecutionResult;
use earl::template::schema::{ResultDecode, ResultTemplate};
use serde_json::{Map, json};

#[test]
fn result_alias_exposes_result_to_template_context() {
    let template = ResultTemplate {
        decode: ResultDecode::Json,
        extract: None,
        output: "id={{ issue.id }} q={{ args.query }}".to_string(),
        result_alias: Some("issue".to_string()),
    };

    let mut args = Map::new();
    args.insert("query".to_string(), json!("hello"));
    let result = json!({"id": 123});

    let out = render_human_output(&template, &args, &result).unwrap();
    assert_eq!(out, "id=123 q=hello");
}

fn default_execution() -> ExecutionResult {
    ExecutionResult {
        status: 200,
        url: "https://api.example.com".to_string(),
        result: json!({}),
        decoded: json!({}),
    }
}

#[test]
fn json_output_includes_status_code() {
    let out = render_json_output(&default_execution());
    assert_eq!(out["status"], json!(200));
}

#[test]
fn json_output_includes_url() {
    let out = render_json_output(&default_execution());
    assert_eq!(out["url"], json!("https://api.example.com"));
}

#[test]
fn json_output_includes_result() {
    let execution = ExecutionResult {
        result: json!({"ok": true}),
        ..default_execution()
    };
    let out = render_json_output(&execution);
    assert_eq!(out["result"]["ok"], json!(true));
}

#[test]
fn json_output_includes_decoded() {
    let execution = ExecutionResult {
        decoded: json!({"raw": "value"}),
        ..default_execution()
    };
    let out = render_json_output(&execution);
    assert_eq!(out["decoded"]["raw"], json!("value"));
}