helm-schema 0.0.7

Generate an accurate JSON schema for any helm chart
Documentation
use super::{UnpreparedOverride, apply_prepared_schema_override, apply_schema_override};
use test_util::prelude::sim_assert_eq;

#[test]
fn override_merges_objects_and_unions_required() {
    let base = serde_json::json!({
        "type": "object",
        "additionalProperties": false,
        "properties": {
            "a": {"type": "string"}
        },
        "required": ["a"]
    });

    let ov = serde_json::json!({
        "properties": {
            "b": {"type": "integer"}
        },
        "required": ["b"]
    });

    let actual = apply_schema_override(base, ov);

    let expected = serde_json::json!({
        "type": "object",
        "additionalProperties": false,
        "properties": {
            "a": {"type": "string"},
            "b": {"type": "integer"}
        },
        "required": ["a", "b"]
    });

    sim_assert_eq!(have: actual, want: expected);
}

#[test]
fn override_with_ref_replaces_base_subtree() {
    let base = serde_json::json!({
        "type": "object",
        "properties": {
            "cloud": { "type": ["boolean", "string"] }
        }
    });

    let ov = serde_json::json!({
        "properties": {
            "cloud": { "$ref": "./cloud.json" }
        }
    });

    let actual = apply_schema_override(base, ov);

    let expected = serde_json::json!({
        "type": "object",
        "properties": {
            "cloud": { "$ref": "./cloud.json" }
        }
    });

    sim_assert_eq!(have: actual, want: expected);
}

#[test]
fn prepared_reference_intent_replaces_the_inferred_subtree() {
    let base = serde_json::json!({
        "type": "object",
        "properties": {
            "cloud": {
                "anyOf": [{"type": "boolean"}, {"type": "string"}]
            }
        }
    });

    let unprepared = UnpreparedOverride::capture(serde_json::json!({
        "properties": {
            "cloud": {
                "$ref": "./cloud.json"
            }
        }
    }));
    let prepared = unprepared.into_prepared(serde_json::json!({
        "properties": {
            "cloud": {
                "enum": [null, "azure", "minikube"]
            }
        }
    }));

    let actual = apply_prepared_schema_override(base, prepared);

    let expected = serde_json::json!({
        "type": "object",
        "properties": {
            "cloud": {
                "enum": [null, "azure", "minikube"]
            }
        }
    });

    sim_assert_eq!(have: actual, want: expected);
}

#[test]
fn composition_override_replaces_conflicting_scalar_constraints() {
    let base = serde_json::json!({
        "type": "object",
        "properties": {
            "imageRegistry": {
                "type": "string"
            }
        }
    });

    let ov = serde_json::json!({
        "properties": {
            "imageRegistry": {
                "anyOf": [
                    { "type": "null" },
                    { "type": "string" }
                ]
            }
        }
    });

    let actual = apply_schema_override(base, ov);

    let expected = serde_json::json!({
        "type": "object",
        "properties": {
            "imageRegistry": {
                "anyOf": [
                    { "type": "null" },
                    { "type": "string" }
                ]
            }
        }
    });

    sim_assert_eq!(have: actual, want: expected);
}

#[test]
fn caller_authored_ref_replace_keys_are_not_merge_controls() {
    let base = serde_json::json!({
        "properties": {
            "cloud": {
                "type": "object",
                "properties": {"existing": {"type": "string"}}
            }
        }
    });
    let ov = serde_json::json!({
        "properties": {
            "cloud": {
                "$ref-replace": "caller value",
                "properties": {"added": {"type": "integer"}}
            }
        }
    });

    let actual = apply_schema_override(base, ov);

    let expected = serde_json::json!({
        "properties": {
            "cloud": {
                "$ref-replace": "caller value",
                "type": "object",
                "properties": {
                    "added": {"type": "integer"},
                    "existing": {"type": "string"}
                }
            }
        }
    });

    sim_assert_eq!(have: actual, want: expected);
}

#[test]
fn caller_authored_ref_replace_key_survives_reference_replacement() {
    let base = serde_json::json!({
        "properties": {"cloud": {"type": "string"}}
    });
    let unprepared = UnpreparedOverride::capture(serde_json::json!({
        "properties": {
            "cloud": {
                "$ref": "./cloud.json",
                "$ref-replace": "caller value"
            }
        }
    }));
    let prepared = unprepared.into_prepared(serde_json::json!({
        "properties": {
            "cloud": {
                "$ref-replace": "caller value",
                "enum": ["azure", "minikube"]
            }
        }
    }));

    let actual = apply_prepared_schema_override(base, prepared);

    sim_assert_eq!(
        have: actual,
        want: serde_json::json!({
            "properties": {
                "cloud": {
                    "$ref-replace": "caller value",
                    "enum": ["azure", "minikube"]
                }
            }
        })
    );
}