github.com/renier/terraform@v0.7.8-0.20161024133817-eb8a9ef5471a/command/flag_kv_test.go (about) 1 package command 2 3 import ( 4 "flag" 5 "io/ioutil" 6 "reflect" 7 "testing" 8 9 "github.com/davecgh/go-spew/spew" 10 ) 11 12 func TestFlagStringKV_impl(t *testing.T) { 13 var _ flag.Value = new(FlagStringKV) 14 } 15 16 func TestFlagStringKV(t *testing.T) { 17 cases := []struct { 18 Input string 19 Output map[string]string 20 Error bool 21 }{ 22 { 23 "key=value", 24 map[string]string{"key": "value"}, 25 false, 26 }, 27 28 { 29 "key=", 30 map[string]string{"key": ""}, 31 false, 32 }, 33 34 { 35 "key=foo=bar", 36 map[string]string{"key": "foo=bar"}, 37 false, 38 }, 39 40 { 41 "map.key=foo", 42 map[string]string{"map.key": "foo"}, 43 false, 44 }, 45 46 { 47 "key", 48 nil, 49 true, 50 }, 51 52 { 53 "key=/path", 54 map[string]string{"key": "/path"}, 55 false, 56 }, 57 } 58 59 for _, tc := range cases { 60 f := new(FlagStringKV) 61 err := f.Set(tc.Input) 62 if err != nil != tc.Error { 63 t.Fatalf("bad error. Input: %#v\n\nError: %s", tc.Input, err) 64 } 65 66 actual := map[string]string(*f) 67 if !reflect.DeepEqual(actual, tc.Output) { 68 t.Fatalf("bad: %#v", actual) 69 } 70 } 71 } 72 73 func TestFlagTypedKV_impl(t *testing.T) { 74 var _ flag.Value = new(FlagTypedKV) 75 } 76 77 func TestFlagTypedKV(t *testing.T) { 78 cases := []struct { 79 Input string 80 Output map[string]interface{} 81 Error bool 82 }{ 83 { 84 "key=value", 85 map[string]interface{}{"key": "value"}, 86 false, 87 }, 88 89 { 90 "key=", 91 map[string]interface{}{"key": ""}, 92 false, 93 }, 94 95 { 96 "key=foo=bar", 97 map[string]interface{}{"key": "foo=bar"}, 98 false, 99 }, 100 101 { 102 "map.key=foo", 103 map[string]interface{}{"map.key": "foo"}, 104 false, 105 }, 106 107 { 108 "key", 109 nil, 110 true, 111 }, 112 113 { 114 `key=["hello", "world"]`, 115 map[string]interface{}{"key": []interface{}{"hello", "world"}}, 116 false, 117 }, 118 119 { 120 `key={"hello" = "world", "foo" = "bar"}`, 121 map[string]interface{}{ 122 "key": map[string]interface{}{ 123 "hello": "world", 124 "foo": "bar", 125 }, 126 }, 127 false, 128 }, 129 130 { 131 `key={"hello" = "world", "foo" = "bar"}\nkey2="invalid"`, 132 nil, 133 true, 134 }, 135 136 { 137 "key=/path", 138 map[string]interface{}{"key": "/path"}, 139 false, 140 }, 141 142 { 143 "key=1234.dkr.ecr.us-east-1.amazonaws.com/proj:abcdef", 144 map[string]interface{}{"key": "1234.dkr.ecr.us-east-1.amazonaws.com/proj:abcdef"}, 145 false, 146 }, 147 148 // simple values that can parse as numbers should remain strings 149 { 150 "key=1", 151 map[string]interface{}{ 152 "key": "1", 153 }, 154 false, 155 }, 156 { 157 "key=1.0", 158 map[string]interface{}{ 159 "key": "1.0", 160 }, 161 false, 162 }, 163 { 164 "key=0x10", 165 map[string]interface{}{ 166 "key": "0x10", 167 }, 168 false, 169 }, 170 } 171 172 for _, tc := range cases { 173 f := new(FlagTypedKV) 174 err := f.Set(tc.Input) 175 if err != nil != tc.Error { 176 t.Fatalf("bad error. Input: %#v\n\nError: %s", tc.Input, err) 177 } 178 179 actual := map[string]interface{}(*f) 180 if !reflect.DeepEqual(actual, tc.Output) { 181 t.Fatalf("bad:\nexpected: %s\n\n got: %s\n", spew.Sdump(tc.Output), spew.Sdump(actual)) 182 } 183 } 184 } 185 186 func TestFlagKVFile_impl(t *testing.T) { 187 var _ flag.Value = new(FlagKVFile) 188 } 189 190 func TestFlagKVFile(t *testing.T) { 191 inputLibucl := ` 192 foo = "bar" 193 ` 194 inputMap := ` 195 foo = { 196 k = "v" 197 }` 198 199 inputJson := `{ 200 "foo": "bar"}` 201 202 cases := []struct { 203 Input string 204 Output map[string]interface{} 205 Error bool 206 }{ 207 { 208 inputLibucl, 209 map[string]interface{}{"foo": "bar"}, 210 false, 211 }, 212 213 { 214 inputJson, 215 map[string]interface{}{"foo": "bar"}, 216 false, 217 }, 218 219 { 220 `map.key = "foo"`, 221 map[string]interface{}{"map.key": "foo"}, 222 false, 223 }, 224 225 { 226 inputMap, 227 map[string]interface{}{ 228 "foo": map[string]interface{}{ 229 "k": "v", 230 }, 231 }, 232 false, 233 }, 234 } 235 236 path := testTempFile(t) 237 238 for _, tc := range cases { 239 if err := ioutil.WriteFile(path, []byte(tc.Input), 0644); err != nil { 240 t.Fatalf("err: %s", err) 241 } 242 243 f := new(FlagKVFile) 244 err := f.Set(path) 245 if err != nil != tc.Error { 246 t.Fatalf("bad error. Input: %#v, err: %s", tc.Input, err) 247 } 248 249 actual := map[string]interface{}(*f) 250 if !reflect.DeepEqual(actual, tc.Output) { 251 t.Fatalf("bad: %#v", actual) 252 } 253 } 254 }