blob: 8be2ecb626500cb7af3173f4190fa86205e8ba9b [file] [log] [blame] [edit]
// Copyright (c) HashiCorp, Inc.
// 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,
)
}
})
})
}
}