github.com/terramate-io/tf@v0.0.0-20230830114523-fce866b4dfcd/configs/configschema/marks_test.go (about)

     1  // Copyright (c) HashiCorp, Inc.
     2  // SPDX-License-Identifier: MPL-2.0
     3  
     4  package configschema
     5  
     6  import (
     7  	"testing"
     8  
     9  	"github.com/terramate-io/tf/lang/marks"
    10  	"github.com/zclconf/go-cty/cty"
    11  )
    12  
    13  func TestBlockValueMarks(t *testing.T) {
    14  	schema := &Block{
    15  		Attributes: map[string]*Attribute{
    16  			"unsensitive": {
    17  				Type:     cty.String,
    18  				Optional: true,
    19  			},
    20  			"sensitive": {
    21  				Type:      cty.String,
    22  				Sensitive: true,
    23  			},
    24  			"nested": {
    25  				NestedType: &Object{
    26  					Attributes: map[string]*Attribute{
    27  						"boop": {
    28  							Type: cty.String,
    29  						},
    30  						"honk": {
    31  							Type:      cty.String,
    32  							Sensitive: true,
    33  						},
    34  					},
    35  					Nesting: NestingList,
    36  				},
    37  			},
    38  		},
    39  
    40  		BlockTypes: map[string]*NestedBlock{
    41  			"list": {
    42  				Nesting: NestingList,
    43  				Block: Block{
    44  					Attributes: map[string]*Attribute{
    45  						"unsensitive": {
    46  							Type:     cty.String,
    47  							Optional: true,
    48  						},
    49  						"sensitive": {
    50  							Type:      cty.String,
    51  							Sensitive: true,
    52  						},
    53  					},
    54  				},
    55  			},
    56  		},
    57  	}
    58  
    59  	testCases := map[string]struct {
    60  		given  cty.Value
    61  		expect cty.Value
    62  	}{
    63  		"unknown object": {
    64  			cty.UnknownVal(schema.ImpliedType()),
    65  			cty.UnknownVal(schema.ImpliedType()),
    66  		},
    67  		"null object": {
    68  			cty.NullVal(schema.ImpliedType()),
    69  			cty.NullVal(schema.ImpliedType()),
    70  		},
    71  		"object with unknown attributes and blocks": {
    72  			cty.ObjectVal(map[string]cty.Value{
    73  				"sensitive":   cty.UnknownVal(cty.String),
    74  				"unsensitive": cty.UnknownVal(cty.String),
    75  				"nested": cty.NullVal(cty.List(cty.Object(map[string]cty.Type{
    76  					"boop": cty.String,
    77  					"honk": cty.String,
    78  				}))),
    79  				"list": cty.UnknownVal(schema.BlockTypes["list"].ImpliedType()),
    80  			}),
    81  			cty.ObjectVal(map[string]cty.Value{
    82  				"sensitive":   cty.UnknownVal(cty.String).Mark(marks.Sensitive),
    83  				"unsensitive": cty.UnknownVal(cty.String),
    84  				"nested": cty.NullVal(cty.List(cty.Object(map[string]cty.Type{
    85  					"boop": cty.String,
    86  					"honk": cty.String,
    87  				}))),
    88  				"list": cty.UnknownVal(schema.BlockTypes["list"].ImpliedType()),
    89  			}),
    90  		},
    91  		"object with block value": {
    92  			cty.ObjectVal(map[string]cty.Value{
    93  				"sensitive":   cty.NullVal(cty.String),
    94  				"unsensitive": cty.UnknownVal(cty.String),
    95  				"nested": cty.NullVal(cty.List(cty.Object(map[string]cty.Type{
    96  					"boop": cty.String,
    97  					"honk": cty.String,
    98  				}))),
    99  				"list": cty.ListVal([]cty.Value{
   100  					cty.ObjectVal(map[string]cty.Value{
   101  						"sensitive":   cty.UnknownVal(cty.String),
   102  						"unsensitive": cty.UnknownVal(cty.String),
   103  					}),
   104  					cty.ObjectVal(map[string]cty.Value{
   105  						"sensitive":   cty.NullVal(cty.String),
   106  						"unsensitive": cty.NullVal(cty.String),
   107  					}),
   108  				}),
   109  			}),
   110  			cty.ObjectVal(map[string]cty.Value{
   111  				"sensitive":   cty.NullVal(cty.String).Mark(marks.Sensitive),
   112  				"unsensitive": cty.UnknownVal(cty.String),
   113  				"nested": cty.NullVal(cty.List(cty.Object(map[string]cty.Type{
   114  					"boop": cty.String,
   115  					"honk": cty.String,
   116  				}))),
   117  				"list": cty.ListVal([]cty.Value{
   118  					cty.ObjectVal(map[string]cty.Value{
   119  						"sensitive":   cty.UnknownVal(cty.String).Mark(marks.Sensitive),
   120  						"unsensitive": cty.UnknownVal(cty.String),
   121  					}),
   122  					cty.ObjectVal(map[string]cty.Value{
   123  						"sensitive":   cty.NullVal(cty.String).Mark(marks.Sensitive),
   124  						"unsensitive": cty.NullVal(cty.String),
   125  					}),
   126  				}),
   127  			}),
   128  		},
   129  		"object with known values and nested attribute": {
   130  			cty.ObjectVal(map[string]cty.Value{
   131  				"sensitive":   cty.StringVal("foo"),
   132  				"unsensitive": cty.StringVal("bar"),
   133  				"nested": cty.ListVal([]cty.Value{
   134  					cty.ObjectVal(map[string]cty.Value{
   135  						"boop": cty.StringVal("foo"),
   136  						"honk": cty.StringVal("bar"),
   137  					}),
   138  					cty.ObjectVal(map[string]cty.Value{
   139  						"boop": cty.NullVal(cty.String),
   140  						"honk": cty.NullVal(cty.String),
   141  					}),
   142  					cty.ObjectVal(map[string]cty.Value{
   143  						"boop": cty.UnknownVal(cty.String),
   144  						"honk": cty.UnknownVal(cty.String),
   145  					}),
   146  				}),
   147  				"list": cty.NullVal(cty.List(cty.Object(map[string]cty.Type{
   148  					"sensitive":   cty.String,
   149  					"unsensitive": cty.String,
   150  				}))),
   151  			}),
   152  			cty.ObjectVal(map[string]cty.Value{
   153  				"sensitive":   cty.StringVal("foo").Mark(marks.Sensitive),
   154  				"unsensitive": cty.StringVal("bar"),
   155  				"nested": cty.ListVal([]cty.Value{
   156  					cty.ObjectVal(map[string]cty.Value{
   157  						"boop": cty.StringVal("foo"),
   158  						"honk": cty.StringVal("bar").Mark(marks.Sensitive),
   159  					}),
   160  					cty.ObjectVal(map[string]cty.Value{
   161  						"boop": cty.NullVal(cty.String),
   162  						"honk": cty.NullVal(cty.String).Mark(marks.Sensitive),
   163  					}),
   164  					cty.ObjectVal(map[string]cty.Value{
   165  						"boop": cty.UnknownVal(cty.String),
   166  						"honk": cty.UnknownVal(cty.String).Mark(marks.Sensitive),
   167  					}),
   168  				}),
   169  				"list": cty.NullVal(cty.List(cty.Object(map[string]cty.Type{
   170  					"sensitive":   cty.String,
   171  					"unsensitive": cty.String,
   172  				}))),
   173  			}),
   174  		},
   175  	}
   176  
   177  	for name, tc := range testCases {
   178  		t.Run(name, func(t *testing.T) {
   179  			got := tc.given.MarkWithPaths(schema.ValueMarks(tc.given, nil))
   180  			if !got.RawEquals(tc.expect) {
   181  				t.Fatalf("\nexpected: %#v\ngot:      %#v\n", tc.expect, got)
   182  			}
   183  		})
   184  	}
   185  }