greentic-flow-builder 0.3.1

Greentic Flow Builder — orchestrator that powers Adaptive Card design via the adaptive-card-mcp toolkit
Documentation
//! Integration test exercising the tool dispatcher end-to-end without
//! crossing the network. Verifies the contract between routes/chat.rs
//! and tool_bridge::dispatch by hitting dispatch directly with realistic
//! tool arguments.

use greentic_flow_builder::knowledge::Knowledge;
use greentic_flow_builder::ui::tool_bridge::dispatch;
use serde_json::{Value, json};
use std::sync::Arc;

#[tokio::test]
async fn validate_then_optimize_round_trip() {
    let kb = Arc::new(Knowledge::embedded());

    let validate_args = json!({
        "card": {
            "type": "AdaptiveCard",
            "version": "1.6",
            "speak": "Hello",
            "body": [{"type":"TextBlock","text":"Hi","wrap":true}]
        },
        "host": "teams"
    })
    .to_string();
    let validate_result = dispatch(&kb, "validate_card", &validate_args).await;
    let validate_parsed: Value = serde_json::from_str(&validate_result).unwrap();
    assert_eq!(validate_parsed["valid"], true);

    // optimize_card with accessibility:true adds a top-level `speak` field
    // (not altText on individual Image elements).
    let optimize_args = json!({
        "card": {
            "type": "AdaptiveCard",
            "version": "1.6",
            "body": [{"type":"Image","url":"x.png"}]
        },
        "accessibility": true
    })
    .to_string();
    let optimize_result = dispatch(&kb, "optimize_card", &optimize_args).await;
    let optimize_parsed: Value = serde_json::from_str(&optimize_result).unwrap();
    assert!(optimize_parsed["card"]["speak"].is_string());
}

#[tokio::test]
async fn knowledge_base_loads_embedded() {
    let kb = Knowledge::embedded();
    let _ = kb.entry_count();
}

#[tokio::test]
async fn pack_card_dispatch_returns_ui_message() {
    let kb = Arc::new(Knowledge::embedded());
    let args = json!({"name": "test", "cards": []}).to_string();
    let result = dispatch(&kb, "pack_card", &args).await;
    let parsed: Value = serde_json::from_str(&result).unwrap();
    assert!(parsed["error"].as_str().unwrap().contains("UI"));
}