helm-schema-k8s 0.0.4

Generate an accurate JSON schema for any helm chart
Documentation
use serde_json::json;
use test_util::prelude::sim_assert_eq;

use super::*;

fn universe_from_crd_documents<I: IntoIterator<Item = serde_json::Value>>(
    documents: I,
) -> LocalSchemaUniverse {
    let mut universe = LocalSchemaUniverse::default();
    for document in documents {
        for resource_schema in crate::resource_schemas_from_crd_document_with_source(
            &document,
            "chart-local",
            String::new(),
        ) {
            universe.insert_resource_schema(resource_schema);
        }
    }
    universe
}

fn resource(api_version: &str) -> ResourceRef {
    ResourceRef::concrete(api_version.to_string(), "Widget".to_string())
}

fn widget_universe() -> LocalSchemaUniverse {
    universe_from_crd_documents([json!({
        "apiVersion": "apiextensions.k8s.io/v1",
        "kind": "CustomResourceDefinition",
        "spec": {
            "group": "example.com",
            "names": {"kind": "Widget"},
            "versions": [
                {
                    "name": "v1",
                    "served": true,
                    "schema": {
                        "openAPIV3Schema": {
                            "type": "object",
                            "properties": {
                                "spec": {
                                    "type": "object",
                                    "properties": {
                                        "size": {"type": "integer"}
                                    }
                                }
                            }
                        }
                    }
                }
            ]
        }
    })])
}

#[test]
fn resolves_served_crd_version_schema_from_universe() {
    let provider = ChartLocalCrdSchemaProvider::new(widget_universe());

    let schema = provider.lookup(
        &resource("example.com/v1"),
        &YamlPath(vec!["spec".to_string(), "size".to_string()]),
    );

    let ProviderLookupResult::Found { schema, .. } = schema else {
        panic!("chart-local provider should resolve spec.size");
    };
    sim_assert_eq!(
        have: schema.into_schema(),
        want: json!({"type": "integer"})
    );
}

#[test]
fn lookup_attaches_chart_local_provider_source() {
    let mut universe = LocalSchemaUniverse::default();
    for resource_schema in crate::resource_schemas_from_crd_document_with_source(
        &json!({
            "apiVersion": "apiextensions.k8s.io/v1",
            "kind": "CustomResourceDefinition",
            "spec": {
                "group": "example.com",
                "names": {"kind": "Widget"},
                "versions": [
                    {
                        "name": "v1",
                        "served": true,
                        "schema": {
                            "openAPIV3Schema": {
                                "type": "object",
                                "properties": {
                                    "spec": {
                                        "type": "object",
                                        "properties": {
                                            "size": {"type": "integer"}
                                        }
                                    }
                                }
                            }
                        }
                    }
                ]
            }
        }),
        "chart-static-crd",
        "/chart/crds/widgets.yaml",
    ) {
        universe.insert_resource_schema(resource_schema);
    }
    let provider = ChartLocalCrdSchemaProvider::new(universe);

    let result = provider.lookup(
        &resource("example.com/v1"),
        &YamlPath(vec!["spec".to_string(), "size".to_string()]),
    );
    let ProviderLookupResult::Found { schema, .. } = result else {
        panic!("chart-local lookup should resolve spec.size");
    };
    let source = schema.source().expect("chart-local source should attach");

    sim_assert_eq!(have: source.origin(), want: ProviderOrigin::ChartLocalCrd);
    sim_assert_eq!(have: source.source_id(), want: "chart-static-crd");
    sim_assert_eq!(have: source.filename(), want: "/chart/crds/widgets.yaml");
    sim_assert_eq!(have: source.pointer(), want: "/properties/spec/properties/size");
}

#[test]
fn api_version_guess_uses_chart_local_crd_origin() {
    let provider = ChartLocalCrdSchemaProvider::new(widget_universe()).with_api_version_guess(true);

    sim_assert_eq!(
        have: provider.infer_api_version_candidates("Widget"),
        want: vec![ApiVersionCandidate {
            api_version: "example.com/v1".to_string(),
            source: InferenceSource::ChartLocalCrd,
            origin: ProviderOrigin::ChartLocalCrd,
        }]
    );
}