github.com/kanishk98/terraform@v1.3.0-dev.0.20220917174235-661ca8088a6a/internal/configs/configschema/marks_test.go (about)

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