github.com/mehmetalisavas/terraform@v0.7.10/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 "key=false", 103 map[string]interface{}{"key": "false"}, 104 false, 105 }, 106 107 { 108 "map.key=foo", 109 map[string]interface{}{"map.key": "foo"}, 110 false, 111 }, 112 113 { 114 "key", 115 nil, 116 true, 117 }, 118 119 { 120 `key=["hello", "world"]`, 121 map[string]interface{}{"key": []interface{}{"hello", "world"}}, 122 false, 123 }, 124 125 { 126 `key={"hello" = "world", "foo" = "bar"}`, 127 map[string]interface{}{ 128 "key": map[string]interface{}{ 129 "hello": "world", 130 "foo": "bar", 131 }, 132 }, 133 false, 134 }, 135 136 { 137 `key={"hello" = "world", "foo" = "bar"}\nkey2="invalid"`, 138 nil, 139 true, 140 }, 141 142 { 143 "key=/path", 144 map[string]interface{}{"key": "/path"}, 145 false, 146 }, 147 148 { 149 "key=1234.dkr.ecr.us-east-1.amazonaws.com/proj:abcdef", 150 map[string]interface{}{"key": "1234.dkr.ecr.us-east-1.amazonaws.com/proj:abcdef"}, 151 false, 152 }, 153 154 // simple values that can parse as numbers should remain strings 155 { 156 "key=1", 157 map[string]interface{}{ 158 "key": "1", 159 }, 160 false, 161 }, 162 { 163 "key=1.0", 164 map[string]interface{}{ 165 "key": "1.0", 166 }, 167 false, 168 }, 169 { 170 "key=0x10", 171 map[string]interface{}{ 172 "key": "0x10", 173 }, 174 false, 175 }, 176 } 177 178 for _, tc := range cases { 179 f := new(FlagTypedKV) 180 err := f.Set(tc.Input) 181 if err != nil != tc.Error { 182 t.Fatalf("bad error. Input: %#v\n\nError: %s", tc.Input, err) 183 } 184 185 actual := map[string]interface{}(*f) 186 if !reflect.DeepEqual(actual, tc.Output) { 187 t.Fatalf("bad:\nexpected: %s\n\n got: %s\n", spew.Sdump(tc.Output), spew.Sdump(actual)) 188 } 189 } 190 } 191 192 func TestFlagKVFile_impl(t *testing.T) { 193 var _ flag.Value = new(FlagKVFile) 194 } 195 196 func TestFlagKVFile(t *testing.T) { 197 inputLibucl := ` 198 foo = "bar" 199 ` 200 inputMap := ` 201 foo = { 202 k = "v" 203 }` 204 205 inputJson := `{ 206 "foo": "bar"}` 207 208 cases := []struct { 209 Input string 210 Output map[string]interface{} 211 Error bool 212 }{ 213 { 214 inputLibucl, 215 map[string]interface{}{"foo": "bar"}, 216 false, 217 }, 218 219 { 220 inputJson, 221 map[string]interface{}{"foo": "bar"}, 222 false, 223 }, 224 225 { 226 `map.key = "foo"`, 227 map[string]interface{}{"map.key": "foo"}, 228 false, 229 }, 230 231 { 232 inputMap, 233 map[string]interface{}{ 234 "foo": map[string]interface{}{ 235 "k": "v", 236 }, 237 }, 238 false, 239 }, 240 } 241 242 path := testTempFile(t) 243 244 for _, tc := range cases { 245 if err := ioutil.WriteFile(path, []byte(tc.Input), 0644); err != nil { 246 t.Fatalf("err: %s", err) 247 } 248 249 f := new(FlagKVFile) 250 err := f.Set(path) 251 if err != nil != tc.Error { 252 t.Fatalf("bad error. Input: %#v, err: %s", tc.Input, err) 253 } 254 255 actual := map[string]interface{}(*f) 256 if !reflect.DeepEqual(actual, tc.Output) { 257 t.Fatalf("bad: %#v", actual) 258 } 259 } 260 }