github.com/brandonstevens/terraform@v0.9.6-0.20170512224929-5367f2607e16/terraform/variables_test.go (about)

     1  package terraform
     2  
     3  import (
     4  	"reflect"
     5  	"testing"
     6  )
     7  
     8  func TestVariables(t *testing.T) {
     9  	cases := map[string]struct {
    10  		Module   string
    11  		Env      map[string]string
    12  		Override map[string]interface{}
    13  		Error    bool
    14  		Expected map[string]interface{}
    15  	}{
    16  		"config only": {
    17  			"vars-basic",
    18  			nil,
    19  			nil,
    20  			false,
    21  			map[string]interface{}{
    22  				"a": "foo",
    23  				"b": []interface{}{},
    24  				"c": map[string]interface{}{},
    25  			},
    26  		},
    27  
    28  		"env vars": {
    29  			"vars-basic",
    30  			map[string]string{
    31  				"TF_VAR_a": "bar",
    32  				"TF_VAR_b": `["foo", "bar"]`,
    33  				"TF_VAR_c": `{"foo" = "bar"}`,
    34  			},
    35  			nil,
    36  			false,
    37  			map[string]interface{}{
    38  				"a": "bar",
    39  				"b": []interface{}{"foo", "bar"},
    40  				"c": map[string]interface{}{
    41  					"foo": "bar",
    42  				},
    43  			},
    44  		},
    45  
    46  		"override": {
    47  			"vars-basic",
    48  			nil,
    49  			map[string]interface{}{
    50  				"a": "bar",
    51  				"b": []interface{}{"foo", "bar"},
    52  				"c": map[string]interface{}{
    53  					"foo": "bar",
    54  				},
    55  			},
    56  			false,
    57  			map[string]interface{}{
    58  				"a": "bar",
    59  				"b": []interface{}{"foo", "bar"},
    60  				"c": map[string]interface{}{
    61  					"foo": "bar",
    62  				},
    63  			},
    64  		},
    65  
    66  		"override partial map": {
    67  			"vars-basic",
    68  			map[string]string{
    69  				"TF_VAR_c": `{"foo" = "a", "bar" = "baz"}`,
    70  			},
    71  			map[string]interface{}{
    72  				"c": map[string]interface{}{
    73  					"foo": "bar",
    74  				},
    75  			},
    76  			false,
    77  			map[string]interface{}{
    78  				"a": "foo",
    79  				"b": []interface{}{},
    80  				"c": map[string]interface{}{
    81  					"foo": "bar",
    82  					"bar": "baz",
    83  				},
    84  			},
    85  		},
    86  
    87  		"bools: config only": {
    88  			"vars-basic-bool",
    89  			nil,
    90  			nil,
    91  			false,
    92  			map[string]interface{}{
    93  				"a": "1",
    94  				"b": "0",
    95  			},
    96  		},
    97  
    98  		"bools: override with string": {
    99  			"vars-basic-bool",
   100  			nil,
   101  			map[string]interface{}{
   102  				"a": "foo",
   103  				"b": "bar",
   104  			},
   105  			false,
   106  			map[string]interface{}{
   107  				"a": "foo",
   108  				"b": "bar",
   109  			},
   110  		},
   111  
   112  		"bools: override with env": {
   113  			"vars-basic-bool",
   114  			map[string]string{
   115  				"TF_VAR_a": "false",
   116  				"TF_VAR_b": "true",
   117  			},
   118  			nil,
   119  			false,
   120  			map[string]interface{}{
   121  				"a": "false",
   122  				"b": "true",
   123  			},
   124  		},
   125  
   126  		"bools: override with bool": {
   127  			"vars-basic-bool",
   128  			nil,
   129  			map[string]interface{}{
   130  				"a": false,
   131  				"b": true,
   132  			},
   133  			false,
   134  			map[string]interface{}{
   135  				"a": "0",
   136  				"b": "1",
   137  			},
   138  		},
   139  
   140  		"override map with string": {
   141  			"vars-basic",
   142  			map[string]string{
   143  				"TF_VAR_c": `{"foo" = "a", "bar" = "baz"}`,
   144  			},
   145  			map[string]interface{}{
   146  				"c": "bar",
   147  			},
   148  			true,
   149  			nil,
   150  		},
   151  	}
   152  
   153  	for name, tc := range cases {
   154  		// Wrapped in a func so we can get defers to work
   155  		t.Run(name, func(t *testing.T) {
   156  			// Set the env vars
   157  			for k, v := range tc.Env {
   158  				defer tempEnv(t, k, v)()
   159  			}
   160  
   161  			m := testModule(t, tc.Module)
   162  			actual, err := Variables(m, tc.Override)
   163  			if (err != nil) != tc.Error {
   164  				t.Fatalf("%s: err: %s", name, err)
   165  			}
   166  			if err != nil {
   167  				return
   168  			}
   169  
   170  			if !reflect.DeepEqual(actual, tc.Expected) {
   171  				t.Fatalf("%s\n\nexpected: %#v\n\ngot: %#v", name, tc.Expected, actual)
   172  			}
   173  		})
   174  	}
   175  }