github.com/tomaszheflik/terraform@v0.7.3-0.20160827060421-32f990b41594/terraform/eval_variable_test.go (about) 1 package terraform 2 3 import ( 4 "reflect" 5 "testing" 6 ) 7 8 func TestCoerceMapVariable(t *testing.T) { 9 cases := map[string]struct { 10 Input *EvalCoerceMapVariable 11 ExpectVars map[string]interface{} 12 }{ 13 "a valid map is untouched": { 14 Input: &EvalCoerceMapVariable{ 15 Variables: map[string]interface{}{ 16 "amap": map[string]interface{}{"foo": "bar"}, 17 }, 18 ModulePath: []string{"root"}, 19 ModuleTree: testModuleInline(t, map[string]string{ 20 "main.tf": ` 21 variable "amap" { 22 type = "map" 23 } 24 `, 25 }), 26 }, 27 ExpectVars: map[string]interface{}{ 28 "amap": map[string]interface{}{"foo": "bar"}, 29 }, 30 }, 31 "a list w/ a single map element is coerced": { 32 Input: &EvalCoerceMapVariable{ 33 Variables: map[string]interface{}{ 34 "amap": []interface{}{ 35 map[string]interface{}{"foo": "bar"}, 36 }, 37 }, 38 ModulePath: []string{"root"}, 39 ModuleTree: testModuleInline(t, map[string]string{ 40 "main.tf": ` 41 variable "amap" { 42 type = "map" 43 } 44 `, 45 }), 46 }, 47 ExpectVars: map[string]interface{}{ 48 "amap": map[string]interface{}{"foo": "bar"}, 49 }, 50 }, 51 "a list w/ more than one map element is untouched": { 52 Input: &EvalCoerceMapVariable{ 53 Variables: map[string]interface{}{ 54 "amap": []interface{}{ 55 map[string]interface{}{"foo": "bar"}, 56 map[string]interface{}{"baz": "qux"}, 57 }, 58 }, 59 ModulePath: []string{"root"}, 60 ModuleTree: testModuleInline(t, map[string]string{ 61 "main.tf": ` 62 variable "amap" { 63 type = "map" 64 } 65 `, 66 }), 67 }, 68 ExpectVars: map[string]interface{}{ 69 "amap": []interface{}{ 70 map[string]interface{}{"foo": "bar"}, 71 map[string]interface{}{"baz": "qux"}, 72 }, 73 }, 74 }, 75 "list coercion also works in a module": { 76 Input: &EvalCoerceMapVariable{ 77 Variables: map[string]interface{}{ 78 "amap": []interface{}{ 79 map[string]interface{}{"foo": "bar"}, 80 }, 81 }, 82 ModulePath: []string{"root", "middle", "bottom"}, 83 ModuleTree: testModuleInline(t, map[string]string{ 84 "top.tf": ` 85 module "middle" { 86 source = "./middle" 87 } 88 `, 89 "middle/mid.tf": ` 90 module "bottom" { 91 source = "./bottom" 92 amap { 93 foo = "bar" 94 } 95 } 96 `, 97 "middle/bottom/bot.tf": ` 98 variable "amap" { 99 type = "map" 100 } 101 `, 102 }), 103 }, 104 ExpectVars: map[string]interface{}{ 105 "amap": map[string]interface{}{"foo": "bar"}, 106 }, 107 }, 108 "coercion only occurs when target var is a map": { 109 Input: &EvalCoerceMapVariable{ 110 Variables: map[string]interface{}{ 111 "alist": []interface{}{ 112 map[string]interface{}{"foo": "bar"}, 113 }, 114 }, 115 ModulePath: []string{"root"}, 116 ModuleTree: testModuleInline(t, map[string]string{ 117 "main.tf": ` 118 variable "alist" { 119 type = "list" 120 } 121 `, 122 }), 123 }, 124 ExpectVars: map[string]interface{}{ 125 "alist": []interface{}{ 126 map[string]interface{}{"foo": "bar"}, 127 }, 128 }, 129 }, 130 } 131 132 for tn, tc := range cases { 133 _, err := tc.Input.Eval(&MockEvalContext{}) 134 if err != nil { 135 t.Fatalf("%s: Unexpected err: %s", tn, err) 136 } 137 if !reflect.DeepEqual(tc.Input.Variables, tc.ExpectVars) { 138 t.Fatalf("%s: Expected variables:\n\n%#v\n\nGot:\n\n%#v", 139 tn, tc.ExpectVars, tc.Input.Variables) 140 } 141 } 142 }