github.com/arvindram03/terraform@v0.3.7-0.20150212015210-408f838db36d/helper/schema/field_reader_diff_test.go (about) 1 package schema 2 3 import ( 4 "reflect" 5 "testing" 6 7 "github.com/hashicorp/terraform/terraform" 8 ) 9 10 func TestDiffFieldReader_impl(t *testing.T) { 11 var _ FieldReader = new(DiffFieldReader) 12 } 13 14 // https://github.com/hashicorp/terraform/issues/914 15 func TestDiffFieldReader_MapHandling(t *testing.T) { 16 schema := map[string]*Schema{ 17 "tags": &Schema{ 18 Type: TypeMap, 19 }, 20 } 21 r := &DiffFieldReader{ 22 Schema: schema, 23 Diff: &terraform.InstanceDiff{ 24 Attributes: map[string]*terraform.ResourceAttrDiff{ 25 "tags.#": &terraform.ResourceAttrDiff{ 26 Old: "1", 27 New: "2", 28 }, 29 "tags.baz": &terraform.ResourceAttrDiff{ 30 Old: "", 31 New: "qux", 32 }, 33 }, 34 }, 35 Source: &MapFieldReader{ 36 Schema: schema, 37 Map: BasicMapReader(map[string]string{ 38 "tags.#": "1", 39 "tags.foo": "bar", 40 }), 41 }, 42 } 43 44 result, err := r.ReadField([]string{"tags"}) 45 if err != nil { 46 t.Fatalf("ReadField failed: %#v", err) 47 } 48 49 expected := map[string]interface{}{ 50 "foo": "bar", 51 "baz": "qux", 52 } 53 54 if !reflect.DeepEqual(expected, result.Value) { 55 t.Fatalf("bad: DiffHandling\n\nexpected: %#v\n\ngot: %#v\n\n", expected, result.Value) 56 } 57 } 58 59 func TestDiffFieldReader_extra(t *testing.T) { 60 schema := map[string]*Schema{ 61 "stringComputed": &Schema{Type: TypeString}, 62 63 "listMap": &Schema{ 64 Type: TypeList, 65 Elem: &Schema{ 66 Type: TypeMap, 67 }, 68 }, 69 70 "mapRemove": &Schema{Type: TypeMap}, 71 72 "setChange": &Schema{ 73 Type: TypeSet, 74 Optional: true, 75 Elem: &Resource{ 76 Schema: map[string]*Schema{ 77 "index": &Schema{ 78 Type: TypeInt, 79 Required: true, 80 }, 81 82 "value": &Schema{ 83 Type: TypeString, 84 Required: true, 85 }, 86 }, 87 }, 88 Set: func(a interface{}) int { 89 m := a.(map[string]interface{}) 90 return m["index"].(int) 91 }, 92 }, 93 } 94 95 r := &DiffFieldReader{ 96 Schema: schema, 97 Diff: &terraform.InstanceDiff{ 98 Attributes: map[string]*terraform.ResourceAttrDiff{ 99 "stringComputed": &terraform.ResourceAttrDiff{ 100 Old: "foo", 101 New: "bar", 102 NewComputed: true, 103 }, 104 105 "listMap.0.bar": &terraform.ResourceAttrDiff{ 106 NewRemoved: true, 107 }, 108 109 "mapRemove.bar": &terraform.ResourceAttrDiff{ 110 NewRemoved: true, 111 }, 112 113 "setChange.10.value": &terraform.ResourceAttrDiff{ 114 Old: "50", 115 New: "80", 116 }, 117 }, 118 }, 119 120 Source: &MapFieldReader{ 121 Schema: schema, 122 Map: BasicMapReader(map[string]string{ 123 "listMap.#": "2", 124 "listMap.0.foo": "bar", 125 "listMap.0.bar": "baz", 126 "listMap.1.baz": "baz", 127 128 "mapRemove.foo": "bar", 129 "mapRemove.bar": "bar", 130 131 "setChange.#": "1", 132 "setChange.10.index": "10", 133 "setChange.10.value": "50", 134 }), 135 }, 136 } 137 138 cases := map[string]struct { 139 Addr []string 140 Result FieldReadResult 141 Err bool 142 }{ 143 "stringComputed": { 144 []string{"stringComputed"}, 145 FieldReadResult{ 146 Value: "", 147 Exists: true, 148 Computed: true, 149 }, 150 false, 151 }, 152 153 "listMapRemoval": { 154 []string{"listMap"}, 155 FieldReadResult{ 156 Value: []interface{}{ 157 map[string]interface{}{ 158 "foo": "bar", 159 }, 160 map[string]interface{}{ 161 "baz": "baz", 162 }, 163 }, 164 Exists: true, 165 }, 166 false, 167 }, 168 169 "mapRemove": { 170 []string{"mapRemove"}, 171 FieldReadResult{ 172 Value: map[string]interface{}{ 173 "foo": "bar", 174 }, 175 Exists: true, 176 Computed: false, 177 }, 178 false, 179 }, 180 181 "setChange": { 182 []string{"setChange"}, 183 FieldReadResult{ 184 Value: []interface{}{ 185 map[string]interface{}{ 186 "index": 10, 187 "value": "80", 188 }, 189 }, 190 Exists: true, 191 }, 192 false, 193 }, 194 } 195 196 for name, tc := range cases { 197 out, err := r.ReadField(tc.Addr) 198 if (err != nil) != tc.Err { 199 t.Fatalf("%s: err: %s", name, err) 200 } 201 if s, ok := out.Value.(*Set); ok { 202 // If it is a set, convert to a list so its more easily checked. 203 out.Value = s.List() 204 } 205 if !reflect.DeepEqual(tc.Result, out) { 206 t.Fatalf("%s: bad: %#v", name, out) 207 } 208 } 209 } 210 211 func TestDiffFieldReader(t *testing.T) { 212 testFieldReader(t, func(s map[string]*Schema) FieldReader { 213 return &DiffFieldReader{ 214 Schema: s, 215 Diff: &terraform.InstanceDiff{ 216 Attributes: map[string]*terraform.ResourceAttrDiff{ 217 "bool": &terraform.ResourceAttrDiff{ 218 Old: "", 219 New: "true", 220 }, 221 222 "int": &terraform.ResourceAttrDiff{ 223 Old: "", 224 New: "42", 225 }, 226 227 "float": &terraform.ResourceAttrDiff{ 228 Old: "", 229 New: "3.1415", 230 }, 231 232 "string": &terraform.ResourceAttrDiff{ 233 Old: "", 234 New: "string", 235 }, 236 237 "stringComputed": &terraform.ResourceAttrDiff{ 238 Old: "foo", 239 New: "bar", 240 NewComputed: true, 241 }, 242 243 "list.#": &terraform.ResourceAttrDiff{ 244 Old: "0", 245 New: "2", 246 }, 247 248 "list.0": &terraform.ResourceAttrDiff{ 249 Old: "", 250 New: "foo", 251 }, 252 253 "list.1": &terraform.ResourceAttrDiff{ 254 Old: "", 255 New: "bar", 256 }, 257 258 "listInt.#": &terraform.ResourceAttrDiff{ 259 Old: "0", 260 New: "2", 261 }, 262 263 "listInt.0": &terraform.ResourceAttrDiff{ 264 Old: "", 265 New: "21", 266 }, 267 268 "listInt.1": &terraform.ResourceAttrDiff{ 269 Old: "", 270 New: "42", 271 }, 272 273 "map.foo": &terraform.ResourceAttrDiff{ 274 Old: "", 275 New: "bar", 276 }, 277 278 "map.bar": &terraform.ResourceAttrDiff{ 279 Old: "", 280 New: "baz", 281 }, 282 283 "set.#": &terraform.ResourceAttrDiff{ 284 Old: "0", 285 New: "2", 286 }, 287 288 "set.10": &terraform.ResourceAttrDiff{ 289 Old: "", 290 New: "10", 291 }, 292 293 "set.50": &terraform.ResourceAttrDiff{ 294 Old: "", 295 New: "50", 296 }, 297 298 "setDeep.#": &terraform.ResourceAttrDiff{ 299 Old: "0", 300 New: "2", 301 }, 302 303 "setDeep.10.index": &terraform.ResourceAttrDiff{ 304 Old: "", 305 New: "10", 306 }, 307 308 "setDeep.10.value": &terraform.ResourceAttrDiff{ 309 Old: "", 310 New: "foo", 311 }, 312 313 "setDeep.50.index": &terraform.ResourceAttrDiff{ 314 Old: "", 315 New: "50", 316 }, 317 318 "setDeep.50.value": &terraform.ResourceAttrDiff{ 319 Old: "", 320 New: "bar", 321 }, 322 }, 323 }, 324 325 Source: &MapFieldReader{ 326 Schema: s, 327 Map: BasicMapReader(map[string]string{ 328 "listMap.#": "2", 329 "listMap.0.foo": "bar", 330 "listMap.0.bar": "baz", 331 "listMap.1.baz": "baz", 332 }), 333 }, 334 } 335 }) 336 }