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  }