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 }