summaryrefslogtreecommitdiff
path: root/ops_test.go
diff options
context:
space:
mode:
authorJames Bardin <j.bardin@gmail.com>2024-09-24 12:45:20 -0400
committerJames Bardin <j.bardin@gmail.com>2024-09-24 12:55:38 -0400
commite2f43f4c9722c9a1e7c23b0af4c41ed9f7cab2c5 (patch)
tree21d1fba63775ee85165951f8d37acb8bfe9971b1 /ops_test.go
parentbf546973d01a1ec4a306cbcc789bd86ea70e44be (diff)
Preserve marks when traversing unknown values
When traversing an unknown value or a DynamicVal, the marks from that initial value must be preserved for HCL Index and GetAttr operations. This mirrors the behavior of GetAttr and Index when used directly the underlying cty values.
Diffstat (limited to 'ops_test.go')
-rw-r--r--ops_test.go109
1 files changed, 108 insertions, 1 deletions
diff --git a/ops_test.go b/ops_test.go
index 7aabd7a..b7b35ca 100644
--- a/ops_test.go
+++ b/ops_test.go
@@ -249,6 +249,113 @@ func TestApplyPath(t *testing.T) {
cty.NilVal,
`Attempt to get attribute from null value: This value is null, so it does not have any attributes.`,
},
+
+ // Marks should be retained during index and getattr ops, even when
+ // types and values are unknown. This reflects the same behavior when
+ // using cty to directly call GetAttr and Index methods.
+ {
+ cty.DynamicVal.Mark("marked"),
+ (cty.Path)(nil).GetAttr("foo"),
+ cty.DynamicVal.Mark("marked"),
+ ``,
+ },
+ {
+ cty.ObjectVal(map[string]cty.Value{
+ "foo": cty.StringVal("should be marked"),
+ }).Mark("marked"),
+ (cty.Path)(nil).GetAttr("foo"),
+ cty.StringVal("should be marked").Mark("marked"),
+ ``,
+ },
+ {
+ cty.UnknownVal(cty.Object(map[string]cty.Type{
+ "foo": cty.DynamicPseudoType,
+ })).Mark("marked"),
+ (cty.Path)(nil).GetAttr("foo"),
+ cty.DynamicVal.Mark("marked"),
+ ``,
+ },
+ {
+ cty.DynamicVal.Mark("marked"),
+ (cty.Path)(nil).Index(cty.StringVal("foo")),
+ cty.DynamicVal.Mark("marked"),
+ ``,
+ },
+ {
+ cty.ObjectVal(map[string]cty.Value{
+ "foo": cty.StringVal("should be marked"),
+ }).Mark("marked"),
+ (cty.Path)(nil).Index(cty.StringVal("foo")),
+ cty.StringVal("should be marked").Mark("marked"),
+ ``,
+ },
+ {
+ cty.UnknownVal(cty.Object(map[string]cty.Type{
+ "foo": cty.DynamicPseudoType,
+ })).Mark("marked"),
+ (cty.Path)(nil).Index(cty.StringVal("foo")),
+ cty.DynamicVal.Mark("marked"),
+ ``,
+ },
+ {
+ cty.DynamicVal.Mark("marked"),
+ (cty.Path)(nil).Index(cty.NumberIntVal(0)),
+ cty.DynamicVal.Mark("marked"),
+ ``,
+ },
+ {
+ cty.ListVal([]cty.Value{cty.StringVal("should be marked")}).Mark("marked"),
+ (cty.Path)(nil).Index(cty.NumberIntVal(0)),
+ cty.StringVal("should be marked").Mark("marked"),
+ ``,
+ },
+ {
+ cty.UnknownVal(cty.List(cty.String)).Mark("marked"),
+ (cty.Path)(nil).Index(cty.NumberIntVal(0)),
+ cty.UnknownVal(cty.String).Mark("marked"),
+ ``,
+ },
+
+ {
+ cty.DynamicVal.Mark("marked"),
+ (cty.Path)(nil).Index(cty.UnknownVal(cty.String)),
+ cty.DynamicVal.Mark("marked"),
+ ``,
+ },
+ {
+ cty.ObjectVal(map[string]cty.Value{
+ "foo": cty.StringVal("should be marked"),
+ }).Mark("marked"),
+ (cty.Path)(nil).Index(cty.UnknownVal(cty.String)),
+ cty.DynamicVal.Mark("marked"),
+ ``,
+ },
+ {
+ cty.UnknownVal(cty.Object(map[string]cty.Type{
+ "foo": cty.DynamicPseudoType,
+ })).Mark("marked"),
+ (cty.Path)(nil).Index(cty.UnknownVal(cty.String)),
+ cty.DynamicVal.Mark("marked"),
+ ``,
+ },
+ {
+ cty.DynamicVal.Mark("marked"),
+ (cty.Path)(nil).Index(cty.UnknownVal(cty.Number)),
+ cty.DynamicVal.Mark("marked"),
+ ``,
+ },
+ {
+ cty.ListVal([]cty.Value{cty.StringVal("should be marked")}).Mark("marked"),
+ (cty.Path)(nil).Index(cty.UnknownVal(cty.Number)),
+ cty.UnknownVal(cty.String).Mark("marked"),
+ ``,
+ },
+ {
+ cty.UnknownVal(cty.List(cty.String)).Mark("marked"),
+ (cty.Path)(nil).Index(cty.UnknownVal(cty.Number)),
+ cty.UnknownVal(cty.String).Mark("marked"),
+ ``,
+ },
}
for _, test := range tests {
@@ -257,7 +364,7 @@ func TestApplyPath(t *testing.T) {
t.Logf("testing ApplyPath\nstart: %#v\npath: %#v", test.Start, test.Path)
for _, diag := range diags {
- t.Logf(diag.Error())
+ t.Log(diag.Error())
}
if test.WantErr != "" {