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 }