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  }