greentic-flow 0.4.56

Generic YGTC flow schema/loader/IR for self-describing component nodes.
Documentation
use ciborium::value::Value as CborValue;
use greentic_flow::schema_validate::{Severity, validate_value_against_schema};
use greentic_types::schemas::common::schema_ir::{AdditionalProperties, SchemaIr};

#[test]
fn schema_validate_reports_required_missing() {
    let schema = SchemaIr::Object {
        properties: [(
            "name".to_string(),
            SchemaIr::String {
                min_len: None,
                max_len: None,
                regex: None,
                format: None,
            },
        )]
        .into_iter()
        .collect(),
        required: vec!["name".to_string()],
        additional: AdditionalProperties::Allow,
    };
    let value = CborValue::Map(Vec::new());
    let diags = validate_value_against_schema(&schema, &value);
    assert!(diags.iter().any(|d| d.code == "SCHEMA_REQUIRED_MISSING"));
}

#[test]
fn schema_validate_reports_type_mismatch() {
    let schema = SchemaIr::String {
        min_len: None,
        max_len: None,
        regex: None,
        format: None,
    };
    let value = CborValue::Bool(true);
    let diags = validate_value_against_schema(&schema, &value);
    assert!(diags.iter().any(|d| d.code == "SCHEMA_TYPE_MISMATCH"));
}

#[test]
fn schema_validate_forbids_additional_properties() {
    let schema = SchemaIr::Object {
        properties: std::collections::BTreeMap::new(),
        required: Vec::new(),
        additional: AdditionalProperties::Forbid,
    };
    let value = CborValue::Map(vec![(
        CborValue::Text("extra".to_string()),
        CborValue::Bool(true),
    )]);
    let diags = validate_value_against_schema(&schema, &value);
    assert!(
        diags
            .iter()
            .any(|d| d.code == "SCHEMA_ADDITIONAL_FORBIDDEN")
    );
}

#[test]
fn schema_validate_warns_on_regex() {
    let schema = SchemaIr::String {
        min_len: None,
        max_len: None,
        regex: Some("^foo$".to_string()),
        format: None,
    };
    let value = CborValue::Text("foo".to_string());
    let diags = validate_value_against_schema(&schema, &value);
    assert!(
        diags
            .iter()
            .any(|d| d.code == "SCHEMA_REGEX_UNSUPPORTED" && d.severity == Severity::Warning)
    );
}