helm-schema 0.0.4

Generate an accurate JSON schema for any helm chart
Documentation
use color_eyre::eyre;
use indoc::indoc;

use serde_json::json;
use test_util::prelude::sim_assert_eq;

use super::local_resource_schemas_from_template_source;

#[test]
fn templated_metadata_crd_still_projects_local_schema() -> eyre::Result<()> {
    let source = indoc! {r#"
        apiVersion: apiextensions.k8s.io/v1
        kind: CustomResourceDefinition
        metadata:
          name: {{ printf "%s.example.com" "widgets" }}
        spec:
          group: example.com
          names:
            kind: Widget
            plural: widgets
          scope: Namespaced
          versions:
            - name: v1
              served: true
              storage: true
              schema:
                openAPIV3Schema:
                  type: object
                  properties:
                    spec:
                      type: object
                      properties:
                        size:
                          type: integer
    "#};

    let schemas =
        local_resource_schemas_from_template_source(source, "/chart/templates/crd.yaml", true)?;

    sim_assert_eq!(have: schemas.len(), want: 1);
    sim_assert_eq!(have: schemas[0].api_version, want: "example.com/v1");
    sim_assert_eq!(have: schemas[0].kind, want: "Widget");
    sim_assert_eq!(
        have: schemas[0]
            .schema
            .pointer("/properties/spec/properties/size"),
        want: Some(&json!({"type": "integer"}))
    );

    Ok(())
}

#[test]
fn dynamic_schema_subtree_is_not_projected() -> eyre::Result<()> {
    let source = indoc! {r"
        apiVersion: apiextensions.k8s.io/v1
        kind: CustomResourceDefinition
        spec:
          group: example.com
          names:
            kind: Widget
            plural: widgets
          scope: Namespaced
          versions:
            - name: v1
              served: true
              storage: true
              schema:
                openAPIV3Schema:
                  type: {{ .Values.schemaType }}
    "};

    let schemas =
        local_resource_schemas_from_template_source(source, "/chart/templates/crd.yaml", true)?;

    assert!(schemas.is_empty());

    Ok(())
}