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 }