| // Copyright IBM Corp. 2014, 2026 | |
| // SPDX-License-Identifier: BUSL-1.1 | |
| package plans | |
| import ( | |
| "fmt" | |
| "testing" | |
| "github.com/zclconf/go-cty/cty" | |
| "github.com/hashicorp/terraform/internal/configs/configschema" | |
| "github.com/hashicorp/terraform/internal/lang/marks" | |
| "github.com/hashicorp/terraform/internal/providers" | |
| ) | |
| func TestChangeEncodeSensitive(t *testing.T) { | |
| testVals := []struct { | |
| val cty.Value | |
| schema providers.Schema | |
| }{ | |
| { | |
| val: cty.ObjectVal(map[string]cty.Value{ | |
| "ding": cty.StringVal("dong").Mark(marks.Sensitive), | |
| }), | |
| schema: providers.Schema{ | |
| Body: &configschema.Block{ | |
| Attributes: map[string]*configschema.Attribute{ | |
| "ding": { | |
| Type: cty.String, | |
| Required: true, | |
| }, | |
| }, | |
| }, | |
| }, | |
| }, | |
| { | |
| val: cty.ObjectVal(map[string]cty.Value{ | |
| "ding": cty.StringVal("bleep").Mark(marks.Sensitive), | |
| }), | |
| schema: providers.Schema{ | |
| Body: &configschema.Block{ | |
| Attributes: map[string]*configschema.Attribute{ | |
| "ding": { | |
| Type: cty.String, | |
| Required: true, | |
| }, | |
| }, | |
| }, | |
| }, | |
| }, | |
| { | |
| val: cty.ObjectVal(map[string]cty.Value{ | |
| "ding": cty.ListVal([]cty.Value{cty.UnknownVal(cty.String).Mark(marks.Sensitive)}), | |
| }), | |
| schema: providers.Schema{ | |
| Body: &configschema.Block{ | |
| Attributes: map[string]*configschema.Attribute{ | |
| "ding": { | |
| Type: cty.List(cty.String), | |
| Required: false, | |
| }, | |
| }, | |
| }, | |
| }, | |
| }, | |
| } | |
| for _, v := range testVals { | |
| t.Run(fmt.Sprintf("%#v", v), func(t *testing.T) { | |
| change := Change{ | |
| Before: cty.NullVal(v.val.Type()), | |
| After: v.val, | |
| } | |
| encoded, err := change.Encode(&v.schema) | |
| if err != nil { | |
| t.Fatal(err) | |
| } | |
| decoded, err := encoded.Decode(&v.schema) | |
| if err != nil { | |
| t.Fatal(err) | |
| } | |
| if !v.val.RawEquals(decoded.After) { | |
| t.Fatalf("%#v != %#v\n", decoded.After, v) | |
| } | |
| }) | |
| } | |
| } | |
| // make sure we get a valid value back even when faced with an error | |
| func TestChangeEncodeError(t *testing.T) { | |
| changes := &Changes{ | |
| Outputs: []*OutputChange{ | |
| { | |
| // Missing Addr | |
| Change: Change{ | |
| Before: cty.NullVal(cty.DynamicPseudoType), | |
| // can't encode a marked value | |
| After: cty.StringVal("test").Mark("should not be here"), | |
| }, | |
| }, | |
| }, | |
| } | |
| // no resources so we can get by with no schemas | |
| changesSrc, err := changes.Encode(nil) | |
| if err == nil { | |
| t.Fatal("expected error") | |
| } | |
| if changesSrc == nil { | |
| t.Fatal("changesSrc should not be nil") | |
| } | |
| } |