| 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") |
| } |
| }) |
| } |
| } |