| package terraform |
| |
| import ( |
| "reflect" |
| "testing" |
| |
| "github.com/zclconf/go-cty/cty" |
| ) |
| |
| func TestStripRemovedStateAttributes(t *testing.T) { |
| cases := []struct { |
| name string |
| state map[string]interface{} |
| expect map[string]interface{} |
| ty cty.Type |
| modified bool |
| }{ |
| { |
| "removed string", |
| map[string]interface{}{ |
| "a": "ok", |
| "b": "gone", |
| }, |
| map[string]interface{}{ |
| "a": "ok", |
| }, |
| cty.Object(map[string]cty.Type{ |
| "a": cty.String, |
| }), |
| true, |
| }, |
| { |
| "removed null", |
| map[string]interface{}{ |
| "a": "ok", |
| "b": nil, |
| }, |
| map[string]interface{}{ |
| "a": "ok", |
| }, |
| cty.Object(map[string]cty.Type{ |
| "a": cty.String, |
| }), |
| true, |
| }, |
| { |
| "removed nested string", |
| map[string]interface{}{ |
| "a": "ok", |
| "b": map[string]interface{}{ |
| "a": "ok", |
| "b": "removed", |
| }, |
| }, |
| map[string]interface{}{ |
| "a": "ok", |
| "b": map[string]interface{}{ |
| "a": "ok", |
| }, |
| }, |
| cty.Object(map[string]cty.Type{ |
| "a": cty.String, |
| "b": cty.Object(map[string]cty.Type{ |
| "a": cty.String, |
| }), |
| }), |
| true, |
| }, |
| { |
| "removed nested list", |
| map[string]interface{}{ |
| "a": "ok", |
| "b": map[string]interface{}{ |
| "a": "ok", |
| "b": []interface{}{"removed"}, |
| }, |
| }, |
| map[string]interface{}{ |
| "a": "ok", |
| "b": map[string]interface{}{ |
| "a": "ok", |
| }, |
| }, |
| cty.Object(map[string]cty.Type{ |
| "a": cty.String, |
| "b": cty.Object(map[string]cty.Type{ |
| "a": cty.String, |
| }), |
| }), |
| true, |
| }, |
| { |
| "removed keys in set of objs", |
| map[string]interface{}{ |
| "a": "ok", |
| "b": map[string]interface{}{ |
| "a": "ok", |
| "set": []interface{}{ |
| map[string]interface{}{ |
| "x": "ok", |
| "y": "removed", |
| }, |
| map[string]interface{}{ |
| "x": "ok", |
| "y": "removed", |
| }, |
| }, |
| }, |
| }, |
| map[string]interface{}{ |
| "a": "ok", |
| "b": map[string]interface{}{ |
| "a": "ok", |
| "set": []interface{}{ |
| map[string]interface{}{ |
| "x": "ok", |
| }, |
| map[string]interface{}{ |
| "x": "ok", |
| }, |
| }, |
| }, |
| }, |
| cty.Object(map[string]cty.Type{ |
| "a": cty.String, |
| "b": cty.Object(map[string]cty.Type{ |
| "a": cty.String, |
| "set": cty.Set(cty.Object(map[string]cty.Type{ |
| "x": cty.String, |
| })), |
| }), |
| }), |
| true, |
| }, |
| } |
| |
| for _, tc := range cases { |
| t.Run(tc.name, func(t *testing.T) { |
| modified := removeRemovedAttrs(tc.state, tc.ty) |
| if !reflect.DeepEqual(tc.state, tc.expect) { |
| t.Fatalf("expected: %#v\n got: %#v\n", tc.expect, tc.state) |
| } |
| if modified != tc.modified { |
| t.Fatal("incorrect return value") |
| } |
| }) |
| } |
| } |