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())
}

#[test]
fn extracts_served_crd_version_schema() {
    let universe = 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"}
                                    }
                                }
                            }
                        }
                    }
                }
            ]
        }
    })]);

    let schema = universe
        .schema_doc_for_resource(&resource("example.com/v1"))
        .and_then(|schema_doc| {
            schema_doc
                .root()
                .pointer("/properties/spec/properties/size")
        });

    sim_assert_eq!(have: schema, want: Some(&json!({"type": "integer"})));
}

#[test]
fn ignores_unserved_crd_versions() {
    let universe = universe_from_crd_documents([json!({
        "apiVersion": "apiextensions.k8s.io/v1",
        "kind": "CustomResourceDefinition",
        "spec": {
            "group": "example.com",
            "names": {"kind": "Widget"},
            "versions": [
                {
                    "name": "v1",
                    "served": false,
                    "schema": {"openAPIV3Schema": {"type": "object"}}
                }
            ]
        }
    })]);

    assert!(
        universe
            .schema_doc_for_resource(&resource("example.com/v1"))
            .is_none()
    );
}

#[test]
fn inserts_direct_resource_schema_without_crd_envelope() {
    let mut universe = LocalSchemaUniverse::default();
    universe.insert_resource_schema(LocalResourceSchema {
        api_version: "example.com/v1".to_string(),
        kind: "Widget".to_string(),
        schema: json!({
            "type": "object",
            "properties": {
                "spec": {
                    "type": "object",
                    "properties": {
                        "enabled": {"type": "boolean"}
                    }
                }
            }
        }),
        source_id: "chart-local".to_string(),
        filename: "example.com_v1_Widget.schema.json".to_string(),
    });

    let schema = universe
        .schema_doc_for_resource(&resource("example.com/v1"))
        .and_then(|schema_doc| {
            schema_doc
                .root()
                .pointer("/properties/spec/properties/enabled")
        });

    sim_assert_eq!(have: schema, want: Some(&json!({"type": "boolean"})));
}