github.com/khulnasoft-lab/defsec@v1.0.5-0.20230827010352-5e9f46893d95/pkg/scanners/terraform/context/context_test.go (about) 1 package context 2 3 import ( 4 "testing" 5 6 "github.com/hashicorp/hcl/v2" 7 "github.com/stretchr/testify/assert" 8 "github.com/zclconf/go-cty/cty" 9 "github.com/zclconf/go-cty/cty/gocty" 10 ) 11 12 func Test_ContextVariables(t *testing.T) { 13 underlying := &hcl.EvalContext{} 14 ctx := NewContext(underlying, nil) 15 16 val, err := gocty.ToCtyValue("hello", cty.String) 17 if err != nil { 18 t.Fatal(err) 19 } 20 21 ctx.Set(val, "my", "value") 22 value := underlying.Variables["my"].AsValueMap()["value"] 23 assert.Equal(t, "hello", value.AsString()) 24 25 } 26 27 func Test_ContextVariablesPreservation(t *testing.T) { 28 29 underlying := &hcl.EvalContext{} 30 underlying.Variables = make(map[string]cty.Value) 31 underlying.Variables["x"], _ = gocty.ToCtyValue("does it work?", cty.String) 32 str, _ := gocty.ToCtyValue("something", cty.String) 33 underlying.Variables["my"] = cty.ObjectVal(map[string]cty.Value{ 34 "other": str, 35 "obj": cty.ObjectVal(map[string]cty.Value{ 36 "another": str, 37 }), 38 }) 39 ctx := NewContext(underlying, nil) 40 41 val, err := gocty.ToCtyValue("hello", cty.String) 42 if err != nil { 43 t.Fatal(err) 44 } 45 46 ctx.Set(val, "my", "value") 47 assert.Equal(t, "hello", underlying.Variables["my"].AsValueMap()["value"].AsString()) 48 assert.Equal(t, "something", underlying.Variables["my"].AsValueMap()["other"].AsString()) 49 assert.Equal(t, "something", underlying.Variables["my"].AsValueMap()["obj"].AsValueMap()["another"].AsString()) 50 assert.Equal(t, "does it work?", underlying.Variables["x"].AsString()) 51 52 } 53 54 func Test_ContextVariablesPreservationByDot(t *testing.T) { 55 56 underlying := &hcl.EvalContext{} 57 underlying.Variables = make(map[string]cty.Value) 58 underlying.Variables["x"], _ = gocty.ToCtyValue("does it work?", cty.String) 59 str, _ := gocty.ToCtyValue("something", cty.String) 60 underlying.Variables["my"] = cty.ObjectVal(map[string]cty.Value{ 61 "other": str, 62 "obj": cty.ObjectVal(map[string]cty.Value{ 63 "another": str, 64 }), 65 }) 66 ctx := NewContext(underlying, nil) 67 68 val, err := gocty.ToCtyValue("hello", cty.String) 69 if err != nil { 70 t.Fatal(err) 71 } 72 73 ctx.SetByDot(val, "my.something.value") 74 assert.Equal(t, "hello", underlying.Variables["my"].AsValueMap()["something"].AsValueMap()["value"].AsString()) 75 assert.Equal(t, "something", underlying.Variables["my"].AsValueMap()["other"].AsString()) 76 assert.Equal(t, "something", underlying.Variables["my"].AsValueMap()["obj"].AsValueMap()["another"].AsString()) 77 assert.Equal(t, "does it work?", underlying.Variables["x"].AsString()) 78 } 79 80 func Test_ContextSetThenImmediateGet(t *testing.T) { 81 82 underlying := &hcl.EvalContext{} 83 84 ctx := NewContext(underlying, nil) 85 86 ctx.Set(cty.ObjectVal(map[string]cty.Value{ 87 "mod_result": cty.StringVal("ok"), 88 }), "module", "modulename") 89 90 val := ctx.Get("module", "modulename", "mod_result") 91 assert.Equal(t, "ok", val.AsString()) 92 } 93 94 func Test_ContextSetThenImmediateGetWithChild(t *testing.T) { 95 96 underlying := &hcl.EvalContext{} 97 98 ctx := NewContext(underlying, nil) 99 100 childCtx := ctx.NewChild() 101 102 childCtx.Root().Set(cty.ObjectVal(map[string]cty.Value{ 103 "mod_result": cty.StringVal("ok"), 104 }), "module", "modulename") 105 106 val := ctx.Get("module", "modulename", "mod_result") 107 assert.Equal(t, "ok", val.AsString()) 108 }