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 }