github.com/cycloidio/terraform@v1.1.10-0.20220513142504-76d5c768dc63/plans/changes_test.go (about)

     1  package plans
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/cycloidio/terraform/addrs"
     8  	"github.com/cycloidio/terraform/lang/marks"
     9  	"github.com/zclconf/go-cty/cty"
    10  )
    11  
    12  func TestChangesEmpty(t *testing.T) {
    13  	testCases := map[string]struct {
    14  		changes *Changes
    15  		want    bool
    16  	}{
    17  		"no changes": {
    18  			&Changes{},
    19  			true,
    20  		},
    21  		"resource change": {
    22  			&Changes{
    23  				Resources: []*ResourceInstanceChangeSrc{
    24  					{
    25  						Addr: addrs.Resource{
    26  							Mode: addrs.ManagedResourceMode,
    27  							Type: "test_thing",
    28  							Name: "woot",
    29  						}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance),
    30  						PrevRunAddr: addrs.Resource{
    31  							Mode: addrs.ManagedResourceMode,
    32  							Type: "test_thing",
    33  							Name: "woot",
    34  						}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance),
    35  						ChangeSrc: ChangeSrc{
    36  							Action: Update,
    37  						},
    38  					},
    39  				},
    40  			},
    41  			false,
    42  		},
    43  		"resource change with no-op action": {
    44  			&Changes{
    45  				Resources: []*ResourceInstanceChangeSrc{
    46  					{
    47  						Addr: addrs.Resource{
    48  							Mode: addrs.ManagedResourceMode,
    49  							Type: "test_thing",
    50  							Name: "woot",
    51  						}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance),
    52  						PrevRunAddr: addrs.Resource{
    53  							Mode: addrs.ManagedResourceMode,
    54  							Type: "test_thing",
    55  							Name: "woot",
    56  						}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance),
    57  						ChangeSrc: ChangeSrc{
    58  							Action: NoOp,
    59  						},
    60  					},
    61  				},
    62  			},
    63  			true,
    64  		},
    65  		"resource moved with no-op change": {
    66  			&Changes{
    67  				Resources: []*ResourceInstanceChangeSrc{
    68  					{
    69  						Addr: addrs.Resource{
    70  							Mode: addrs.ManagedResourceMode,
    71  							Type: "test_thing",
    72  							Name: "woot",
    73  						}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance),
    74  						PrevRunAddr: addrs.Resource{
    75  							Mode: addrs.ManagedResourceMode,
    76  							Type: "test_thing",
    77  							Name: "toot",
    78  						}.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance),
    79  						ChangeSrc: ChangeSrc{
    80  							Action: NoOp,
    81  						},
    82  					},
    83  				},
    84  			},
    85  			false,
    86  		},
    87  		"output change": {
    88  			&Changes{
    89  				Outputs: []*OutputChangeSrc{
    90  					{
    91  						Addr: addrs.OutputValue{
    92  							Name: "result",
    93  						}.Absolute(addrs.RootModuleInstance),
    94  						ChangeSrc: ChangeSrc{
    95  							Action: Update,
    96  						},
    97  					},
    98  				},
    99  			},
   100  			false,
   101  		},
   102  		"output change no-op": {
   103  			&Changes{
   104  				Outputs: []*OutputChangeSrc{
   105  					{
   106  						Addr: addrs.OutputValue{
   107  							Name: "result",
   108  						}.Absolute(addrs.RootModuleInstance),
   109  						ChangeSrc: ChangeSrc{
   110  							Action: NoOp,
   111  						},
   112  					},
   113  				},
   114  			},
   115  			true,
   116  		},
   117  	}
   118  
   119  	for name, tc := range testCases {
   120  		t.Run(name, func(t *testing.T) {
   121  			if got, want := tc.changes.Empty(), tc.want; got != want {
   122  				t.Fatalf("unexpected result: got %v, want %v", got, want)
   123  			}
   124  		})
   125  	}
   126  }
   127  
   128  func TestChangeEncodeSensitive(t *testing.T) {
   129  	testVals := []cty.Value{
   130  		cty.ObjectVal(map[string]cty.Value{
   131  			"ding": cty.StringVal("dong").Mark(marks.Sensitive),
   132  		}),
   133  		cty.StringVal("bleep").Mark("bloop"),
   134  		cty.ListVal([]cty.Value{cty.UnknownVal(cty.String).Mark("sup?")}),
   135  	}
   136  
   137  	for _, v := range testVals {
   138  		t.Run(fmt.Sprintf("%#v", v), func(t *testing.T) {
   139  			change := Change{
   140  				Before: cty.NullVal(v.Type()),
   141  				After:  v,
   142  			}
   143  
   144  			encoded, err := change.Encode(v.Type())
   145  			if err != nil {
   146  				t.Fatal(err)
   147  			}
   148  
   149  			decoded, err := encoded.Decode(v.Type())
   150  			if err != nil {
   151  				t.Fatal(err)
   152  			}
   153  
   154  			if !v.RawEquals(decoded.After) {
   155  				t.Fatalf("%#v != %#v\n", decoded.After, v)
   156  			}
   157  		})
   158  	}
   159  }