package configs import ( "testing" "github.com/zclconf/go-cty/cty" ) func TestParserLoadValuesFile(t *testing.T) { tests := map[string]struct { Source string Want map[string]cty.Value DiagCount int }{ "empty.tfvars": { "", map[string]cty.Value{}, 0, }, "empty.json": { "{}", map[string]cty.Value{}, 0, }, "zerolen.json": { "", map[string]cty.Value{}, 2, // syntax error and missing root object }, "one-number.tfvars": { "foo = 1\n", map[string]cty.Value{ "foo": cty.NumberIntVal(1), }, 0, }, "one-number.tfvars.json": { `{"foo": 1}`, map[string]cty.Value{ "foo": cty.NumberIntVal(1), }, 0, }, "two-bools.tfvars": { "foo = true\nbar = false\n", map[string]cty.Value{ "foo": cty.True, "bar": cty.False, }, 0, }, "two-bools.tfvars.json": { `{"foo": true, "bar": false}`, map[string]cty.Value{ "foo": cty.True, "bar": cty.False, }, 0, }, "invalid-syntax.tfvars": { "foo bar baz\n", map[string]cty.Value{}, 2, // invalid block definition, and unexpected foo block (the latter due to parser recovery behavior) }, "block.tfvars": { "foo = true\ninvalid {\n}\n", map[string]cty.Value{ "foo": cty.True, }, 1, // blocks are not allowed }, "variables.tfvars": { "baz = true\nfoo = var.baz\n", map[string]cty.Value{ "baz": cty.True, "foo": cty.DynamicVal, }, 1, // variables cannot be referenced here }, } for name, test := range tests { t.Run(name, func(t *testing.T) { p := testParser(map[string]string{ name: test.Source, }) got, diags := p.LoadValuesFile(name) if len(diags) != test.DiagCount { t.Errorf("wrong number of diagnostics %d; want %d", len(diags), test.DiagCount) for _, diag := range diags { t.Logf("- %s", diag) } } if len(got) != len(test.Want) { t.Errorf("wrong number of result keys %d; want %d", len(got), len(test.Want)) } for name, gotVal := range got { wantVal := test.Want[name] if wantVal == cty.NilVal { t.Errorf("unexpected result key %q", name) continue } if !gotVal.RawEquals(wantVal) { t.Errorf("wrong value for %q\ngot: %#v\nwant: %#v", name, gotVal, wantVal) continue } } }) } }