github.com/muratcelep/terraform@v1.1.0-beta2-not-internal-4/not-internal/command/jsonplan/plan_test.go (about)

     1  package jsonplan
     2  
     3  import (
     4  	"encoding/json"
     5  	"reflect"
     6  	"testing"
     7  
     8  	"github.com/google/go-cmp/cmp"
     9  	"github.com/zclconf/go-cty/cty"
    10  )
    11  
    12  func TestOmitUnknowns(t *testing.T) {
    13  	tests := []struct {
    14  		Input cty.Value
    15  		Want  cty.Value
    16  	}{
    17  		{
    18  			cty.StringVal("hello"),
    19  			cty.StringVal("hello"),
    20  		},
    21  		{
    22  			cty.NullVal(cty.String),
    23  			cty.NullVal(cty.String),
    24  		},
    25  		{
    26  			cty.UnknownVal(cty.String),
    27  			cty.NilVal,
    28  		},
    29  		{
    30  			cty.ListValEmpty(cty.String),
    31  			cty.EmptyTupleVal,
    32  		},
    33  		{
    34  			cty.ListVal([]cty.Value{cty.StringVal("hello")}),
    35  			cty.TupleVal([]cty.Value{cty.StringVal("hello")}),
    36  		},
    37  		{
    38  			cty.ListVal([]cty.Value{cty.NullVal(cty.String)}),
    39  			cty.TupleVal([]cty.Value{cty.NullVal(cty.String)}),
    40  		},
    41  		{
    42  			cty.ListVal([]cty.Value{cty.UnknownVal(cty.String)}),
    43  			cty.TupleVal([]cty.Value{cty.NullVal(cty.String)}),
    44  		},
    45  		{
    46  			cty.ListVal([]cty.Value{cty.StringVal("hello")}),
    47  			cty.TupleVal([]cty.Value{cty.StringVal("hello")}),
    48  		},
    49  		//
    50  		{
    51  			cty.ListVal([]cty.Value{
    52  				cty.StringVal("hello"),
    53  				cty.UnknownVal(cty.String)}),
    54  			cty.TupleVal([]cty.Value{
    55  				cty.StringVal("hello"),
    56  				cty.NullVal(cty.String),
    57  			}),
    58  		},
    59  		{
    60  			cty.MapVal(map[string]cty.Value{
    61  				"hello": cty.True,
    62  				"world": cty.UnknownVal(cty.Bool),
    63  			}),
    64  			cty.ObjectVal(map[string]cty.Value{
    65  				"hello": cty.True,
    66  			}),
    67  		},
    68  		{
    69  			cty.SetVal([]cty.Value{
    70  				cty.StringVal("dev"),
    71  				cty.StringVal("foo"),
    72  				cty.StringVal("stg"),
    73  				cty.UnknownVal(cty.String),
    74  			}),
    75  			cty.TupleVal([]cty.Value{
    76  				cty.StringVal("dev"),
    77  				cty.StringVal("foo"),
    78  				cty.StringVal("stg"),
    79  			}),
    80  		},
    81  		{
    82  			cty.SetVal([]cty.Value{
    83  				cty.ObjectVal(map[string]cty.Value{
    84  					"a": cty.UnknownVal(cty.String),
    85  				}),
    86  				cty.ObjectVal(map[string]cty.Value{
    87  					"a": cty.StringVal("known"),
    88  				}),
    89  			}),
    90  			cty.TupleVal([]cty.Value{
    91  				cty.ObjectVal(map[string]cty.Value{
    92  					"a": cty.StringVal("known"),
    93  				}),
    94  				cty.EmptyObjectVal,
    95  			}),
    96  		},
    97  	}
    98  
    99  	for _, test := range tests {
   100  		got := omitUnknowns(test.Input)
   101  		if !reflect.DeepEqual(got, test.Want) {
   102  			t.Errorf(
   103  				"wrong result\ninput: %#v\ngot:   %#v\nwant:  %#v",
   104  				test.Input, got, test.Want,
   105  			)
   106  		}
   107  	}
   108  }
   109  
   110  func TestUnknownAsBool(t *testing.T) {
   111  	tests := []struct {
   112  		Input cty.Value
   113  		Want  cty.Value
   114  	}{
   115  		{
   116  			cty.StringVal("hello"),
   117  			cty.False,
   118  		},
   119  		{
   120  			cty.NullVal(cty.String),
   121  			cty.False,
   122  		},
   123  		{
   124  			cty.UnknownVal(cty.String),
   125  			cty.True,
   126  		},
   127  
   128  		{
   129  			cty.NullVal(cty.DynamicPseudoType),
   130  			cty.False,
   131  		},
   132  		{
   133  			cty.NullVal(cty.Object(map[string]cty.Type{"test": cty.String})),
   134  			cty.False,
   135  		},
   136  		{
   137  			cty.DynamicVal,
   138  			cty.True,
   139  		},
   140  
   141  		{
   142  			cty.ListValEmpty(cty.String),
   143  			cty.EmptyTupleVal,
   144  		},
   145  		{
   146  			cty.ListVal([]cty.Value{cty.StringVal("hello")}),
   147  			cty.TupleVal([]cty.Value{cty.False}),
   148  		},
   149  		{
   150  			cty.ListVal([]cty.Value{cty.NullVal(cty.String)}),
   151  			cty.TupleVal([]cty.Value{cty.False}),
   152  		},
   153  		{
   154  			cty.ListVal([]cty.Value{cty.UnknownVal(cty.String)}),
   155  			cty.TupleVal([]cty.Value{cty.True}),
   156  		},
   157  		{
   158  			cty.SetValEmpty(cty.String),
   159  			cty.EmptyTupleVal,
   160  		},
   161  		{
   162  			cty.SetVal([]cty.Value{cty.StringVal("hello")}),
   163  			cty.TupleVal([]cty.Value{cty.False}),
   164  		},
   165  		{
   166  			cty.SetVal([]cty.Value{cty.NullVal(cty.String)}),
   167  			cty.TupleVal([]cty.Value{cty.False}),
   168  		},
   169  		{
   170  			cty.SetVal([]cty.Value{cty.UnknownVal(cty.String)}),
   171  			cty.TupleVal([]cty.Value{cty.True}),
   172  		},
   173  		{
   174  			cty.EmptyTupleVal,
   175  			cty.EmptyTupleVal,
   176  		},
   177  		{
   178  			cty.TupleVal([]cty.Value{cty.StringVal("hello")}),
   179  			cty.TupleVal([]cty.Value{cty.False}),
   180  		},
   181  		{
   182  			cty.TupleVal([]cty.Value{cty.NullVal(cty.String)}),
   183  			cty.TupleVal([]cty.Value{cty.False}),
   184  		},
   185  		{
   186  			cty.TupleVal([]cty.Value{cty.UnknownVal(cty.String)}),
   187  			cty.TupleVal([]cty.Value{cty.True}),
   188  		},
   189  		{
   190  			cty.MapValEmpty(cty.String),
   191  			cty.EmptyObjectVal,
   192  		},
   193  		{
   194  			cty.MapVal(map[string]cty.Value{"greeting": cty.StringVal("hello")}),
   195  			cty.EmptyObjectVal,
   196  		},
   197  		{
   198  			cty.MapVal(map[string]cty.Value{"greeting": cty.NullVal(cty.String)}),
   199  			cty.EmptyObjectVal,
   200  		},
   201  		{
   202  			cty.MapVal(map[string]cty.Value{"greeting": cty.UnknownVal(cty.String)}),
   203  			cty.ObjectVal(map[string]cty.Value{"greeting": cty.True}),
   204  		},
   205  		{
   206  			cty.EmptyObjectVal,
   207  			cty.EmptyObjectVal,
   208  		},
   209  		{
   210  			cty.ObjectVal(map[string]cty.Value{"greeting": cty.StringVal("hello")}),
   211  			cty.EmptyObjectVal,
   212  		},
   213  		{
   214  			cty.ObjectVal(map[string]cty.Value{"greeting": cty.NullVal(cty.String)}),
   215  			cty.EmptyObjectVal,
   216  		},
   217  		{
   218  			cty.ObjectVal(map[string]cty.Value{"greeting": cty.UnknownVal(cty.String)}),
   219  			cty.ObjectVal(map[string]cty.Value{"greeting": cty.True}),
   220  		},
   221  		{
   222  			cty.SetVal([]cty.Value{
   223  				cty.ObjectVal(map[string]cty.Value{
   224  					"a": cty.UnknownVal(cty.String),
   225  				}),
   226  				cty.ObjectVal(map[string]cty.Value{
   227  					"a": cty.StringVal("known"),
   228  				}),
   229  			}),
   230  			cty.TupleVal([]cty.Value{
   231  				cty.EmptyObjectVal,
   232  				cty.ObjectVal(map[string]cty.Value{
   233  					"a": cty.True,
   234  				}),
   235  			}),
   236  		},
   237  		{
   238  			cty.SetVal([]cty.Value{
   239  				cty.MapValEmpty(cty.String),
   240  				cty.MapVal(map[string]cty.Value{
   241  					"a": cty.StringVal("known"),
   242  				}),
   243  				cty.MapVal(map[string]cty.Value{
   244  					"a": cty.UnknownVal(cty.String),
   245  				}),
   246  			}),
   247  			cty.TupleVal([]cty.Value{
   248  				cty.EmptyObjectVal,
   249  				cty.ObjectVal(map[string]cty.Value{
   250  					"a": cty.True,
   251  				}),
   252  				cty.EmptyObjectVal,
   253  			}),
   254  		},
   255  	}
   256  
   257  	for _, test := range tests {
   258  		got := unknownAsBool(test.Input)
   259  		if !reflect.DeepEqual(got, test.Want) {
   260  			t.Errorf(
   261  				"wrong result\ninput: %#v\ngot:   %#v\nwant:  %#v",
   262  				test.Input, got, test.Want,
   263  			)
   264  		}
   265  	}
   266  }
   267  
   268  func TestEncodePaths(t *testing.T) {
   269  	tests := map[string]struct {
   270  		Input cty.PathSet
   271  		Want  json.RawMessage
   272  	}{
   273  		"empty set": {
   274  			cty.NewPathSet(),
   275  			json.RawMessage(nil),
   276  		},
   277  		"index path with string and int steps": {
   278  			cty.NewPathSet(cty.IndexStringPath("boop").IndexInt(0)),
   279  			json.RawMessage(`[["boop",0]]`),
   280  		},
   281  		"get attr path with one step": {
   282  			cty.NewPathSet(cty.GetAttrPath("triggers")),
   283  			json.RawMessage(`[["triggers"]]`),
   284  		},
   285  		"multiple paths of different types": {
   286  			cty.NewPathSet(
   287  				cty.GetAttrPath("alpha").GetAttr("beta").GetAttr("gamma"),
   288  				cty.GetAttrPath("triggers").IndexString("name"),
   289  				cty.IndexIntPath(0).IndexInt(1).IndexInt(2).IndexInt(3),
   290  			),
   291  			json.RawMessage(`[["alpha","beta","gamma"],["triggers","name"],[0,1,2,3]]`),
   292  		},
   293  	}
   294  
   295  	for name, test := range tests {
   296  		t.Run(name, func(t *testing.T) {
   297  			got, err := encodePaths(test.Input)
   298  			if err != nil {
   299  				t.Fatalf("unexpected error: %s", err)
   300  			}
   301  			if !cmp.Equal(got, test.Want) {
   302  				t.Errorf("wrong result:\n %v\n", cmp.Diff(got, test.Want))
   303  			}
   304  		})
   305  	}
   306  }