// Copyright IBM Corp. 2014, 2026 // SPDX-License-Identifier: BUSL-1.1 package backendbase import ( "testing" "github.com/zclconf/go-cty/cty" ) func TestGetPathDefault(t *testing.T) { tests := map[string]struct { Value cty.Value Path cty.Path Default cty.Value Want cty.Value }{ // The test cases here don't aim to exhaustively test all possible // cty.Path values, because we're just delegating to cty.Path.Apply // and that's already tested upstream. "attribute is set": { cty.ObjectVal(map[string]cty.Value{ "a": cty.StringVal("a value"), }), cty.GetAttrPath("a"), cty.StringVal("default"), cty.StringVal("a value"), }, "attribute is not set": { cty.ObjectVal(map[string]cty.Value{ "a": cty.NullVal(cty.String), }), cty.GetAttrPath("a"), cty.StringVal("default"), cty.StringVal("default"), }, } for name, test := range tests { t.Run(name, func(t *testing.T) { got := GetPathDefault(test.Value, test.Path, test.Default) if !test.Want.RawEquals(got) { t.Errorf( "wrong result\nvalue: %#v\npath: %#v\ndefault: %#v\n\ngot: %#v\nwant: %#v", test.Value, test.Path, test.Default, got, test.Want, ) } }) } } func TestGetAttrDefault(t *testing.T) { tests := map[string]struct { Value cty.Value Attr string Default cty.Value Want cty.Value }{ "attribute is set": { cty.ObjectVal(map[string]cty.Value{ "a": cty.StringVal("a value"), }), "a", cty.StringVal("default"), cty.StringVal("a value"), }, "attribute is not set": { cty.ObjectVal(map[string]cty.Value{ "a": cty.NullVal(cty.String), }), "a", cty.StringVal("default"), cty.StringVal("default"), }, } for name, test := range tests { t.Run(name, func(t *testing.T) { got := GetAttrDefault(test.Value, test.Attr, test.Default) if !test.Want.RawEquals(got) { t.Errorf( "wrong result\nvalue: %#v\nattr: %#v\ndefault: %#v\n\ngot: %#v\nwant: %#v", test.Value, test.Attr, test.Default, got, test.Want, ) } }) } } func TestGetPathEnvDefault(t *testing.T) { // This one is actually testing both GetPathEnvDefault and GetAttrEnvDefault // together, since they are both really just the same functionality exposed // in two different ways. t.Setenv("DEFAULT_VALUE_SET", "default") t.Setenv("DEFAULT_VALUE_EMPTY", "") tests := map[string]struct { Value cty.Value Attr string EnvVar string Want cty.Value }{ // The test cases here don't aim to exhaustively test all possible // cty.Path values, because we're just delegating to cty.Path.Apply // and that's already tested upstream. "attribute is set": { cty.ObjectVal(map[string]cty.Value{ "a": cty.StringVal("a value"), }), "a", "DEFAULT_VALUE_SET", cty.StringVal("a value"), }, "attribute is not set, but environment is": { cty.ObjectVal(map[string]cty.Value{ "a": cty.NullVal(cty.String), }), "a", "DEFAULT_VALUE_SET", cty.StringVal("default"), }, "neither attribute or environment are set": { cty.ObjectVal(map[string]cty.Value{ "a": cty.NullVal(cty.String), }), "a", "DEFAULT_VALUE_UNSET", cty.NullVal(cty.String), }, "attribute is not set, and environment variable is empty": { cty.ObjectVal(map[string]cty.Value{ "a": cty.NullVal(cty.String), }), "a", "DEFAULT_VALUE_EMPTY", cty.NullVal(cty.String), }, } for name, test := range tests { t.Run(name, func(t *testing.T) { t.Run("by attr", func(t *testing.T) { got := GetAttrEnvDefault(test.Value, test.Attr, test.EnvVar) if !test.Want.RawEquals(got) { t.Errorf( "wrong result\nvalue: %#v\nattr: %#v\nvariable: %#v\n\ngot: %#v\nwant: %#v", test.Value, test.Attr, test.EnvVar, got, test.Want, ) } }) t.Run("by path", func(t *testing.T) { path := cty.GetAttrPath(test.Attr) got := GetPathEnvDefault(test.Value, path, test.EnvVar) if !test.Want.RawEquals(got) { t.Errorf( "wrong result\nvalue: %#v\npath: %#v\nvariable: %#v\n\ngot: %#v\nwant: %#v", test.Value, path, test.EnvVar, got, test.Want, ) } }) }) } }