greentic-flow 0.5.10

Generic YGTC flow schema/loader/IR for self-describing component nodes.
Documentation
use assert_cmd::cargo::cargo_bin_cmd;
use greentic_flow::questions_schema::{example_for_questions, schema_for_questions};
use greentic_flow::wizard_ops::{WizardMode, decode_component_qa_spec, qa_spec_to_questions};
use jsonschema::Draft;
use std::{fs, path::PathBuf};

fn fixture_registry_resolver() -> String {
    format!(
        "fixture://{}",
        PathBuf::from(env!("CARGO_MANIFEST_DIR"))
            .join("tests")
            .join("fixtures")
            .join("registry")
            .display()
    )
}

fn validate_with_schema(schema: &serde_json::Value, instance: &serde_json::Value) -> bool {
    let compiled = jsonschema::options()
        .with_draft(Draft::Draft202012)
        .build(schema)
        .expect("compile schema");
    compiled.validate(instance).is_ok()
}

#[test]
fn component_schema_matches_fixture_contract_and_validates_example() {
    let output = cargo_bin_cmd!("greentic-flow")
        .arg("component-schema")
        .arg("oci://acme/widget:1")
        .arg("--resolver")
        .arg(fixture_registry_resolver())
        .assert()
        .success()
        .get_output()
        .stdout
        .clone();
    let cli_schema: serde_json::Value =
        serde_json::from_slice(&output).expect("parse CLI schema output");

    let qa_path = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
        .join("tests")
        .join("fixtures")
        .join("registry")
        .join("components")
        .join("acme_widget_1")
        .join("qa_default.cbor");
    let qa_bytes = fs::read(&qa_path).expect("read fixture qa spec");
    let qa_spec = decode_component_qa_spec(&qa_bytes, WizardMode::Default).expect("decode qa");
    let questions = qa_spec_to_questions(&qa_spec, &Default::default(), "en");
    let expected_schema = schema_for_questions(&questions);
    let expected_example = example_for_questions(&questions);

    assert_eq!(cli_schema, expected_schema);
    assert!(validate_with_schema(&cli_schema, &expected_example));
}