blob: 8b0336fe0e63baf376944a481f50e810ebcbc95b [file] [log] [blame]
package schema
import (
"context"
"fmt"
"testing"
"github.com/zclconf/go-cty/cty"
)
func TestBackendPrepare(t *testing.T) {
cases := []struct {
Name string
B *Backend
Config map[string]cty.Value
Expect map[string]cty.Value
Err bool
}{
{
"Basic required field",
&Backend{
Schema: map[string]*Schema{
"foo": &Schema{
Required: true,
Type: TypeString,
},
},
},
map[string]cty.Value{},
map[string]cty.Value{},
true,
},
{
"Null config",
&Backend{
Schema: map[string]*Schema{
"foo": &Schema{
Required: true,
Type: TypeString,
},
},
},
nil,
map[string]cty.Value{},
true,
},
{
"Basic required field set",
&Backend{
Schema: map[string]*Schema{
"foo": &Schema{
Required: true,
Type: TypeString,
},
},
},
map[string]cty.Value{
"foo": cty.StringVal("bar"),
},
map[string]cty.Value{
"foo": cty.StringVal("bar"),
},
false,
},
{
"unused default",
&Backend{
Schema: map[string]*Schema{
"foo": &Schema{
Optional: true,
Type: TypeString,
Default: "baz",
},
},
},
map[string]cty.Value{
"foo": cty.StringVal("bar"),
},
map[string]cty.Value{
"foo": cty.StringVal("bar"),
},
false,
},
{
"default",
&Backend{
Schema: map[string]*Schema{
"foo": &Schema{
Type: TypeString,
Optional: true,
Default: "baz",
},
},
},
map[string]cty.Value{},
map[string]cty.Value{
"foo": cty.StringVal("baz"),
},
false,
},
{
"default func",
&Backend{
Schema: map[string]*Schema{
"foo": &Schema{
Type: TypeString,
Optional: true,
DefaultFunc: func() (interface{}, error) {
return "baz", nil
},
},
},
},
map[string]cty.Value{},
map[string]cty.Value{
"foo": cty.StringVal("baz"),
},
false,
},
}
for i, tc := range cases {
t.Run(fmt.Sprintf("%d-%s", i, tc.Name), func(t *testing.T) {
cfgVal := cty.NullVal(cty.Object(map[string]cty.Type{}))
if tc.Config != nil {
cfgVal = cty.ObjectVal(tc.Config)
}
configVal, diags := tc.B.PrepareConfig(cfgVal)
if diags.HasErrors() != tc.Err {
for _, d := range diags {
t.Error(d.Description())
}
}
if tc.Err {
return
}
expect := cty.ObjectVal(tc.Expect)
if !expect.RawEquals(configVal) {
t.Fatalf("\nexpected: %#v\ngot: %#v\n", expect, configVal)
}
})
}
}
func TestBackendConfigure(t *testing.T) {
cases := []struct {
Name string
B *Backend
Config map[string]cty.Value
Err bool
}{
{
"Basic config",
&Backend{
Schema: map[string]*Schema{
"foo": &Schema{
Type: TypeInt,
Optional: true,
},
},
ConfigureFunc: func(ctx context.Context) error {
d := FromContextBackendConfig(ctx)
if d.Get("foo").(int) != 42 {
return fmt.Errorf("bad config data")
}
return nil
},
},
map[string]cty.Value{
"foo": cty.NumberIntVal(42),
},
false,
},
}
for i, tc := range cases {
t.Run(fmt.Sprintf("%d-%s", i, tc.Name), func(t *testing.T) {
diags := tc.B.Configure(cty.ObjectVal(tc.Config))
if diags.HasErrors() != tc.Err {
t.Errorf("wrong number of diagnostics")
}
})
}
}