zebflow 0.7.0

Reactive web automation platform — pipelines, templates, and real-time collaboration in a single binary.
Documentation
use serde_json::json;
use zebflow::framework::nodes::basic::web_render::{
    self, Config as WebRenderConfig, Node as WebRenderNode,
};
use zebflow::framework::nodes::{FrameworkNode, NodeExecutionInput};
use zebflow::language::NoopLanguageEngine;
use zebflow::rwe::{NoopReactiveWebEngine, TemplateSource};

#[test]
fn web_render_node_interface_lives_in_framework_nodes() {
    let rwe = NoopReactiveWebEngine;
    let lang = NoopLanguageEngine;

    let template = TemplateSource {
        id: "page.home".into(),
        source_path: None,
        markup: "<h1>{{ state.title }}</h1>".into(),
    };
    let config = WebRenderConfig {
        template_id: "page.home".into(),
        route: "/home".into(),
        ..Default::default()
    };

    let compiled = WebRenderNode::compile("node.web.home", &config, &template, &rwe, &lang)
        .expect("compile web render node");
    let node = WebRenderNode::new(compiled.clone());

    assert_eq!(node.kind(), web_render::NODE_KIND);
    assert_eq!(node.input_pins(), &[web_render::INPUT_PIN_IN]);
    assert_eq!(
        node.output_pins(),
        &[web_render::OUTPUT_PIN_OUT, web_render::OUTPUT_PIN_ERROR]
    );

    let out = node
        .execute(NodeExecutionInput {
            node_id: "node.web.home".into(),
            input_pin: web_render::INPUT_PIN_IN.into(),
            payload: json!({"title":"Hello"}),
            metadata: json!({"source":"framework"}),
        })
        .expect("execute node");
    assert_eq!(out.output_pin, web_render::OUTPUT_PIN_OUT);

    let rendered = web_render::render_with_engines(
        &compiled,
        json!({"title":"Hello"}),
        json!({"source":"framework"}),
        &rwe,
        &lang,
        "req-123",
    )
    .expect("render via pure rwe/language");
    assert_eq!(rendered.output_pin, web_render::OUTPUT_PIN_OUT);
    assert!(
        rendered
            .payload
            .get("html")
            .and_then(|v| v.as_str())
            .unwrap_or("")
            .contains("<h1>")
    );
}