opentofu/configs/parser_values_test.go
Martin Atkins 7549ce15f0 configs: update values file invalid syntax test for new HCL behavior
The error-handling behavior of the HCL parser was improved, which causes
the number of diagnostics and the diagnostics messages to be different
in cases where a block-like introduction is given but without any
following body.
2018-03-08 11:17:39 -08:00

114 lines
2.3 KiB
Go

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