github.com/rvichery/terraform@v0.11.10/configs/parser_values_test.go (about)

     1  package configs
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/zclconf/go-cty/cty"
     7  )
     8  
     9  func TestParserLoadValuesFile(t *testing.T) {
    10  	tests := map[string]struct {
    11  		Source    string
    12  		Want      map[string]cty.Value
    13  		DiagCount int
    14  	}{
    15  		"empty.tfvars": {
    16  			"",
    17  			map[string]cty.Value{},
    18  			0,
    19  		},
    20  		"empty.json": {
    21  			"{}",
    22  			map[string]cty.Value{},
    23  			0,
    24  		},
    25  		"zerolen.json": {
    26  			"",
    27  			map[string]cty.Value{},
    28  			2, // syntax error and missing root object
    29  		},
    30  		"one-number.tfvars": {
    31  			"foo = 1\n",
    32  			map[string]cty.Value{
    33  				"foo": cty.NumberIntVal(1),
    34  			},
    35  			0,
    36  		},
    37  		"one-number.tfvars.json": {
    38  			`{"foo": 1}`,
    39  			map[string]cty.Value{
    40  				"foo": cty.NumberIntVal(1),
    41  			},
    42  			0,
    43  		},
    44  		"two-bools.tfvars": {
    45  			"foo = true\nbar = false\n",
    46  			map[string]cty.Value{
    47  				"foo": cty.True,
    48  				"bar": cty.False,
    49  			},
    50  			0,
    51  		},
    52  		"two-bools.tfvars.json": {
    53  			`{"foo": true, "bar": false}`,
    54  			map[string]cty.Value{
    55  				"foo": cty.True,
    56  				"bar": cty.False,
    57  			},
    58  			0,
    59  		},
    60  		"invalid-syntax.tfvars": {
    61  			"foo bar baz\n",
    62  			map[string]cty.Value{},
    63  			2, // invalid block definition, and unexpected foo block (the latter due to parser recovery behavior)
    64  		},
    65  		"block.tfvars": {
    66  			"foo = true\ninvalid {\n}\n",
    67  			map[string]cty.Value{
    68  				"foo": cty.True,
    69  			},
    70  			1, // blocks are not allowed
    71  		},
    72  		"variables.tfvars": {
    73  			"baz = true\nfoo = var.baz\n",
    74  			map[string]cty.Value{
    75  				"baz": cty.True,
    76  				"foo": cty.DynamicVal,
    77  			},
    78  			1, // variables cannot be referenced here
    79  		},
    80  	}
    81  
    82  	for name, test := range tests {
    83  		t.Run(name, func(t *testing.T) {
    84  			p := testParser(map[string]string{
    85  				name: test.Source,
    86  			})
    87  			got, diags := p.LoadValuesFile(name)
    88  			if len(diags) != test.DiagCount {
    89  				t.Errorf("wrong number of diagnostics %d; want %d", len(diags), test.DiagCount)
    90  				for _, diag := range diags {
    91  					t.Logf("- %s", diag)
    92  				}
    93  			}
    94  
    95  			if len(got) != len(test.Want) {
    96  				t.Errorf("wrong number of result keys %d; want %d", len(got), len(test.Want))
    97  			}
    98  
    99  			for name, gotVal := range got {
   100  				wantVal := test.Want[name]
   101  				if wantVal == cty.NilVal {
   102  					t.Errorf("unexpected result key %q", name)
   103  					continue
   104  				}
   105  
   106  				if !gotVal.RawEquals(wantVal) {
   107  					t.Errorf("wrong value for %q\ngot:  %#v\nwant: %#v", name, gotVal, wantVal)
   108  					continue
   109  				}
   110  			}
   111  		})
   112  	}
   113  }