package state import ( "testing" "github.com/google/go-cmp/cmp" ) func TestGenerateID(t *testing.T) { type testcase struct { subject string release ReleaseSpec data any want string } ids := map[string]int{} run := func(tc testcase) { t.Helper() t.Run(tc.subject, func(t *testing.T) { t.Helper() got, err := generateValuesID(&tc.release, tc.data) if err != nil { t.Fatalf("unexpected error: %v", err) } if d := cmp.Diff(tc.want, got); d != "" { t.Fatalf("unexpected result: want (-), got (+):\n%s", d) } ids[got]++ }) } // NOTE: These hashes are derived from the full ReleaseSpec struct via // generateValuesID -> HashObject. Adding or renaming fields on ReleaseSpec // (even nil-defaulted pointer fields like ResolveOCIVersions) shifts every // expected hash below. Regenerate the values whenever the struct changes. run(testcase{ subject: "baseline", release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"}, want: "foo-values-577699c466", }) run(testcase{ subject: "different bytes content", release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"}, data: []byte(`{"k":"v"}`), want: "foo-values-c7dc8bf7", }) run(testcase{ subject: "different map content", release: ReleaseSpec{Name: "foo", Chart: "incubator/raw"}, data: map[string]any{"k": "v"}, want: "foo-values-84744c8675", }) run(testcase{ subject: "different chart", release: ReleaseSpec{Name: "foo", Chart: "stable/envoy"}, want: "foo-values-76c9d7ccff", }) run(testcase{ subject: "different name", release: ReleaseSpec{Name: "bar", Chart: "incubator/raw"}, want: "bar-values-55d5975ccf", }) run(testcase{ subject: "specific ns", release: ReleaseSpec{Name: "foo", Chart: "incubator/raw", Namespace: "myns"}, want: "myns-foo-values-7956fd86dc", }) for id, n := range ids { if n > 1 { t.Fatalf("too many occurrences of %s: %d", id, n) } } }