github.com/hashicorp/packer@v1.14.3/hcl2template/shim/values_test.go (about)

     1  // Copyright (c) HashiCorp, Inc.
     2  // SPDX-License-Identifier: BUSL-1.1
     3  
     4  package hcl2shim
     5  
     6  import (
     7  	"fmt"
     8  	"reflect"
     9  	"testing"
    10  
    11  	"github.com/hashicorp/packer-plugin-sdk/hcl2helper"
    12  	"github.com/zclconf/go-cty/cty"
    13  )
    14  
    15  func TestConfigValueFromHCL2(t *testing.T) {
    16  	tests := []struct {
    17  		Input cty.Value
    18  		Want  interface{}
    19  	}{
    20  		{
    21  			cty.True,
    22  			true,
    23  		},
    24  		{
    25  			cty.False,
    26  			false,
    27  		},
    28  		{
    29  			cty.NumberIntVal(12),
    30  			int(12),
    31  		},
    32  		{
    33  			cty.NumberFloatVal(12.5),
    34  			float64(12.5),
    35  		},
    36  		{
    37  			cty.StringVal("hello world"),
    38  			"hello world",
    39  		},
    40  		{
    41  			cty.ObjectVal(map[string]cty.Value{
    42  				"name": cty.StringVal("Ermintrude"),
    43  				"age":  cty.NumberIntVal(19),
    44  				"address": cty.ObjectVal(map[string]cty.Value{
    45  					"street": cty.ListVal([]cty.Value{cty.StringVal("421 Shoreham Loop")}),
    46  					"city":   cty.StringVal("Fridgewater"),
    47  					"state":  cty.StringVal("MA"),
    48  					"zip":    cty.StringVal("91037"),
    49  				}),
    50  			}),
    51  			map[string]interface{}{
    52  				"name": "Ermintrude",
    53  				"age":  int(19),
    54  				"address": map[string]interface{}{
    55  					"street": []interface{}{"421 Shoreham Loop"},
    56  					"city":   "Fridgewater",
    57  					"state":  "MA",
    58  					"zip":    "91037",
    59  				},
    60  			},
    61  		},
    62  		{
    63  			cty.MapVal(map[string]cty.Value{
    64  				"foo": cty.StringVal("bar"),
    65  				"bar": cty.StringVal("baz"),
    66  			}),
    67  			map[string]interface{}{
    68  				"foo": "bar",
    69  				"bar": "baz",
    70  			},
    71  		},
    72  		{
    73  			cty.TupleVal([]cty.Value{
    74  				cty.StringVal("foo"),
    75  				cty.True,
    76  			}),
    77  			[]interface{}{
    78  				"foo",
    79  				true,
    80  			},
    81  		},
    82  		{
    83  			cty.NullVal(cty.String),
    84  			nil,
    85  		},
    86  		{
    87  			cty.UnknownVal(cty.String),
    88  			hcl2helper.UnknownVariableValue,
    89  		},
    90  	}
    91  
    92  	for _, test := range tests {
    93  		t.Run(fmt.Sprintf("%#v", test.Input), func(t *testing.T) {
    94  			got := ConfigValueFromHCL2(test.Input)
    95  			if !reflect.DeepEqual(got, test.Want) {
    96  				t.Errorf("wrong result\ninput: %#v\ngot:   %#v\nwant:  %#v", test.Input, got, test.Want)
    97  			}
    98  		})
    99  	}
   100  }
   101  
   102  func TestWriteUnknownPlaceholderValues(t *testing.T) {
   103  	tests := []struct {
   104  		Name  string
   105  		Input cty.Value
   106  		Want  cty.Value
   107  	}{
   108  		{
   109  			Name:  "Unknown bool",
   110  			Input: cty.UnknownVal(cty.Bool),
   111  			Want:  cty.False,
   112  		},
   113  		{
   114  			Name:  "Unknown number",
   115  			Input: cty.UnknownVal(cty.Number),
   116  			Want:  cty.NumberIntVal(0),
   117  		},
   118  		{
   119  			Name:  "Unknown string",
   120  			Input: cty.UnknownVal(cty.String),
   121  			Want:  cty.StringVal("<unknown>"),
   122  		},
   123  		{
   124  			Name:  "Unknown object",
   125  			Input: cty.UnknownVal(cty.EmptyObject),
   126  			Want:  cty.EmptyObjectVal,
   127  		},
   128  		{
   129  			Name: "Object with unknown values",
   130  			Input: cty.ObjectVal(map[string]cty.Value{
   131  				"name":    cty.UnknownVal(cty.String),
   132  				"address": cty.UnknownVal(cty.EmptyObject),
   133  			}),
   134  			Want: cty.ObjectVal(map[string]cty.Value{
   135  				"name":    cty.StringVal("<unknown>"),
   136  				"address": cty.EmptyObjectVal,
   137  			}),
   138  		},
   139  		{
   140  			Name:  "Empty object",
   141  			Input: cty.ObjectVal(map[string]cty.Value{}),
   142  			Want:  cty.EmptyObjectVal,
   143  		},
   144  		{
   145  			Name:  "Unknown tuple",
   146  			Input: cty.UnknownVal(cty.EmptyTuple),
   147  			Want:  cty.EmptyTupleVal,
   148  		},
   149  		{
   150  			Name: "Tuple with unknown values",
   151  			Input: cty.TupleVal([]cty.Value{
   152  				cty.UnknownVal(cty.String),
   153  				cty.UnknownVal(cty.Bool),
   154  			}),
   155  			Want: cty.TupleVal([]cty.Value{
   156  				cty.StringVal("<unknown>"),
   157  				cty.False,
   158  			}),
   159  		},
   160  		{
   161  			Name:  "Empty tuple",
   162  			Input: cty.TupleVal([]cty.Value{}),
   163  			Want:  cty.EmptyTupleVal,
   164  		},
   165  		{
   166  			Name:  "Unknown list",
   167  			Input: cty.UnknownVal(cty.List(cty.String)),
   168  			Want:  cty.ListValEmpty(cty.String),
   169  		},
   170  		{
   171  			Name: "List with unknown values",
   172  			Input: cty.ListVal([]cty.Value{
   173  				cty.UnknownVal(cty.String),
   174  			}),
   175  			Want: cty.ListVal([]cty.Value{
   176  				cty.StringVal("<unknown>"),
   177  			}),
   178  		},
   179  		{
   180  			Name:  "Empty list",
   181  			Input: cty.ListValEmpty(cty.String),
   182  			Want:  cty.ListValEmpty(cty.String),
   183  		},
   184  		{
   185  			Name:  "Unknown set",
   186  			Input: cty.UnknownVal(cty.Set(cty.String)),
   187  			Want:  cty.SetValEmpty(cty.String),
   188  		},
   189  		{
   190  			Name: "Set with unknown values",
   191  			Input: cty.SetVal([]cty.Value{
   192  				cty.UnknownVal(cty.String),
   193  			}),
   194  			Want: cty.SetVal([]cty.Value{
   195  				cty.StringVal("<unknown>"),
   196  			}),
   197  		},
   198  		{
   199  			Name:  "Empty Set",
   200  			Input: cty.SetValEmpty(cty.String),
   201  			Want:  cty.SetValEmpty(cty.String),
   202  		},
   203  		{
   204  			Name:  "Unknown map",
   205  			Input: cty.UnknownVal(cty.Map(cty.String)),
   206  			Want:  cty.MapValEmpty(cty.String),
   207  		},
   208  		{
   209  			Name: "Map with unknown values",
   210  			Input: cty.MapVal(map[string]cty.Value{
   211  				"name": cty.UnknownVal(cty.String),
   212  			}),
   213  			Want: cty.MapVal(map[string]cty.Value{
   214  				"name": cty.StringVal("<unknown>"),
   215  			}),
   216  		},
   217  		{
   218  			Name:  "Empty Map",
   219  			Input: cty.MapValEmpty(cty.String),
   220  			Want:  cty.MapValEmpty(cty.String),
   221  		},
   222  		{
   223  			Name:  "Null val",
   224  			Input: cty.NullVal(cty.String),
   225  			Want:  cty.NullVal(cty.String),
   226  		},
   227  	}
   228  
   229  	for _, test := range tests {
   230  		t.Run(t.Name(), func(t *testing.T) {
   231  			got := WriteUnknownPlaceholderValues(test.Input)
   232  			if got.Equals(test.Want).False() {
   233  				t.Errorf("wrong result\ninput: %#v\ngot:   %#v\nwant:  %#v", test.Input, got, test.Want)
   234  			}
   235  		})
   236  	}
   237  }