Ctrl K
ComunidadGuías…

pkg/gitops/source_refs_test.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package gitops

import (
	"reflect"
	"testing"

	"github.com/skyhook-io/radar/pkg/resourceid"
	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
)

func TestFluxSourceReferencesContracts(t *testing.T) {
	for _, tc := range []struct {
		group, kind, target, namespace, role string
		spec                                 map[string]any
	}{
		{"kustomize.toolkit.fluxcd.io", "Kustomization", "Bucket", "shared", "source", map[string]any{"sourceRef": map[string]any{"kind": "Bucket", "name": "artifact", "namespace": "shared"}}},
		{"kustomize.toolkit.fluxcd.io", "Kustomization", "ExternalArtifact", "team", "source", map[string]any{"sourceRef": map[string]any{"kind": "ExternalArtifact", "name": "artifact"}}},
		{"helm.toolkit.fluxcd.io", "HelmRelease", "OCIRepository", "team", "chart reference", map[string]any{"chartRef": map[string]any{"kind": "OCIRepository", "name": "artifact"}}},
		{"helm.toolkit.fluxcd.io", "HelmRelease", "HelmChart", "shared", "chart reference", map[string]any{"chartRef": map[string]any{"kind": "HelmChart", "name": "artifact", "namespace": "shared"}}},
		{"helm.toolkit.fluxcd.io", "HelmRelease", "HelmRepository", "shared", "chart source", map[string]any{"chart": map[string]any{"spec": map[string]any{"sourceRef": map[string]any{"kind": "HelmRepository", "name": "artifact", "namespace": "shared"}}}}},
		// HelmChart sources are local references; namespace is not in their API.
		{"source.toolkit.fluxcd.io", "HelmChart", "GitRepository", "team", "source", map[string]any{"sourceRef": map[string]any{"kind": "GitRepository", "name": "artifact", "namespace": "ignored"}}},
	} {
		t.Run(tc.kind+"/"+tc.target, func(t *testing.T) {
			root := &unstructured.Unstructured{Object: map[string]any{"apiVersion": tc.group + "/v1", "kind": tc.kind, "metadata": map[string]any{"name": "app", "namespace": "team"}, "spec": tc.spec}}
			before := root.DeepCopy()
			want := []FluxSourceRef{{Ref: resourceid.NewRef("source.toolkit.fluxcd.io", tc.target, tc.namespace, "artifact"), Role: tc.role}}
			if got := FluxSourceReferences(root); !reflect.DeepEqual(got, want) {
				t.Fatalf("source = %+v, want %+v", got, want)
			}
			if !reflect.DeepEqual(root, before) {
				t.Fatal("mutated source")
			}
			root.SetAPIVersion("custom.example/v1")
			if got := FluxSourceReferences(root); len(got) != 0 {
				t.Fatal("accepted unrelated group", got)
			}
		})
	}
}

func TestFluxSourceReferencesRejectInvalidDeclarations(t *testing.T) {
	for _, ref := range []map[string]any{{"name": "artifact"}, {"kind": "Secret", "name": "artifact"}, {"kind": "HelmChart"}, {"kind": "OCIRepository", "name": "artifact", "apiVersion": "custom.example/v1"}} {
		root := &unstructured.Unstructured{Object: map[string]any{"apiVersion": "helm.toolkit.fluxcd.io/v2", "kind": "HelmRelease", "metadata": map[string]any{"namespace": "team"}, "spec": map[string]any{"chartRef": ref, "chart": map[string]any{"spec": map[string]any{"sourceRef": map[string]any{"kind": "HelmRepository", "name": "do-not-fallback"}}}}}}
		if got := FluxSourceReferences(root); len(got) != 0 {
			t.Fatalf("invalid reference fell back or guessed: %+v", got)
		}
	}
	if got := FluxSourceReferences(nil); len(got) != 0 {
		t.Fatal(got)
	}
}

func TestInlineHelmReleaseUsesRecordedChart(t *testing.T) {
	root := &unstructured.Unstructured{Object: map[string]any{
		"apiVersion": "helm.toolkit.fluxcd.io/v2", "kind": "HelmRelease",
		"metadata": map[string]any{"namespace": "team", "name": "app"},
		"spec":     map[string]any{"chart": map[string]any{"spec": map[string]any{"sourceRef": map[string]any{"kind": "HelmRepository", "name": "repo", "namespace": "shared"}}}},
		"status":   map[string]any{"helmChart": "shared/team-app"},
	}}
	want := []FluxSourceRef{
		{Ref: resourceid.NewRef("source.toolkit.fluxcd.io", "HelmRepository", "shared", "repo"), Role: "chart source"},
		{Ref: resourceid.NewRef("source.toolkit.fluxcd.io", "HelmChart", "shared", "team-app"), Role: "chart reference"},
	}
	if got := FluxSourceReferences(root); !reflect.DeepEqual(got, want) {
		t.Fatalf("generated chart = %+v, want %+v", got, want)
	}
	for _, recorded := range []string{"", "unqualified", "/chart", "shared/", "shared/chart/extra"} {
		root.Object["status"] = map[string]any{"helmChart": recorded}
		got := FluxSourceReferences(root)
		if len(got) != 1 || got[0].Kind != "HelmRepository" || got[0].Namespace != "shared" {
			t.Fatalf("unrecorded chart = %+v", got)
		}
	}
	root.Object["status"] = map[string]any{"helmChart": "shared/stale"}
	root.Object["spec"].(map[string]any)["chartRef"] = map[string]any{"kind": "OCIRepository", "name": "current"}
	got := FluxSourceReferences(root)
	if len(got) != 1 || got[0].Kind != "OCIRepository" || got[0].Name != "current" {
		t.Fatalf("chartRef followed stale generated chart: %+v", got)
	}
}